mirror of
https://github.com/sysadminsmedia/homebox.git
synced 2026-01-02 02:57:22 +01:00
Compare commits
51 Commits
v0.15.0
...
tonya/lang
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
646a80f494 | ||
|
|
1268fd90ba | ||
|
|
ec5b6bb8ff | ||
|
|
c0860fc9ca | ||
|
|
8d93ab3d7f | ||
|
|
d39d109031 | ||
|
|
1d5b62fdf3 | ||
|
|
a9616911f5 | ||
|
|
3eb5ece34d | ||
|
|
77246ca57b | ||
|
|
087a328e83 | ||
|
|
8a6df8a69b | ||
|
|
c2546f06d4 | ||
|
|
3a4c78ed86 | ||
|
|
ed7670ac67 | ||
|
|
2cd50435b5 | ||
|
|
9b72419e6b | ||
|
|
a1e66854cd | ||
|
|
ab756aaa56 | ||
|
|
d45c8b2b2d | ||
|
|
f26b5e1190 | ||
|
|
8bfa930cf0 | ||
|
|
52f9306e98 | ||
|
|
483934bd5e | ||
|
|
de7ef70d40 | ||
|
|
1e020f7fae | ||
|
|
0d6ec9c427 | ||
|
|
e32683fb28 | ||
|
|
67c77a7d91 | ||
|
|
55acfa54f5 | ||
|
|
7f742738fa | ||
|
|
888973e2cb | ||
|
|
65b247573e | ||
|
|
8f255ccfd4 | ||
|
|
c9ed50afad | ||
|
|
3fd14aac47 | ||
|
|
ed780e292b | ||
|
|
c6158e7c9e | ||
|
|
5d3698d0d8 | ||
|
|
a70bb227a9 | ||
|
|
908bfb530e | ||
|
|
738fe6db03 | ||
|
|
733ccb51c3 | ||
|
|
ed3d106289 | ||
|
|
333bca85f8 | ||
|
|
1ebc3d9c27 | ||
|
|
c298b651b6 | ||
|
|
d8260b9988 | ||
|
|
d0a69c8446 | ||
|
|
f3388b8449 | ||
|
|
c94eb4e183 |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -1 +1 @@
|
||||
github: [tankerkiller125,katosdev]
|
||||
github: [tankerkiller125,katosdev,tonyaellie]
|
||||
|
||||
1
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
1
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -3,6 +3,7 @@ name: "Bug Report"
|
||||
description: "Submit a bug report for the current release"
|
||||
labels: ["🕷️ bug"]
|
||||
projects: ["sysadminsmedia/2"]
|
||||
type: "Bug"
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
|
||||
1
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
1
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -3,6 +3,7 @@ name: "Feature Request"
|
||||
description: "Submit a feature request for the current release"
|
||||
labels: ["⬆️ enhancement"]
|
||||
projects: ["sysadminsmedia/2"]
|
||||
type: "Enhancement"
|
||||
body:
|
||||
- type: textarea
|
||||
id: problem-statement
|
||||
|
||||
105
.github/workflows/docker-publish-arm.yaml
vendored
Normal file
105
.github/workflows/docker-publish-arm.yaml
vendored
Normal file
@@ -0,0 +1,105 @@
|
||||
name: Docker publish ARM
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '00 0 * * *'
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
paths:
|
||||
- 'backend/**'
|
||||
- 'frontend/**'
|
||||
- 'Dockerfile'
|
||||
- 'Dockerfile.rootless'
|
||||
- '.dockerignore'
|
||||
- '.github/workflows'
|
||||
# Publish semver tags as releases.
|
||||
tags: [ 'v*.*.*' ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
paths:
|
||||
- 'backend/**'
|
||||
- 'frontend/**'
|
||||
- 'Dockerfile'
|
||||
- 'Dockerfile.rootless'
|
||||
- '.dockerignore'
|
||||
- '.github/workflows'
|
||||
|
||||
env:
|
||||
# Use docker.io for Docker Hub if empty
|
||||
REGISTRY: ghcr.io
|
||||
# github.repository as <account>/<repo>
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
attestations: write
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
# Step 1: Checkout repository
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Step 2: Set up Buildx without specifying driver
|
||||
# Let it use default settings to avoid the 'no remote endpoint' issue
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.0.0
|
||||
with:
|
||||
install: true # Ensure Buildx is installed and set up properly
|
||||
use: true # Use Buildx instance directly for this job
|
||||
|
||||
# Step 3: Login against Docker registry except on PR
|
||||
- name: Log into registry ${{ env.REGISTRY }}
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3.0.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Step 4: Extract metadata for Docker images
|
||||
- name: Extract Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5.0.0
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
type=schedule,pattern=nightly
|
||||
flavor: |
|
||||
suffix=-arm,onlatest=true
|
||||
|
||||
# Step 5: Build and push the Docker image
|
||||
- name: Build and push Docker image
|
||||
id: build-and-push
|
||||
uses: docker/build-push-action@v5.0.0
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: linux/arm64,linux/arm/v7
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
build-args: |
|
||||
VERSION=${{ github.ref_name }}
|
||||
COMMIT=${{ github.sha }}
|
||||
|
||||
# Step 6: Attest built image to prove build provenance
|
||||
- name: Attest
|
||||
uses: actions/attest-build-provenance@v1
|
||||
id: attest
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
with:
|
||||
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
subject-digest: ${{ steps.build-and-push.outputs.digest }}
|
||||
push-to-registry: true
|
||||
104
.github/workflows/docker-publish-rootless-arm.yaml
vendored
Normal file
104
.github/workflows/docker-publish-rootless-arm.yaml
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
name: Docker publish rootless ARM
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '00 0 * * *'
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
paths:
|
||||
- 'backend/**'
|
||||
- 'frontend/**'
|
||||
- 'Dockerfile'
|
||||
- 'Dockerfile.rootless'
|
||||
- '.dockerignore'
|
||||
- '.github/workflows'
|
||||
# Publish semver tags as releases.
|
||||
tags: [ 'v*.*.*' ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
paths:
|
||||
- 'backend/**'
|
||||
- 'frontend/**'
|
||||
- 'Dockerfile'
|
||||
- 'Dockerfile.rootless'
|
||||
- '.dockerignore'
|
||||
- '.github/workflows'
|
||||
|
||||
env:
|
||||
# Use docker.io for Docker Hub if empty
|
||||
REGISTRY: ghcr.io
|
||||
# github.repository as <account>/<repo>
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
build-rootless:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
attestations: write
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
# Step 1: Checkout repository
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Step 2: Set up Buildx without specifying driver
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.0.0
|
||||
with:
|
||||
install: true # Ensure Buildx is installed and set up properly
|
||||
use: true # Use Buildx instance directly for this job
|
||||
|
||||
# Step 3: Login to Docker registry except on PR
|
||||
- name: Log into registry ${{ env.REGISTRY }}
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3.0.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Step 4: Extract metadata for Docker images
|
||||
- name: Extract Docker metadata
|
||||
id: metadata
|
||||
uses: docker/metadata-action@v5.0.0
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
type=schedule,pattern=nightly
|
||||
flavor: |
|
||||
suffix=-rootless-arm,onlatest=true
|
||||
|
||||
# Step 5: Build and push the Docker image
|
||||
- name: Build and push Docker image
|
||||
id: build-and-push
|
||||
uses: docker/build-push-action@v5.0.0
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.metadata.outputs.tags }}
|
||||
labels: ${{ steps.metadata.outputs.labels }}
|
||||
platforms: linux/arm64,linux/arm/v7
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
build-args: |
|
||||
VERSION=${{ github.ref_name }}
|
||||
COMMIT=${{ github.sha }}
|
||||
|
||||
# Step 6: Attest built image to prove build provenance
|
||||
- name: Attest
|
||||
uses: actions/attest-build-provenance@v1
|
||||
id: attest
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
with:
|
||||
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
subject-digest: ${{ steps.build-and-push.outputs.digest }}
|
||||
push-to-registry: true
|
||||
@@ -91,7 +91,7 @@ jobs:
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.metadata.outputs.tags }}
|
||||
labels: ${{ steps.metadata.outputs.labels }}
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
build-args: |
|
||||
|
||||
2
.github/workflows/docker-publish.yaml
vendored
2
.github/workflows/docker-publish.yaml
vendored
@@ -88,7 +88,7 @@ jobs:
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
build-args: |
|
||||
|
||||
4
.github/workflows/partial-frontend.yaml
vendored
4
.github/workflows/partial-frontend.yaml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
|
||||
- uses: pnpm/action-setup@v3.0.0
|
||||
with:
|
||||
version: 6.0.2
|
||||
version: 9.12.2
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --shamefully-hoist
|
||||
@@ -54,7 +54,7 @@ jobs:
|
||||
|
||||
- uses: pnpm/action-setup@v3.0.0
|
||||
with:
|
||||
version: 6.0.2
|
||||
version: 9.12.2
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
76
Dockerfile
76
Dockerfile
@@ -1,69 +1,91 @@
|
||||
# Node dependencies
|
||||
FROM node:18-alpine AS frontend-dependencies
|
||||
# Node dependencies stage
|
||||
FROM --platform=$TARGETPLATFORM node:18-alpine AS frontend-dependencies
|
||||
WORKDIR /app
|
||||
|
||||
# Install pnpm globally (caching layer)
|
||||
RUN npm install -g pnpm
|
||||
|
||||
# Copy package.json and lockfile to leverage caching
|
||||
COPY frontend/package.json frontend/pnpm-lock.yaml ./
|
||||
RUN pnpm install --frozen-lockfile --shamefully-hoist
|
||||
|
||||
# Build Nuxt
|
||||
FROM node:18-alpine AS frontend-builder
|
||||
WORKDIR /app
|
||||
# Build Nuxt (frontend) stage
|
||||
FROM --platform=$TARGETPLATFORM node:18-alpine AS frontend-builder
|
||||
WORKDIR /app
|
||||
|
||||
# Install pnpm globally again (it can reuse the cache if not changed)
|
||||
RUN npm install -g pnpm
|
||||
COPY frontend .
|
||||
|
||||
# Copy over source files and node_modules from dependencies stage
|
||||
COPY frontend .
|
||||
COPY --from=frontend-dependencies /app/node_modules ./node_modules
|
||||
RUN pnpm build
|
||||
|
||||
FROM golang:alpine AS builder-dependencies
|
||||
# Go dependencies stage
|
||||
FROM --platform=$TARGETPLATFORM golang:alpine AS builder-dependencies
|
||||
WORKDIR /go/src/app
|
||||
COPY ./backend .
|
||||
|
||||
# Copy go.mod and go.sum for better caching
|
||||
COPY ./backend/go.mod ./backend/go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
# Build API
|
||||
FROM golang:alpine AS builder
|
||||
# Build API stage
|
||||
FROM --platform=$TARGETPLATFORM golang:alpine AS builder
|
||||
ARG BUILD_TIME
|
||||
ARG COMMIT
|
||||
ARG VERSION
|
||||
|
||||
# Install necessary build tools
|
||||
RUN apk update && \
|
||||
apk upgrade && \
|
||||
apk add --update git build-base gcc g++
|
||||
apk add --no-cache git build-base gcc g++
|
||||
|
||||
WORKDIR /go/src/app
|
||||
|
||||
# Copy Go modules (from dependencies stage) and source code
|
||||
COPY --from=builder-dependencies /go/pkg/mod /go/pkg/mod
|
||||
COPY ./backend .
|
||||
|
||||
# Clear old public files and copy new ones from frontend build
|
||||
RUN rm -rf ./app/api/public
|
||||
COPY --from=frontend-builder /app/.output/public ./app/api/static/public
|
||||
COPY --from=builder-dependencies /go/pkg/mod /go/pkg/mod
|
||||
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||
|
||||
# Use cache for Go build artifacts
|
||||
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||
CGO_ENABLED=0 GOOS=linux go build \
|
||||
-ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \
|
||||
-ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \
|
||||
-o /go/bin/api \
|
||||
-v ./app/api/*.go
|
||||
|
||||
FROM gcr.io/distroless/java:latest
|
||||
|
||||
# Production Stage
|
||||
FROM alpine:latest
|
||||
|
||||
# Production stage
|
||||
FROM --platform=$TARGETPLATFORM alpine:latest
|
||||
ENV HBOX_MODE=production
|
||||
ENV HBOX_STORAGE_DATA=/data/
|
||||
ENV HBOX_STORAGE_SQLITE_URL=/data/homebox.db?_pragma=busy_timeout=2000&_pragma=journal_mode=WAL&_fk=1
|
||||
|
||||
RUN apk --no-cache add ca-certificates
|
||||
# Install necessary runtime dependencies
|
||||
RUN apk --no-cache add ca-certificates wget
|
||||
|
||||
# Create application directory and copy over built Go binary
|
||||
RUN mkdir /app
|
||||
COPY --from=builder /go/bin/api /app
|
||||
|
||||
RUN chmod +x /app/api
|
||||
RUN apk add --no-cache wget
|
||||
|
||||
# Labels and configuration for the final image
|
||||
LABEL Name=homebox Version=0.0.1
|
||||
LABEL org.opencontainers.image.source="https://github.com/sysadminsmedia/homebox"
|
||||
|
||||
# Expose necessary ports
|
||||
EXPOSE 7745
|
||||
WORKDIR /app
|
||||
HEALTHCHECK --interval=30s \
|
||||
--timeout=5s \
|
||||
--start-period=5s \
|
||||
--retries=3 \
|
||||
CMD [ "/usr/bin/wget", "--no-verbose", "--tries=1", "-O -", "http://localhost:7745/api/v1/status" ]
|
||||
|
||||
# Healthcheck configuration
|
||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
|
||||
CMD [ "wget", "--no-verbose", "--tries=1", "-O", "-", "http://localhost:7745/api/v1/status" ]
|
||||
|
||||
# Persist volume
|
||||
VOLUME [ "/data" ]
|
||||
|
||||
# Entrypoint and CMD
|
||||
ENTRYPOINT [ "/app/api" ]
|
||||
CMD [ "/data/config.yml" ]
|
||||
|
||||
@@ -7,15 +7,15 @@ RUN pnpm install --frozen-lockfile --shamefully-hoist
|
||||
|
||||
# Build Nuxt
|
||||
FROM node:18-alpine AS frontend-builder
|
||||
WORKDIR /app
|
||||
RUN npm install -g pnpm
|
||||
COPY frontend .
|
||||
WORKDIR /app
|
||||
COPY frontend ./
|
||||
COPY --from=frontend-dependencies /app/node_modules ./node_modules
|
||||
RUN pnpm build
|
||||
|
||||
# Build Go dependencies
|
||||
FROM golang:alpine AS builder-dependencies
|
||||
WORKDIR /go/src/app
|
||||
COPY ./backend .
|
||||
COPY ./backend/go.mod ./backend/go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
# Build API
|
||||
@@ -23,48 +23,51 @@ FROM golang:alpine AS builder
|
||||
ARG BUILD_TIME
|
||||
ARG COMMIT
|
||||
ARG VERSION
|
||||
RUN apk update && \
|
||||
apk upgrade && \
|
||||
apk add --update git build-base gcc g++
|
||||
|
||||
RUN apk update && apk upgrade && apk add --no-cache git build-base gcc g++
|
||||
|
||||
WORKDIR /go/src/app
|
||||
COPY ./backend .
|
||||
RUN rm -rf ./app/api/public
|
||||
COPY --from=frontend-builder /app/.output/public ./app/api/static/public
|
||||
COPY --from=builder-dependencies /go/pkg/mod /go/pkg/mod
|
||||
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||
|
||||
# Use cache for Go build
|
||||
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||
CGO_ENABLED=0 GOOS=linux go build \
|
||||
-ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \
|
||||
-o /go/bin/api \
|
||||
-v ./app/api/*.go
|
||||
-ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \
|
||||
-o /go/bin/api ./app/api/*.go
|
||||
|
||||
FROM gcr.io/distroless/java:latest
|
||||
|
||||
# Production Stage
|
||||
# Production stage with distroless
|
||||
FROM gcr.io/distroless/static:latest
|
||||
|
||||
ENV HBOX_MODE=production
|
||||
ENV HBOX_STORAGE_DATA=/data/
|
||||
ENV HBOX_STORAGE_SQLITE_URL=/data/homebox.db?_fk=1
|
||||
|
||||
# Copy the binary and the (empty) /data dir and
|
||||
# change the ownership to the low-privileged user
|
||||
# Copy the binary and data directory, change ownership
|
||||
COPY --from=builder --chown=nonroot /go/bin/api /app
|
||||
COPY --from=builder --chown=nonroot /data /data
|
||||
|
||||
RUN apk add --no-cache wget
|
||||
# Add wget to the image
|
||||
# Note: If using distroless, this may not be applicable
|
||||
# as distroless images do not include package managers.
|
||||
# This line may be omitted if you're relying on another way to handle healthchecks.
|
||||
COPY --from=alpine:latest /bin/wget /usr/bin/wget
|
||||
|
||||
LABEL Name=homebox Version=0.0.1
|
||||
LABEL org.opencontainers.image.source="https://github.com/sysadminsmedia/homebox"
|
||||
EXPOSE 7745
|
||||
|
||||
HEALTHCHECK --interval=30s \
|
||||
--timeout=5s \
|
||||
--start-period=5s \
|
||||
--retries=3 \
|
||||
CMD [ "/usr/bin/wget", "--no-verbose", "--tries=1", "-O -", "http://localhost:7745/api/v1/status" ]
|
||||
VOLUME [ "/data" ]
|
||||
CMD ["/usr/bin/wget", "--no-verbose", "--tries=1", "-O", "-", "http://localhost:7745/api/v1/status"]
|
||||
|
||||
# Drop root and run as low-privileged user
|
||||
VOLUME ["/data"]
|
||||
|
||||
# Drop root and run as a low-privileged user
|
||||
USER nonroot
|
||||
ENTRYPOINT [ "/app" ]
|
||||
CMD [ "/data/config.yml" ]
|
||||
ENTRYPOINT ["/app"]
|
||||
CMD ["/data/config.yml"]
|
||||
|
||||
51
backend/app/api/handlers/v1/v1_ctrl_locales.go
Normal file
51
backend/app/api/handlers/v1/v1_ctrl_locales.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package v1
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/hay-kot/httpkit/errchain"
|
||||
"github.com/sysadminsmedia/homebox/backend/internal/core/services"
|
||||
"github.com/sysadminsmedia/homebox/backend/internal/data/repo"
|
||||
"github.com/sysadminsmedia/homebox/backend/internal/web/adapters"
|
||||
)
|
||||
|
||||
type Locales struct {
|
||||
Locales []string `json:"locales"`
|
||||
}
|
||||
|
||||
// HandleLocalesGetAll godoc
|
||||
//
|
||||
// @Summary Get All Locales
|
||||
// @Tags Locales
|
||||
// @Produce json
|
||||
// @Success 200 {object} []Locales
|
||||
// @Router /v1/locales [GET]
|
||||
// @Security Bearer
|
||||
func (ctrl *V1Controller) HandleLocalesGetAll() errchain.HandlerFunc {
|
||||
fn := func(r *http.Request) ([]Locales, error) {
|
||||
// TODO: get a list of locales from files
|
||||
return []Locales{}, nil
|
||||
}
|
||||
|
||||
return adapters.Command(fn, http.StatusOK)
|
||||
}
|
||||
|
||||
// HandleLocalesGet godoc
|
||||
//
|
||||
// @Summary Get Locale
|
||||
// @Tags Locales
|
||||
// @Produce json
|
||||
// @Param id path string true "Locale ID"
|
||||
// @Success 200 {object} interface{}
|
||||
// @Router /v1/locales/{id} [GET]
|
||||
// @Security Bearer
|
||||
func (ctrl *V1Controller) HandleLocalesGet() errchain.HandlerFunc {
|
||||
fn := func(r *http.Request, ID uuid.UUID) (interface{}, error) {
|
||||
// TODO: get the current locale
|
||||
return interface{}, nil
|
||||
}
|
||||
|
||||
return adapters.CommandID("id", fn, http.StatusOK)
|
||||
}
|
||||
@@ -254,6 +254,19 @@ func run(cfg *config.Config) error {
|
||||
}
|
||||
}))
|
||||
|
||||
// TODO: read from env var0 GOOS=linux go build
|
||||
if true {
|
||||
runner.AddPlugin(NewTask("locale-update", time.Duration(24)*time.Hour, func(ctx context.Context) {
|
||||
log.Debug().Msg("running locale update")
|
||||
err := app.services.BackgroundService.UpdateLocales(ctx)
|
||||
if err != nil {
|
||||
log.Error().
|
||||
Err(err).
|
||||
Msg("failed to update locales")
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
||||
if cfg.Debug.Enabled {
|
||||
runner.AddFunc("debug", func(ctx context.Context) error {
|
||||
debugserver := http.Server{
|
||||
|
||||
@@ -2217,8 +2217,7 @@ const docTemplate = `{
|
||||
"type": "string"
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"purchaseTime": {
|
||||
"description": "Purchase",
|
||||
@@ -2234,8 +2233,7 @@ const docTemplate = `{
|
||||
"type": "string"
|
||||
},
|
||||
"soldPrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"soldTime": {
|
||||
"description": "Sold",
|
||||
@@ -2323,8 +2321,7 @@ const docTemplate = `{
|
||||
"type": "string"
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"quantity": {
|
||||
"type": "integer"
|
||||
@@ -2347,6 +2344,9 @@ const docTemplate = `{
|
||||
},
|
||||
"repo.ItemUpdate": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"properties": {
|
||||
"archived": {
|
||||
"type": "boolean"
|
||||
@@ -2355,7 +2355,8 @@ const docTemplate = `{
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 1000
|
||||
},
|
||||
"fields": {
|
||||
"type": "array",
|
||||
@@ -2390,7 +2391,9 @@ const docTemplate = `{
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255,
|
||||
"minLength": 1
|
||||
},
|
||||
"notes": {
|
||||
"description": "Extras",
|
||||
@@ -2402,11 +2405,13 @@ const docTemplate = `{
|
||||
"x-omitempty": true
|
||||
},
|
||||
"purchaseFrom": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number",
|
||||
"x-nullable": true,
|
||||
"x-omitempty": true
|
||||
},
|
||||
"purchaseTime": {
|
||||
"description": "Purchase",
|
||||
@@ -2423,15 +2428,17 @@ const docTemplate = `{
|
||||
"type": "string"
|
||||
},
|
||||
"soldPrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number",
|
||||
"x-nullable": true,
|
||||
"x-omitempty": true
|
||||
},
|
||||
"soldTime": {
|
||||
"description": "Sold",
|
||||
"type": "string"
|
||||
},
|
||||
"soldTo": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255
|
||||
},
|
||||
"warrantyDetails": {
|
||||
"type": "string"
|
||||
@@ -2763,7 +2770,6 @@ const docTemplate = `{
|
||||
"type": "string"
|
||||
},
|
||||
"url": {
|
||||
"description": "URL field is not exposed to the client",
|
||||
"type": "string"
|
||||
},
|
||||
"userId": {
|
||||
|
||||
@@ -2210,8 +2210,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"purchaseTime": {
|
||||
"description": "Purchase",
|
||||
@@ -2227,8 +2226,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"soldPrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"soldTime": {
|
||||
"description": "Sold",
|
||||
@@ -2316,8 +2314,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"quantity": {
|
||||
"type": "integer"
|
||||
@@ -2340,6 +2337,9 @@
|
||||
},
|
||||
"repo.ItemUpdate": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"properties": {
|
||||
"archived": {
|
||||
"type": "boolean"
|
||||
@@ -2348,7 +2348,8 @@
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 1000
|
||||
},
|
||||
"fields": {
|
||||
"type": "array",
|
||||
@@ -2383,7 +2384,9 @@
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255,
|
||||
"minLength": 1
|
||||
},
|
||||
"notes": {
|
||||
"description": "Extras",
|
||||
@@ -2395,11 +2398,13 @@
|
||||
"x-omitempty": true
|
||||
},
|
||||
"purchaseFrom": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number",
|
||||
"x-nullable": true,
|
||||
"x-omitempty": true
|
||||
},
|
||||
"purchaseTime": {
|
||||
"description": "Purchase",
|
||||
@@ -2416,15 +2421,17 @@
|
||||
"type": "string"
|
||||
},
|
||||
"soldPrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number",
|
||||
"x-nullable": true,
|
||||
"x-omitempty": true
|
||||
},
|
||||
"soldTime": {
|
||||
"description": "Sold",
|
||||
"type": "string"
|
||||
},
|
||||
"soldTo": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255
|
||||
},
|
||||
"warrantyDetails": {
|
||||
"type": "string"
|
||||
@@ -2756,7 +2763,6 @@
|
||||
"type": "string"
|
||||
},
|
||||
"url": {
|
||||
"description": "URL field is not exposed to the client",
|
||||
"type": "string"
|
||||
},
|
||||
"userId": {
|
||||
|
||||
@@ -171,8 +171,7 @@ definitions:
|
||||
purchaseFrom:
|
||||
type: string
|
||||
purchasePrice:
|
||||
example: "0"
|
||||
type: string
|
||||
type: number
|
||||
purchaseTime:
|
||||
description: Purchase
|
||||
type: string
|
||||
@@ -183,8 +182,7 @@ definitions:
|
||||
soldNotes:
|
||||
type: string
|
||||
soldPrice:
|
||||
example: "0"
|
||||
type: string
|
||||
type: number
|
||||
soldTime:
|
||||
description: Sold
|
||||
type: string
|
||||
@@ -242,8 +240,7 @@ definitions:
|
||||
name:
|
||||
type: string
|
||||
purchasePrice:
|
||||
example: "0"
|
||||
type: string
|
||||
type: number
|
||||
quantity:
|
||||
type: integer
|
||||
updatedAt:
|
||||
@@ -264,6 +261,7 @@ definitions:
|
||||
assetId:
|
||||
type: string
|
||||
description:
|
||||
maxLength: 1000
|
||||
type: string
|
||||
fields:
|
||||
items:
|
||||
@@ -288,6 +286,8 @@ definitions:
|
||||
modelNumber:
|
||||
type: string
|
||||
name:
|
||||
maxLength: 255
|
||||
minLength: 1
|
||||
type: string
|
||||
notes:
|
||||
description: Extras
|
||||
@@ -297,10 +297,12 @@ definitions:
|
||||
x-nullable: true
|
||||
x-omitempty: true
|
||||
purchaseFrom:
|
||||
maxLength: 255
|
||||
type: string
|
||||
purchasePrice:
|
||||
example: "0"
|
||||
type: string
|
||||
type: number
|
||||
x-nullable: true
|
||||
x-omitempty: true
|
||||
purchaseTime:
|
||||
description: Purchase
|
||||
type: string
|
||||
@@ -312,17 +314,21 @@ definitions:
|
||||
soldNotes:
|
||||
type: string
|
||||
soldPrice:
|
||||
example: "0"
|
||||
type: string
|
||||
type: number
|
||||
x-nullable: true
|
||||
x-omitempty: true
|
||||
soldTime:
|
||||
description: Sold
|
||||
type: string
|
||||
soldTo:
|
||||
maxLength: 255
|
||||
type: string
|
||||
warrantyDetails:
|
||||
type: string
|
||||
warrantyExpires:
|
||||
type: string
|
||||
required:
|
||||
- name
|
||||
type: object
|
||||
repo.LabelCreate:
|
||||
properties:
|
||||
@@ -540,7 +546,6 @@ definitions:
|
||||
updatedAt:
|
||||
type: string
|
||||
url:
|
||||
description: URL field is not exposed to the client
|
||||
type: string
|
||||
userId:
|
||||
type: string
|
||||
|
||||
@@ -79,3 +79,20 @@ func (svc *BackgroundService) SendNotifiersToday(ctx context.Context) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (svc *BackgroundService) UpdateLocales(ctx context.Context) error {
|
||||
log.Debug().Msg("updating locales")
|
||||
// fetch list of locales from github
|
||||
// is it worth checking if any changes have been made?
|
||||
// download locales overwriting files in static/public/locales
|
||||
|
||||
// curl -H "Accept: application/vnd.github.v3+json" \
|
||||
// -H "If-Modified-Since: Thu, 31 Oct 2024 09:59:02 GMT" \
|
||||
// -o /dev/null -s -w "%{http_code}\n" \
|
||||
// https://api.github.com/repos/sysadminsmedia/homebox/contents/frontend/locales
|
||||
// keep track of last modified date
|
||||
|
||||
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -50,12 +50,10 @@ type AttachmentEdges struct {
|
||||
// ItemOrErr returns the Item value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e AttachmentEdges) ItemOrErr() (*Item, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Item == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: item.Label}
|
||||
}
|
||||
if e.Item != nil {
|
||||
return e.Item, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: item.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "item"}
|
||||
}
|
||||
@@ -63,12 +61,10 @@ func (e AttachmentEdges) ItemOrErr() (*Item, error) {
|
||||
// DocumentOrErr returns the Document value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e AttachmentEdges) DocumentOrErr() (*Document, error) {
|
||||
if e.loadedTypes[1] {
|
||||
if e.Document == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: document.Label}
|
||||
}
|
||||
if e.Document != nil {
|
||||
return e.Document, nil
|
||||
} else if e.loadedTypes[1] {
|
||||
return nil, &NotFoundError{label: document.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "document"}
|
||||
}
|
||||
|
||||
@@ -191,10 +191,10 @@ func (ac *AttachmentCreate) check() error {
|
||||
if _, ok := ac.mutation.Primary(); !ok {
|
||||
return &ValidationError{Name: "primary", err: errors.New(`ent: missing required field "Attachment.primary"`)}
|
||||
}
|
||||
if _, ok := ac.mutation.ItemID(); !ok {
|
||||
if len(ac.mutation.ItemIDs()) == 0 {
|
||||
return &ValidationError{Name: "item", err: errors.New(`ent: missing required edge "Attachment.item"`)}
|
||||
}
|
||||
if _, ok := ac.mutation.DocumentID(); !ok {
|
||||
if len(ac.mutation.DocumentIDs()) == 0 {
|
||||
return &ValidationError{Name: "document", err: errors.New(`ent: missing required edge "Attachment.document"`)}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -110,7 +111,7 @@ func (aq *AttachmentQuery) QueryDocument() *DocumentQuery {
|
||||
// First returns the first Attachment entity from the query.
|
||||
// Returns a *NotFoundError when no Attachment was found.
|
||||
func (aq *AttachmentQuery) First(ctx context.Context) (*Attachment, error) {
|
||||
nodes, err := aq.Limit(1).All(setContextOp(ctx, aq.ctx, "First"))
|
||||
nodes, err := aq.Limit(1).All(setContextOp(ctx, aq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -133,7 +134,7 @@ func (aq *AttachmentQuery) FirstX(ctx context.Context) *Attachment {
|
||||
// Returns a *NotFoundError when no Attachment ID was found.
|
||||
func (aq *AttachmentQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = aq.Limit(1).IDs(setContextOp(ctx, aq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = aq.Limit(1).IDs(setContextOp(ctx, aq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -156,7 +157,7 @@ func (aq *AttachmentQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one Attachment entity is found.
|
||||
// Returns a *NotFoundError when no Attachment entities are found.
|
||||
func (aq *AttachmentQuery) Only(ctx context.Context) (*Attachment, error) {
|
||||
nodes, err := aq.Limit(2).All(setContextOp(ctx, aq.ctx, "Only"))
|
||||
nodes, err := aq.Limit(2).All(setContextOp(ctx, aq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -184,7 +185,7 @@ func (aq *AttachmentQuery) OnlyX(ctx context.Context) *Attachment {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (aq *AttachmentQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = aq.Limit(2).IDs(setContextOp(ctx, aq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = aq.Limit(2).IDs(setContextOp(ctx, aq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -209,7 +210,7 @@ func (aq *AttachmentQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of Attachments.
|
||||
func (aq *AttachmentQuery) All(ctx context.Context) ([]*Attachment, error) {
|
||||
ctx = setContextOp(ctx, aq.ctx, "All")
|
||||
ctx = setContextOp(ctx, aq.ctx, ent.OpQueryAll)
|
||||
if err := aq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -231,7 +232,7 @@ func (aq *AttachmentQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error)
|
||||
if aq.ctx.Unique == nil && aq.path != nil {
|
||||
aq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, aq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, aq.ctx, ent.OpQueryIDs)
|
||||
if err = aq.Select(attachment.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -249,7 +250,7 @@ func (aq *AttachmentQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (aq *AttachmentQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, aq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, aq.ctx, ent.OpQueryCount)
|
||||
if err := aq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -267,7 +268,7 @@ func (aq *AttachmentQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (aq *AttachmentQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, aq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, aq.ctx, ent.OpQueryExist)
|
||||
switch _, err := aq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -612,7 +613,7 @@ func (agb *AttachmentGroupBy) Aggregate(fns ...AggregateFunc) *AttachmentGroupBy
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (agb *AttachmentGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, agb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, agb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := agb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -660,7 +661,7 @@ func (as *AttachmentSelect) Aggregate(fns ...AggregateFunc) *AttachmentSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (as *AttachmentSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, as.ctx, "Select")
|
||||
ctx = setContextOp(ctx, as.ctx, ent.OpQuerySelect)
|
||||
if err := as.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -147,10 +147,10 @@ func (au *AttachmentUpdate) check() error {
|
||||
return &ValidationError{Name: "type", err: fmt.Errorf(`ent: validator failed for field "Attachment.type": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := au.mutation.ItemID(); au.mutation.ItemCleared() && !ok {
|
||||
if au.mutation.ItemCleared() && len(au.mutation.ItemIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Attachment.item"`)
|
||||
}
|
||||
if _, ok := au.mutation.DocumentID(); au.mutation.DocumentCleared() && !ok {
|
||||
if au.mutation.DocumentCleared() && len(au.mutation.DocumentIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Attachment.document"`)
|
||||
}
|
||||
return nil
|
||||
@@ -384,10 +384,10 @@ func (auo *AttachmentUpdateOne) check() error {
|
||||
return &ValidationError{Name: "type", err: fmt.Errorf(`ent: validator failed for field "Attachment.type": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := auo.mutation.ItemID(); auo.mutation.ItemCleared() && !ok {
|
||||
if auo.mutation.ItemCleared() && len(auo.mutation.ItemIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Attachment.item"`)
|
||||
}
|
||||
if _, ok := auo.mutation.DocumentID(); auo.mutation.DocumentCleared() && !ok {
|
||||
if auo.mutation.DocumentCleared() && len(auo.mutation.DocumentIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Attachment.document"`)
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -39,12 +39,10 @@ type AuthRolesEdges struct {
|
||||
// TokenOrErr returns the Token value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e AuthRolesEdges) TokenOrErr() (*AuthTokens, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Token == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: authtokens.Label}
|
||||
}
|
||||
if e.Token != nil {
|
||||
return e.Token, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: authtokens.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "token"}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -86,7 +87,7 @@ func (arq *AuthRolesQuery) QueryToken() *AuthTokensQuery {
|
||||
// First returns the first AuthRoles entity from the query.
|
||||
// Returns a *NotFoundError when no AuthRoles was found.
|
||||
func (arq *AuthRolesQuery) First(ctx context.Context) (*AuthRoles, error) {
|
||||
nodes, err := arq.Limit(1).All(setContextOp(ctx, arq.ctx, "First"))
|
||||
nodes, err := arq.Limit(1).All(setContextOp(ctx, arq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -109,7 +110,7 @@ func (arq *AuthRolesQuery) FirstX(ctx context.Context) *AuthRoles {
|
||||
// Returns a *NotFoundError when no AuthRoles ID was found.
|
||||
func (arq *AuthRolesQuery) FirstID(ctx context.Context) (id int, err error) {
|
||||
var ids []int
|
||||
if ids, err = arq.Limit(1).IDs(setContextOp(ctx, arq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = arq.Limit(1).IDs(setContextOp(ctx, arq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -132,7 +133,7 @@ func (arq *AuthRolesQuery) FirstIDX(ctx context.Context) int {
|
||||
// Returns a *NotSingularError when more than one AuthRoles entity is found.
|
||||
// Returns a *NotFoundError when no AuthRoles entities are found.
|
||||
func (arq *AuthRolesQuery) Only(ctx context.Context) (*AuthRoles, error) {
|
||||
nodes, err := arq.Limit(2).All(setContextOp(ctx, arq.ctx, "Only"))
|
||||
nodes, err := arq.Limit(2).All(setContextOp(ctx, arq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -160,7 +161,7 @@ func (arq *AuthRolesQuery) OnlyX(ctx context.Context) *AuthRoles {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (arq *AuthRolesQuery) OnlyID(ctx context.Context) (id int, err error) {
|
||||
var ids []int
|
||||
if ids, err = arq.Limit(2).IDs(setContextOp(ctx, arq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = arq.Limit(2).IDs(setContextOp(ctx, arq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -185,7 +186,7 @@ func (arq *AuthRolesQuery) OnlyIDX(ctx context.Context) int {
|
||||
|
||||
// All executes the query and returns a list of AuthRolesSlice.
|
||||
func (arq *AuthRolesQuery) All(ctx context.Context) ([]*AuthRoles, error) {
|
||||
ctx = setContextOp(ctx, arq.ctx, "All")
|
||||
ctx = setContextOp(ctx, arq.ctx, ent.OpQueryAll)
|
||||
if err := arq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -207,7 +208,7 @@ func (arq *AuthRolesQuery) IDs(ctx context.Context) (ids []int, err error) {
|
||||
if arq.ctx.Unique == nil && arq.path != nil {
|
||||
arq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, arq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, arq.ctx, ent.OpQueryIDs)
|
||||
if err = arq.Select(authroles.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -225,7 +226,7 @@ func (arq *AuthRolesQuery) IDsX(ctx context.Context) []int {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (arq *AuthRolesQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, arq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, arq.ctx, ent.OpQueryCount)
|
||||
if err := arq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -243,7 +244,7 @@ func (arq *AuthRolesQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (arq *AuthRolesQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, arq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, arq.ctx, ent.OpQueryExist)
|
||||
switch _, err := arq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -537,7 +538,7 @@ func (argb *AuthRolesGroupBy) Aggregate(fns ...AggregateFunc) *AuthRolesGroupBy
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (argb *AuthRolesGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, argb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, argb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := argb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -585,7 +586,7 @@ func (ars *AuthRolesSelect) Aggregate(fns ...AggregateFunc) *AuthRolesSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ars *AuthRolesSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ars.ctx, "Select")
|
||||
ctx = setContextOp(ctx, ars.ctx, ent.OpQuerySelect)
|
||||
if err := ars.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -49,12 +49,10 @@ type AuthTokensEdges struct {
|
||||
// UserOrErr returns the User value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e AuthTokensEdges) UserOrErr() (*User, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.User == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: user.Label}
|
||||
}
|
||||
if e.User != nil {
|
||||
return e.User, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: user.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "user"}
|
||||
}
|
||||
@@ -62,12 +60,10 @@ func (e AuthTokensEdges) UserOrErr() (*User, error) {
|
||||
// RolesOrErr returns the Roles value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e AuthTokensEdges) RolesOrErr() (*AuthRoles, error) {
|
||||
if e.loadedTypes[1] {
|
||||
if e.Roles == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: authroles.Label}
|
||||
}
|
||||
if e.Roles != nil {
|
||||
return e.Roles, nil
|
||||
} else if e.loadedTypes[1] {
|
||||
return nil, &NotFoundError{label: authroles.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "roles"}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -111,7 +112,7 @@ func (atq *AuthTokensQuery) QueryRoles() *AuthRolesQuery {
|
||||
// First returns the first AuthTokens entity from the query.
|
||||
// Returns a *NotFoundError when no AuthTokens was found.
|
||||
func (atq *AuthTokensQuery) First(ctx context.Context) (*AuthTokens, error) {
|
||||
nodes, err := atq.Limit(1).All(setContextOp(ctx, atq.ctx, "First"))
|
||||
nodes, err := atq.Limit(1).All(setContextOp(ctx, atq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -134,7 +135,7 @@ func (atq *AuthTokensQuery) FirstX(ctx context.Context) *AuthTokens {
|
||||
// Returns a *NotFoundError when no AuthTokens ID was found.
|
||||
func (atq *AuthTokensQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = atq.Limit(1).IDs(setContextOp(ctx, atq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = atq.Limit(1).IDs(setContextOp(ctx, atq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -157,7 +158,7 @@ func (atq *AuthTokensQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one AuthTokens entity is found.
|
||||
// Returns a *NotFoundError when no AuthTokens entities are found.
|
||||
func (atq *AuthTokensQuery) Only(ctx context.Context) (*AuthTokens, error) {
|
||||
nodes, err := atq.Limit(2).All(setContextOp(ctx, atq.ctx, "Only"))
|
||||
nodes, err := atq.Limit(2).All(setContextOp(ctx, atq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -185,7 +186,7 @@ func (atq *AuthTokensQuery) OnlyX(ctx context.Context) *AuthTokens {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (atq *AuthTokensQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = atq.Limit(2).IDs(setContextOp(ctx, atq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = atq.Limit(2).IDs(setContextOp(ctx, atq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -210,7 +211,7 @@ func (atq *AuthTokensQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of AuthTokensSlice.
|
||||
func (atq *AuthTokensQuery) All(ctx context.Context) ([]*AuthTokens, error) {
|
||||
ctx = setContextOp(ctx, atq.ctx, "All")
|
||||
ctx = setContextOp(ctx, atq.ctx, ent.OpQueryAll)
|
||||
if err := atq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -232,7 +233,7 @@ func (atq *AuthTokensQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error
|
||||
if atq.ctx.Unique == nil && atq.path != nil {
|
||||
atq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, atq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, atq.ctx, ent.OpQueryIDs)
|
||||
if err = atq.Select(authtokens.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -250,7 +251,7 @@ func (atq *AuthTokensQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (atq *AuthTokensQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, atq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, atq.ctx, ent.OpQueryCount)
|
||||
if err := atq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -268,7 +269,7 @@ func (atq *AuthTokensQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (atq *AuthTokensQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, atq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, atq.ctx, ent.OpQueryExist)
|
||||
switch _, err := atq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -609,7 +610,7 @@ func (atgb *AuthTokensGroupBy) Aggregate(fns ...AggregateFunc) *AuthTokensGroupB
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (atgb *AuthTokensGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, atgb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, atgb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := atgb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -657,7 +658,7 @@ func (ats *AuthTokensSelect) Aggregate(fns ...AggregateFunc) *AuthTokensSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ats *AuthTokensSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ats.ctx, "Select")
|
||||
ctx = setContextOp(ctx, ats.ctx, ent.OpQuerySelect)
|
||||
if err := ats.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -48,12 +48,10 @@ type DocumentEdges struct {
|
||||
// GroupOrErr returns the Group value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e DocumentEdges) GroupOrErr() (*Group, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Group == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
if e.Group != nil {
|
||||
return e.Group, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "group"}
|
||||
}
|
||||
|
||||
@@ -176,7 +176,7 @@ func (dc *DocumentCreate) check() error {
|
||||
return &ValidationError{Name: "path", err: fmt.Errorf(`ent: validator failed for field "Document.path": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := dc.mutation.GroupID(); !ok {
|
||||
if len(dc.mutation.GroupIDs()) == 0 {
|
||||
return &ValidationError{Name: "group", err: errors.New(`ent: missing required edge "Document.group"`)}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -111,7 +112,7 @@ func (dq *DocumentQuery) QueryAttachments() *AttachmentQuery {
|
||||
// First returns the first Document entity from the query.
|
||||
// Returns a *NotFoundError when no Document was found.
|
||||
func (dq *DocumentQuery) First(ctx context.Context) (*Document, error) {
|
||||
nodes, err := dq.Limit(1).All(setContextOp(ctx, dq.ctx, "First"))
|
||||
nodes, err := dq.Limit(1).All(setContextOp(ctx, dq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -134,7 +135,7 @@ func (dq *DocumentQuery) FirstX(ctx context.Context) *Document {
|
||||
// Returns a *NotFoundError when no Document ID was found.
|
||||
func (dq *DocumentQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = dq.Limit(1).IDs(setContextOp(ctx, dq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = dq.Limit(1).IDs(setContextOp(ctx, dq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -157,7 +158,7 @@ func (dq *DocumentQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one Document entity is found.
|
||||
// Returns a *NotFoundError when no Document entities are found.
|
||||
func (dq *DocumentQuery) Only(ctx context.Context) (*Document, error) {
|
||||
nodes, err := dq.Limit(2).All(setContextOp(ctx, dq.ctx, "Only"))
|
||||
nodes, err := dq.Limit(2).All(setContextOp(ctx, dq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -185,7 +186,7 @@ func (dq *DocumentQuery) OnlyX(ctx context.Context) *Document {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (dq *DocumentQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = dq.Limit(2).IDs(setContextOp(ctx, dq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = dq.Limit(2).IDs(setContextOp(ctx, dq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -210,7 +211,7 @@ func (dq *DocumentQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of Documents.
|
||||
func (dq *DocumentQuery) All(ctx context.Context) ([]*Document, error) {
|
||||
ctx = setContextOp(ctx, dq.ctx, "All")
|
||||
ctx = setContextOp(ctx, dq.ctx, ent.OpQueryAll)
|
||||
if err := dq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -232,7 +233,7 @@ func (dq *DocumentQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) {
|
||||
if dq.ctx.Unique == nil && dq.path != nil {
|
||||
dq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, dq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, dq.ctx, ent.OpQueryIDs)
|
||||
if err = dq.Select(document.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -250,7 +251,7 @@ func (dq *DocumentQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (dq *DocumentQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, dq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, dq.ctx, ent.OpQueryCount)
|
||||
if err := dq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -268,7 +269,7 @@ func (dq *DocumentQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (dq *DocumentQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, dq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, dq.ctx, ent.OpQueryExist)
|
||||
switch _, err := dq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -613,7 +614,7 @@ func (dgb *DocumentGroupBy) Aggregate(fns ...AggregateFunc) *DocumentGroupBy {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (dgb *DocumentGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, dgb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, dgb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := dgb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -661,7 +662,7 @@ func (ds *DocumentSelect) Aggregate(fns ...AggregateFunc) *DocumentSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ds *DocumentSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ds.ctx, "Select")
|
||||
ctx = setContextOp(ctx, ds.ctx, ent.OpQuerySelect)
|
||||
if err := ds.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ func (du *DocumentUpdate) check() error {
|
||||
return &ValidationError{Name: "path", err: fmt.Errorf(`ent: validator failed for field "Document.path": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := du.mutation.GroupID(); du.mutation.GroupCleared() && !ok {
|
||||
if du.mutation.GroupCleared() && len(du.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Document.group"`)
|
||||
}
|
||||
return nil
|
||||
@@ -445,7 +445,7 @@ func (duo *DocumentUpdateOne) check() error {
|
||||
return &ValidationError{Name: "path", err: fmt.Errorf(`ent: validator failed for field "Document.path": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := duo.mutation.GroupID(); duo.mutation.GroupCleared() && !ok {
|
||||
if duo.mutation.GroupCleared() && len(duo.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Document.group"`)
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -81,7 +81,7 @@ var (
|
||||
columnCheck sql.ColumnCheck
|
||||
)
|
||||
|
||||
// columnChecker checks if the column exists in the given table.
|
||||
// checkColumn checks if the column exists in the given table.
|
||||
func checkColumn(table, column string) error {
|
||||
initCheck.Do(func() {
|
||||
columnCheck = sql.NewColumnCheck(map[string]func(string) bool{
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -230,7 +231,7 @@ func (gq *GroupQuery) QueryNotifiers() *NotifierQuery {
|
||||
// First returns the first Group entity from the query.
|
||||
// Returns a *NotFoundError when no Group was found.
|
||||
func (gq *GroupQuery) First(ctx context.Context) (*Group, error) {
|
||||
nodes, err := gq.Limit(1).All(setContextOp(ctx, gq.ctx, "First"))
|
||||
nodes, err := gq.Limit(1).All(setContextOp(ctx, gq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -253,7 +254,7 @@ func (gq *GroupQuery) FirstX(ctx context.Context) *Group {
|
||||
// Returns a *NotFoundError when no Group ID was found.
|
||||
func (gq *GroupQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = gq.Limit(1).IDs(setContextOp(ctx, gq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = gq.Limit(1).IDs(setContextOp(ctx, gq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -276,7 +277,7 @@ func (gq *GroupQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one Group entity is found.
|
||||
// Returns a *NotFoundError when no Group entities are found.
|
||||
func (gq *GroupQuery) Only(ctx context.Context) (*Group, error) {
|
||||
nodes, err := gq.Limit(2).All(setContextOp(ctx, gq.ctx, "Only"))
|
||||
nodes, err := gq.Limit(2).All(setContextOp(ctx, gq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -304,7 +305,7 @@ func (gq *GroupQuery) OnlyX(ctx context.Context) *Group {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (gq *GroupQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = gq.Limit(2).IDs(setContextOp(ctx, gq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = gq.Limit(2).IDs(setContextOp(ctx, gq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -329,7 +330,7 @@ func (gq *GroupQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of Groups.
|
||||
func (gq *GroupQuery) All(ctx context.Context) ([]*Group, error) {
|
||||
ctx = setContextOp(ctx, gq.ctx, "All")
|
||||
ctx = setContextOp(ctx, gq.ctx, ent.OpQueryAll)
|
||||
if err := gq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -351,7 +352,7 @@ func (gq *GroupQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) {
|
||||
if gq.ctx.Unique == nil && gq.path != nil {
|
||||
gq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, gq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, gq.ctx, ent.OpQueryIDs)
|
||||
if err = gq.Select(group.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -369,7 +370,7 @@ func (gq *GroupQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (gq *GroupQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, gq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, gq.ctx, ent.OpQueryCount)
|
||||
if err := gq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -387,7 +388,7 @@ func (gq *GroupQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (gq *GroupQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, gq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, gq.ctx, ent.OpQueryExist)
|
||||
switch _, err := gq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -981,7 +982,7 @@ func (ggb *GroupGroupBy) Aggregate(fns ...AggregateFunc) *GroupGroupBy {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ggb *GroupGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ggb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, ggb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := ggb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1029,7 +1030,7 @@ func (gs *GroupSelect) Aggregate(fns ...AggregateFunc) *GroupSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (gs *GroupSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, gs.ctx, "Select")
|
||||
ctx = setContextOp(ctx, gs.ctx, ent.OpQuerySelect)
|
||||
if err := gs.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -48,12 +48,10 @@ type GroupInvitationTokenEdges struct {
|
||||
// GroupOrErr returns the Group value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e GroupInvitationTokenEdges) GroupOrErr() (*Group, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Group == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
if e.Group != nil {
|
||||
return e.Group, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "group"}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -86,7 +87,7 @@ func (gitq *GroupInvitationTokenQuery) QueryGroup() *GroupQuery {
|
||||
// First returns the first GroupInvitationToken entity from the query.
|
||||
// Returns a *NotFoundError when no GroupInvitationToken was found.
|
||||
func (gitq *GroupInvitationTokenQuery) First(ctx context.Context) (*GroupInvitationToken, error) {
|
||||
nodes, err := gitq.Limit(1).All(setContextOp(ctx, gitq.ctx, "First"))
|
||||
nodes, err := gitq.Limit(1).All(setContextOp(ctx, gitq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -109,7 +110,7 @@ func (gitq *GroupInvitationTokenQuery) FirstX(ctx context.Context) *GroupInvitat
|
||||
// Returns a *NotFoundError when no GroupInvitationToken ID was found.
|
||||
func (gitq *GroupInvitationTokenQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = gitq.Limit(1).IDs(setContextOp(ctx, gitq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = gitq.Limit(1).IDs(setContextOp(ctx, gitq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -132,7 +133,7 @@ func (gitq *GroupInvitationTokenQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one GroupInvitationToken entity is found.
|
||||
// Returns a *NotFoundError when no GroupInvitationToken entities are found.
|
||||
func (gitq *GroupInvitationTokenQuery) Only(ctx context.Context) (*GroupInvitationToken, error) {
|
||||
nodes, err := gitq.Limit(2).All(setContextOp(ctx, gitq.ctx, "Only"))
|
||||
nodes, err := gitq.Limit(2).All(setContextOp(ctx, gitq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -160,7 +161,7 @@ func (gitq *GroupInvitationTokenQuery) OnlyX(ctx context.Context) *GroupInvitati
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (gitq *GroupInvitationTokenQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = gitq.Limit(2).IDs(setContextOp(ctx, gitq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = gitq.Limit(2).IDs(setContextOp(ctx, gitq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -185,7 +186,7 @@ func (gitq *GroupInvitationTokenQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of GroupInvitationTokens.
|
||||
func (gitq *GroupInvitationTokenQuery) All(ctx context.Context) ([]*GroupInvitationToken, error) {
|
||||
ctx = setContextOp(ctx, gitq.ctx, "All")
|
||||
ctx = setContextOp(ctx, gitq.ctx, ent.OpQueryAll)
|
||||
if err := gitq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -207,7 +208,7 @@ func (gitq *GroupInvitationTokenQuery) IDs(ctx context.Context) (ids []uuid.UUID
|
||||
if gitq.ctx.Unique == nil && gitq.path != nil {
|
||||
gitq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, gitq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, gitq.ctx, ent.OpQueryIDs)
|
||||
if err = gitq.Select(groupinvitationtoken.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -225,7 +226,7 @@ func (gitq *GroupInvitationTokenQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (gitq *GroupInvitationTokenQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, gitq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, gitq.ctx, ent.OpQueryCount)
|
||||
if err := gitq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -243,7 +244,7 @@ func (gitq *GroupInvitationTokenQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (gitq *GroupInvitationTokenQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, gitq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, gitq.ctx, ent.OpQueryExist)
|
||||
switch _, err := gitq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -537,7 +538,7 @@ func (gitgb *GroupInvitationTokenGroupBy) Aggregate(fns ...AggregateFunc) *Group
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (gitgb *GroupInvitationTokenGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, gitgb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, gitgb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := gitgb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -585,7 +586,7 @@ func (gits *GroupInvitationTokenSelect) Aggregate(fns ...AggregateFunc) *GroupIn
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (gits *GroupInvitationTokenSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, gits.ctx, "Select")
|
||||
ctx = setContextOp(ctx, gits.ctx, ent.OpQuerySelect)
|
||||
if err := gits.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -101,12 +101,10 @@ type ItemEdges struct {
|
||||
// GroupOrErr returns the Group value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e ItemEdges) GroupOrErr() (*Group, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Group == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
if e.Group != nil {
|
||||
return e.Group, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "group"}
|
||||
}
|
||||
@@ -114,12 +112,10 @@ func (e ItemEdges) GroupOrErr() (*Group, error) {
|
||||
// ParentOrErr returns the Parent value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e ItemEdges) ParentOrErr() (*Item, error) {
|
||||
if e.loadedTypes[1] {
|
||||
if e.Parent == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: item.Label}
|
||||
}
|
||||
if e.Parent != nil {
|
||||
return e.Parent, nil
|
||||
} else if e.loadedTypes[1] {
|
||||
return nil, &NotFoundError{label: item.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "parent"}
|
||||
}
|
||||
@@ -145,12 +141,10 @@ func (e ItemEdges) LabelOrErr() ([]*Label, error) {
|
||||
// LocationOrErr returns the Location value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e ItemEdges) LocationOrErr() (*Location, error) {
|
||||
if e.loadedTypes[4] {
|
||||
if e.Location == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: location.Label}
|
||||
}
|
||||
if e.Location != nil {
|
||||
return e.Location, nil
|
||||
} else if e.loadedTypes[4] {
|
||||
return nil, &NotFoundError{label: location.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "location"}
|
||||
}
|
||||
|
||||
@@ -633,7 +633,7 @@ func (ic *ItemCreate) check() error {
|
||||
return &ValidationError{Name: "sold_notes", err: fmt.Errorf(`ent: validator failed for field "Item.sold_notes": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := ic.mutation.GroupID(); !ok {
|
||||
if len(ic.mutation.GroupIDs()) == 0 {
|
||||
return &ValidationError{Name: "group", err: errors.New(`ent: missing required edge "Item.group"`)}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -253,7 +254,7 @@ func (iq *ItemQuery) QueryAttachments() *AttachmentQuery {
|
||||
// First returns the first Item entity from the query.
|
||||
// Returns a *NotFoundError when no Item was found.
|
||||
func (iq *ItemQuery) First(ctx context.Context) (*Item, error) {
|
||||
nodes, err := iq.Limit(1).All(setContextOp(ctx, iq.ctx, "First"))
|
||||
nodes, err := iq.Limit(1).All(setContextOp(ctx, iq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -276,7 +277,7 @@ func (iq *ItemQuery) FirstX(ctx context.Context) *Item {
|
||||
// Returns a *NotFoundError when no Item ID was found.
|
||||
func (iq *ItemQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = iq.Limit(1).IDs(setContextOp(ctx, iq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = iq.Limit(1).IDs(setContextOp(ctx, iq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -299,7 +300,7 @@ func (iq *ItemQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one Item entity is found.
|
||||
// Returns a *NotFoundError when no Item entities are found.
|
||||
func (iq *ItemQuery) Only(ctx context.Context) (*Item, error) {
|
||||
nodes, err := iq.Limit(2).All(setContextOp(ctx, iq.ctx, "Only"))
|
||||
nodes, err := iq.Limit(2).All(setContextOp(ctx, iq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -327,7 +328,7 @@ func (iq *ItemQuery) OnlyX(ctx context.Context) *Item {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (iq *ItemQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = iq.Limit(2).IDs(setContextOp(ctx, iq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = iq.Limit(2).IDs(setContextOp(ctx, iq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -352,7 +353,7 @@ func (iq *ItemQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of Items.
|
||||
func (iq *ItemQuery) All(ctx context.Context) ([]*Item, error) {
|
||||
ctx = setContextOp(ctx, iq.ctx, "All")
|
||||
ctx = setContextOp(ctx, iq.ctx, ent.OpQueryAll)
|
||||
if err := iq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -374,7 +375,7 @@ func (iq *ItemQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) {
|
||||
if iq.ctx.Unique == nil && iq.path != nil {
|
||||
iq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, iq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, iq.ctx, ent.OpQueryIDs)
|
||||
if err = iq.Select(item.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -392,7 +393,7 @@ func (iq *ItemQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (iq *ItemQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, iq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, iq.ctx, ent.OpQueryCount)
|
||||
if err := iq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -410,7 +411,7 @@ func (iq *ItemQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (iq *ItemQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, iq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, iq.ctx, ent.OpQueryExist)
|
||||
switch _, err := iq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -1090,7 +1091,7 @@ func (igb *ItemGroupBy) Aggregate(fns ...AggregateFunc) *ItemGroupBy {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (igb *ItemGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, igb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, igb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := igb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1138,7 +1139,7 @@ func (is *ItemSelect) Aggregate(fns ...AggregateFunc) *ItemSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (is *ItemSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, is.ctx, "Select")
|
||||
ctx = setContextOp(ctx, is.ctx, ent.OpQuerySelect)
|
||||
if err := is.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -776,7 +776,7 @@ func (iu *ItemUpdate) check() error {
|
||||
return &ValidationError{Name: "sold_notes", err: fmt.Errorf(`ent: validator failed for field "Item.sold_notes": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := iu.mutation.GroupID(); iu.mutation.GroupCleared() && !ok {
|
||||
if iu.mutation.GroupCleared() && len(iu.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Item.group"`)
|
||||
}
|
||||
return nil
|
||||
@@ -1997,7 +1997,7 @@ func (iuo *ItemUpdateOne) check() error {
|
||||
return &ValidationError{Name: "sold_notes", err: fmt.Errorf(`ent: validator failed for field "Item.sold_notes": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := iuo.mutation.GroupID(); iuo.mutation.GroupCleared() && !ok {
|
||||
if iuo.mutation.GroupCleared() && len(iuo.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Item.group"`)
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -56,12 +56,10 @@ type ItemFieldEdges struct {
|
||||
// ItemOrErr returns the Item value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e ItemFieldEdges) ItemOrErr() (*Item, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Item == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: item.Label}
|
||||
}
|
||||
if e.Item != nil {
|
||||
return e.Item, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: item.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "item"}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -86,7 +87,7 @@ func (ifq *ItemFieldQuery) QueryItem() *ItemQuery {
|
||||
// First returns the first ItemField entity from the query.
|
||||
// Returns a *NotFoundError when no ItemField was found.
|
||||
func (ifq *ItemFieldQuery) First(ctx context.Context) (*ItemField, error) {
|
||||
nodes, err := ifq.Limit(1).All(setContextOp(ctx, ifq.ctx, "First"))
|
||||
nodes, err := ifq.Limit(1).All(setContextOp(ctx, ifq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -109,7 +110,7 @@ func (ifq *ItemFieldQuery) FirstX(ctx context.Context) *ItemField {
|
||||
// Returns a *NotFoundError when no ItemField ID was found.
|
||||
func (ifq *ItemFieldQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = ifq.Limit(1).IDs(setContextOp(ctx, ifq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = ifq.Limit(1).IDs(setContextOp(ctx, ifq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -132,7 +133,7 @@ func (ifq *ItemFieldQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one ItemField entity is found.
|
||||
// Returns a *NotFoundError when no ItemField entities are found.
|
||||
func (ifq *ItemFieldQuery) Only(ctx context.Context) (*ItemField, error) {
|
||||
nodes, err := ifq.Limit(2).All(setContextOp(ctx, ifq.ctx, "Only"))
|
||||
nodes, err := ifq.Limit(2).All(setContextOp(ctx, ifq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -160,7 +161,7 @@ func (ifq *ItemFieldQuery) OnlyX(ctx context.Context) *ItemField {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (ifq *ItemFieldQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = ifq.Limit(2).IDs(setContextOp(ctx, ifq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = ifq.Limit(2).IDs(setContextOp(ctx, ifq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -185,7 +186,7 @@ func (ifq *ItemFieldQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of ItemFields.
|
||||
func (ifq *ItemFieldQuery) All(ctx context.Context) ([]*ItemField, error) {
|
||||
ctx = setContextOp(ctx, ifq.ctx, "All")
|
||||
ctx = setContextOp(ctx, ifq.ctx, ent.OpQueryAll)
|
||||
if err := ifq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -207,7 +208,7 @@ func (ifq *ItemFieldQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error)
|
||||
if ifq.ctx.Unique == nil && ifq.path != nil {
|
||||
ifq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, ifq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, ifq.ctx, ent.OpQueryIDs)
|
||||
if err = ifq.Select(itemfield.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -225,7 +226,7 @@ func (ifq *ItemFieldQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (ifq *ItemFieldQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, ifq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, ifq.ctx, ent.OpQueryCount)
|
||||
if err := ifq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -243,7 +244,7 @@ func (ifq *ItemFieldQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (ifq *ItemFieldQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, ifq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, ifq.ctx, ent.OpQueryExist)
|
||||
switch _, err := ifq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -537,7 +538,7 @@ func (ifgb *ItemFieldGroupBy) Aggregate(fns ...AggregateFunc) *ItemFieldGroupBy
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ifgb *ItemFieldGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ifgb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, ifgb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := ifgb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -585,7 +586,7 @@ func (ifs *ItemFieldSelect) Aggregate(fns ...AggregateFunc) *ItemFieldSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ifs *ItemFieldSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ifs.ctx, "Select")
|
||||
ctx = setContextOp(ctx, ifs.ctx, ent.OpQuerySelect)
|
||||
if err := ifs.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -50,12 +50,10 @@ type LabelEdges struct {
|
||||
// GroupOrErr returns the Group value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e LabelEdges) GroupOrErr() (*Group, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Group == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
if e.Group != nil {
|
||||
return e.Group, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "group"}
|
||||
}
|
||||
|
||||
@@ -200,7 +200,7 @@ func (lc *LabelCreate) check() error {
|
||||
return &ValidationError{Name: "color", err: fmt.Errorf(`ent: validator failed for field "Label.color": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := lc.mutation.GroupID(); !ok {
|
||||
if len(lc.mutation.GroupIDs()) == 0 {
|
||||
return &ValidationError{Name: "group", err: errors.New(`ent: missing required edge "Label.group"`)}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -111,7 +112,7 @@ func (lq *LabelQuery) QueryItems() *ItemQuery {
|
||||
// First returns the first Label entity from the query.
|
||||
// Returns a *NotFoundError when no Label was found.
|
||||
func (lq *LabelQuery) First(ctx context.Context) (*Label, error) {
|
||||
nodes, err := lq.Limit(1).All(setContextOp(ctx, lq.ctx, "First"))
|
||||
nodes, err := lq.Limit(1).All(setContextOp(ctx, lq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -134,7 +135,7 @@ func (lq *LabelQuery) FirstX(ctx context.Context) *Label {
|
||||
// Returns a *NotFoundError when no Label ID was found.
|
||||
func (lq *LabelQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = lq.Limit(1).IDs(setContextOp(ctx, lq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = lq.Limit(1).IDs(setContextOp(ctx, lq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -157,7 +158,7 @@ func (lq *LabelQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one Label entity is found.
|
||||
// Returns a *NotFoundError when no Label entities are found.
|
||||
func (lq *LabelQuery) Only(ctx context.Context) (*Label, error) {
|
||||
nodes, err := lq.Limit(2).All(setContextOp(ctx, lq.ctx, "Only"))
|
||||
nodes, err := lq.Limit(2).All(setContextOp(ctx, lq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -185,7 +186,7 @@ func (lq *LabelQuery) OnlyX(ctx context.Context) *Label {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (lq *LabelQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = lq.Limit(2).IDs(setContextOp(ctx, lq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = lq.Limit(2).IDs(setContextOp(ctx, lq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -210,7 +211,7 @@ func (lq *LabelQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of Labels.
|
||||
func (lq *LabelQuery) All(ctx context.Context) ([]*Label, error) {
|
||||
ctx = setContextOp(ctx, lq.ctx, "All")
|
||||
ctx = setContextOp(ctx, lq.ctx, ent.OpQueryAll)
|
||||
if err := lq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -232,7 +233,7 @@ func (lq *LabelQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) {
|
||||
if lq.ctx.Unique == nil && lq.path != nil {
|
||||
lq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, lq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, lq.ctx, ent.OpQueryIDs)
|
||||
if err = lq.Select(label.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -250,7 +251,7 @@ func (lq *LabelQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (lq *LabelQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, lq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, lq.ctx, ent.OpQueryCount)
|
||||
if err := lq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -268,7 +269,7 @@ func (lq *LabelQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (lq *LabelQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, lq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, lq.ctx, ent.OpQueryExist)
|
||||
switch _, err := lq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -643,7 +644,7 @@ func (lgb *LabelGroupBy) Aggregate(fns ...AggregateFunc) *LabelGroupBy {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (lgb *LabelGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, lgb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, lgb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := lgb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -691,7 +692,7 @@ func (ls *LabelSelect) Aggregate(fns ...AggregateFunc) *LabelSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ls *LabelSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ls.ctx, "Select")
|
||||
ctx = setContextOp(ctx, ls.ctx, ent.OpQuerySelect)
|
||||
if err := ls.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ func (lu *LabelUpdate) check() error {
|
||||
return &ValidationError{Name: "color", err: fmt.Errorf(`ent: validator failed for field "Label.color": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := lu.mutation.GroupID(); lu.mutation.GroupCleared() && !ok {
|
||||
if lu.mutation.GroupCleared() && len(lu.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Label.group"`)
|
||||
}
|
||||
return nil
|
||||
@@ -516,7 +516,7 @@ func (luo *LabelUpdateOne) check() error {
|
||||
return &ValidationError{Name: "color", err: fmt.Errorf(`ent: validator failed for field "Label.color": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := luo.mutation.GroupID(); luo.mutation.GroupCleared() && !ok {
|
||||
if luo.mutation.GroupCleared() && len(luo.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Label.group"`)
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -53,12 +53,10 @@ type LocationEdges struct {
|
||||
// GroupOrErr returns the Group value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e LocationEdges) GroupOrErr() (*Group, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Group == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
if e.Group != nil {
|
||||
return e.Group, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "group"}
|
||||
}
|
||||
@@ -66,12 +64,10 @@ func (e LocationEdges) GroupOrErr() (*Group, error) {
|
||||
// ParentOrErr returns the Parent value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e LocationEdges) ParentOrErr() (*Location, error) {
|
||||
if e.loadedTypes[1] {
|
||||
if e.Parent == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: location.Label}
|
||||
}
|
||||
if e.Parent != nil {
|
||||
return e.Parent, nil
|
||||
} else if e.loadedTypes[1] {
|
||||
return nil, &NotFoundError{label: location.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "parent"}
|
||||
}
|
||||
|
||||
@@ -215,7 +215,7 @@ func (lc *LocationCreate) check() error {
|
||||
return &ValidationError{Name: "description", err: fmt.Errorf(`ent: validator failed for field "Location.description": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := lc.mutation.GroupID(); !ok {
|
||||
if len(lc.mutation.GroupIDs()) == 0 {
|
||||
return &ValidationError{Name: "group", err: errors.New(`ent: missing required edge "Location.group"`)}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -157,7 +158,7 @@ func (lq *LocationQuery) QueryItems() *ItemQuery {
|
||||
// First returns the first Location entity from the query.
|
||||
// Returns a *NotFoundError when no Location was found.
|
||||
func (lq *LocationQuery) First(ctx context.Context) (*Location, error) {
|
||||
nodes, err := lq.Limit(1).All(setContextOp(ctx, lq.ctx, "First"))
|
||||
nodes, err := lq.Limit(1).All(setContextOp(ctx, lq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -180,7 +181,7 @@ func (lq *LocationQuery) FirstX(ctx context.Context) *Location {
|
||||
// Returns a *NotFoundError when no Location ID was found.
|
||||
func (lq *LocationQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = lq.Limit(1).IDs(setContextOp(ctx, lq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = lq.Limit(1).IDs(setContextOp(ctx, lq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -203,7 +204,7 @@ func (lq *LocationQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one Location entity is found.
|
||||
// Returns a *NotFoundError when no Location entities are found.
|
||||
func (lq *LocationQuery) Only(ctx context.Context) (*Location, error) {
|
||||
nodes, err := lq.Limit(2).All(setContextOp(ctx, lq.ctx, "Only"))
|
||||
nodes, err := lq.Limit(2).All(setContextOp(ctx, lq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -231,7 +232,7 @@ func (lq *LocationQuery) OnlyX(ctx context.Context) *Location {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (lq *LocationQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = lq.Limit(2).IDs(setContextOp(ctx, lq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = lq.Limit(2).IDs(setContextOp(ctx, lq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -256,7 +257,7 @@ func (lq *LocationQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of Locations.
|
||||
func (lq *LocationQuery) All(ctx context.Context) ([]*Location, error) {
|
||||
ctx = setContextOp(ctx, lq.ctx, "All")
|
||||
ctx = setContextOp(ctx, lq.ctx, ent.OpQueryAll)
|
||||
if err := lq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -278,7 +279,7 @@ func (lq *LocationQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) {
|
||||
if lq.ctx.Unique == nil && lq.path != nil {
|
||||
lq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, lq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, lq.ctx, ent.OpQueryIDs)
|
||||
if err = lq.Select(location.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -296,7 +297,7 @@ func (lq *LocationQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (lq *LocationQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, lq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, lq.ctx, ent.OpQueryCount)
|
||||
if err := lq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -314,7 +315,7 @@ func (lq *LocationQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (lq *LocationQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, lq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, lq.ctx, ent.OpQueryExist)
|
||||
switch _, err := lq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -761,7 +762,7 @@ func (lgb *LocationGroupBy) Aggregate(fns ...AggregateFunc) *LocationGroupBy {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (lgb *LocationGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, lgb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, lgb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := lgb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -809,7 +810,7 @@ func (ls *LocationSelect) Aggregate(fns ...AggregateFunc) *LocationSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ls *LocationSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ls.ctx, "Select")
|
||||
ctx = setContextOp(ctx, ls.ctx, ent.OpQuerySelect)
|
||||
if err := ls.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -238,7 +238,7 @@ func (lu *LocationUpdate) check() error {
|
||||
return &ValidationError{Name: "description", err: fmt.Errorf(`ent: validator failed for field "Location.description": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := lu.mutation.GroupID(); lu.mutation.GroupCleared() && !ok {
|
||||
if lu.mutation.GroupCleared() && len(lu.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Location.group"`)
|
||||
}
|
||||
return nil
|
||||
@@ -656,7 +656,7 @@ func (luo *LocationUpdateOne) check() error {
|
||||
return &ValidationError{Name: "description", err: fmt.Errorf(`ent: validator failed for field "Location.description": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := luo.mutation.GroupID(); luo.mutation.GroupCleared() && !ok {
|
||||
if luo.mutation.GroupCleared() && len(luo.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Location.group"`)
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -53,12 +53,10 @@ type MaintenanceEntryEdges struct {
|
||||
// ItemOrErr returns the Item value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e MaintenanceEntryEdges) ItemOrErr() (*Item, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Item == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: item.Label}
|
||||
}
|
||||
if e.Item != nil {
|
||||
return e.Item, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: item.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "item"}
|
||||
}
|
||||
|
||||
@@ -217,7 +217,7 @@ func (mec *MaintenanceEntryCreate) check() error {
|
||||
if _, ok := mec.mutation.Cost(); !ok {
|
||||
return &ValidationError{Name: "cost", err: errors.New(`ent: missing required field "MaintenanceEntry.cost"`)}
|
||||
}
|
||||
if _, ok := mec.mutation.ItemID(); !ok {
|
||||
if len(mec.mutation.ItemIDs()) == 0 {
|
||||
return &ValidationError{Name: "item", err: errors.New(`ent: missing required edge "MaintenanceEntry.item"`)}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -85,7 +86,7 @@ func (meq *MaintenanceEntryQuery) QueryItem() *ItemQuery {
|
||||
// First returns the first MaintenanceEntry entity from the query.
|
||||
// Returns a *NotFoundError when no MaintenanceEntry was found.
|
||||
func (meq *MaintenanceEntryQuery) First(ctx context.Context) (*MaintenanceEntry, error) {
|
||||
nodes, err := meq.Limit(1).All(setContextOp(ctx, meq.ctx, "First"))
|
||||
nodes, err := meq.Limit(1).All(setContextOp(ctx, meq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -108,7 +109,7 @@ func (meq *MaintenanceEntryQuery) FirstX(ctx context.Context) *MaintenanceEntry
|
||||
// Returns a *NotFoundError when no MaintenanceEntry ID was found.
|
||||
func (meq *MaintenanceEntryQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = meq.Limit(1).IDs(setContextOp(ctx, meq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = meq.Limit(1).IDs(setContextOp(ctx, meq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -131,7 +132,7 @@ func (meq *MaintenanceEntryQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one MaintenanceEntry entity is found.
|
||||
// Returns a *NotFoundError when no MaintenanceEntry entities are found.
|
||||
func (meq *MaintenanceEntryQuery) Only(ctx context.Context) (*MaintenanceEntry, error) {
|
||||
nodes, err := meq.Limit(2).All(setContextOp(ctx, meq.ctx, "Only"))
|
||||
nodes, err := meq.Limit(2).All(setContextOp(ctx, meq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -159,7 +160,7 @@ func (meq *MaintenanceEntryQuery) OnlyX(ctx context.Context) *MaintenanceEntry {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (meq *MaintenanceEntryQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = meq.Limit(2).IDs(setContextOp(ctx, meq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = meq.Limit(2).IDs(setContextOp(ctx, meq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -184,7 +185,7 @@ func (meq *MaintenanceEntryQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of MaintenanceEntries.
|
||||
func (meq *MaintenanceEntryQuery) All(ctx context.Context) ([]*MaintenanceEntry, error) {
|
||||
ctx = setContextOp(ctx, meq.ctx, "All")
|
||||
ctx = setContextOp(ctx, meq.ctx, ent.OpQueryAll)
|
||||
if err := meq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -206,7 +207,7 @@ func (meq *MaintenanceEntryQuery) IDs(ctx context.Context) (ids []uuid.UUID, err
|
||||
if meq.ctx.Unique == nil && meq.path != nil {
|
||||
meq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, meq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, meq.ctx, ent.OpQueryIDs)
|
||||
if err = meq.Select(maintenanceentry.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -224,7 +225,7 @@ func (meq *MaintenanceEntryQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (meq *MaintenanceEntryQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, meq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, meq.ctx, ent.OpQueryCount)
|
||||
if err := meq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -242,7 +243,7 @@ func (meq *MaintenanceEntryQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (meq *MaintenanceEntryQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, meq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, meq.ctx, ent.OpQueryExist)
|
||||
switch _, err := meq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -529,7 +530,7 @@ func (megb *MaintenanceEntryGroupBy) Aggregate(fns ...AggregateFunc) *Maintenanc
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (megb *MaintenanceEntryGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, megb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, megb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := megb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -577,7 +578,7 @@ func (mes *MaintenanceEntrySelect) Aggregate(fns ...AggregateFunc) *MaintenanceE
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (mes *MaintenanceEntrySelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, mes.ctx, "Select")
|
||||
ctx = setContextOp(ctx, mes.ctx, ent.OpQuerySelect)
|
||||
if err := mes.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ func (meu *MaintenanceEntryUpdate) check() error {
|
||||
return &ValidationError{Name: "description", err: fmt.Errorf(`ent: validator failed for field "MaintenanceEntry.description": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := meu.mutation.ItemID(); meu.mutation.ItemCleared() && !ok {
|
||||
if meu.mutation.ItemCleared() && len(meu.mutation.ItemIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "MaintenanceEntry.item"`)
|
||||
}
|
||||
return nil
|
||||
@@ -498,7 +498,7 @@ func (meuo *MaintenanceEntryUpdateOne) check() error {
|
||||
return &ValidationError{Name: "description", err: fmt.Errorf(`ent: validator failed for field "MaintenanceEntry.description": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := meuo.mutation.ItemID(); meuo.mutation.ItemCleared() && !ok {
|
||||
if meuo.mutation.ItemCleared() && len(meuo.mutation.ItemIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "MaintenanceEntry.item"`)
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -54,12 +54,10 @@ type NotifierEdges struct {
|
||||
// GroupOrErr returns the Group value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e NotifierEdges) GroupOrErr() (*Group, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Group == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
if e.Group != nil {
|
||||
return e.Group, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "group"}
|
||||
}
|
||||
@@ -67,12 +65,10 @@ func (e NotifierEdges) GroupOrErr() (*Group, error) {
|
||||
// UserOrErr returns the User value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e NotifierEdges) UserOrErr() (*User, error) {
|
||||
if e.loadedTypes[1] {
|
||||
if e.User == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: user.Label}
|
||||
}
|
||||
if e.User != nil {
|
||||
return e.User, nil
|
||||
} else if e.loadedTypes[1] {
|
||||
return nil, &NotFoundError{label: user.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "user"}
|
||||
}
|
||||
|
||||
@@ -199,10 +199,10 @@ func (nc *NotifierCreate) check() error {
|
||||
if _, ok := nc.mutation.IsActive(); !ok {
|
||||
return &ValidationError{Name: "is_active", err: errors.New(`ent: missing required field "Notifier.is_active"`)}
|
||||
}
|
||||
if _, ok := nc.mutation.GroupID(); !ok {
|
||||
if len(nc.mutation.GroupIDs()) == 0 {
|
||||
return &ValidationError{Name: "group", err: errors.New(`ent: missing required edge "Notifier.group"`)}
|
||||
}
|
||||
if _, ok := nc.mutation.UserID(); !ok {
|
||||
if len(nc.mutation.UserIDs()) == 0 {
|
||||
return &ValidationError{Name: "user", err: errors.New(`ent: missing required edge "Notifier.user"`)}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -109,7 +110,7 @@ func (nq *NotifierQuery) QueryUser() *UserQuery {
|
||||
// First returns the first Notifier entity from the query.
|
||||
// Returns a *NotFoundError when no Notifier was found.
|
||||
func (nq *NotifierQuery) First(ctx context.Context) (*Notifier, error) {
|
||||
nodes, err := nq.Limit(1).All(setContextOp(ctx, nq.ctx, "First"))
|
||||
nodes, err := nq.Limit(1).All(setContextOp(ctx, nq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -132,7 +133,7 @@ func (nq *NotifierQuery) FirstX(ctx context.Context) *Notifier {
|
||||
// Returns a *NotFoundError when no Notifier ID was found.
|
||||
func (nq *NotifierQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = nq.Limit(1).IDs(setContextOp(ctx, nq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = nq.Limit(1).IDs(setContextOp(ctx, nq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -155,7 +156,7 @@ func (nq *NotifierQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one Notifier entity is found.
|
||||
// Returns a *NotFoundError when no Notifier entities are found.
|
||||
func (nq *NotifierQuery) Only(ctx context.Context) (*Notifier, error) {
|
||||
nodes, err := nq.Limit(2).All(setContextOp(ctx, nq.ctx, "Only"))
|
||||
nodes, err := nq.Limit(2).All(setContextOp(ctx, nq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -183,7 +184,7 @@ func (nq *NotifierQuery) OnlyX(ctx context.Context) *Notifier {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (nq *NotifierQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = nq.Limit(2).IDs(setContextOp(ctx, nq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = nq.Limit(2).IDs(setContextOp(ctx, nq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -208,7 +209,7 @@ func (nq *NotifierQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of Notifiers.
|
||||
func (nq *NotifierQuery) All(ctx context.Context) ([]*Notifier, error) {
|
||||
ctx = setContextOp(ctx, nq.ctx, "All")
|
||||
ctx = setContextOp(ctx, nq.ctx, ent.OpQueryAll)
|
||||
if err := nq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -230,7 +231,7 @@ func (nq *NotifierQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) {
|
||||
if nq.ctx.Unique == nil && nq.path != nil {
|
||||
nq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, nq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, nq.ctx, ent.OpQueryIDs)
|
||||
if err = nq.Select(notifier.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -248,7 +249,7 @@ func (nq *NotifierQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (nq *NotifierQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, nq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, nq.ctx, ent.OpQueryCount)
|
||||
if err := nq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -266,7 +267,7 @@ func (nq *NotifierQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (nq *NotifierQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, nq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, nq.ctx, ent.OpQueryExist)
|
||||
switch _, err := nq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -604,7 +605,7 @@ func (ngb *NotifierGroupBy) Aggregate(fns ...AggregateFunc) *NotifierGroupBy {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ngb *NotifierGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ngb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, ngb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := ngb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -652,7 +653,7 @@ func (ns *NotifierSelect) Aggregate(fns ...AggregateFunc) *NotifierSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ns *NotifierSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ns.ctx, "Select")
|
||||
ctx = setContextOp(ctx, ns.ctx, ent.OpQuerySelect)
|
||||
if err := ns.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -182,10 +182,10 @@ func (nu *NotifierUpdate) check() error {
|
||||
return &ValidationError{Name: "url", err: fmt.Errorf(`ent: validator failed for field "Notifier.url": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := nu.mutation.GroupID(); nu.mutation.GroupCleared() && !ok {
|
||||
if nu.mutation.GroupCleared() && len(nu.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Notifier.group"`)
|
||||
}
|
||||
if _, ok := nu.mutation.UserID(); nu.mutation.UserCleared() && !ok {
|
||||
if nu.mutation.UserCleared() && len(nu.mutation.UserIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Notifier.user"`)
|
||||
}
|
||||
return nil
|
||||
@@ -457,10 +457,10 @@ func (nuo *NotifierUpdateOne) check() error {
|
||||
return &ValidationError{Name: "url", err: fmt.Errorf(`ent: validator failed for field "Notifier.url": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := nuo.mutation.GroupID(); nuo.mutation.GroupCleared() && !ok {
|
||||
if nuo.mutation.GroupCleared() && len(nuo.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Notifier.group"`)
|
||||
}
|
||||
if _, ok := nuo.mutation.UserID(); nuo.mutation.UserCleared() && !ok {
|
||||
if nuo.mutation.UserCleared() && len(nuo.mutation.UserIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "Notifier.user"`)
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -5,6 +5,6 @@ package runtime
|
||||
// The schema-stitching logic is generated in github.com/sysadminsmedia/homebox/backend/internal/data/ent/runtime.go
|
||||
|
||||
const (
|
||||
Version = "v0.12.5" // Version of ent codegen.
|
||||
Sum = "h1:KREM5E4CSoej4zeGa88Ou/gfturAnpUv0mzAjch1sj4=" // Sum of ent codegen.
|
||||
Version = "v0.14.1" // Version of ent codegen.
|
||||
Sum = "h1:fUERL506Pqr92EPHJqr8EYxbPioflJo6PudkrEA8a/s=" // Sum of ent codegen.
|
||||
)
|
||||
|
||||
@@ -60,12 +60,10 @@ type UserEdges struct {
|
||||
// GroupOrErr returns the Group value or an error if the edge
|
||||
// was not loaded in eager-loading, or loaded but was not found.
|
||||
func (e UserEdges) GroupOrErr() (*Group, error) {
|
||||
if e.loadedTypes[0] {
|
||||
if e.Group == nil {
|
||||
// Edge was loaded but was not found.
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
if e.Group != nil {
|
||||
return e.Group, nil
|
||||
} else if e.loadedTypes[0] {
|
||||
return nil, &NotFoundError{label: group.Label}
|
||||
}
|
||||
return nil, &NotLoadedError{edge: "group"}
|
||||
}
|
||||
|
||||
@@ -288,7 +288,7 @@ func (uc *UserCreate) check() error {
|
||||
return &ValidationError{Name: "role", err: fmt.Errorf(`ent: validator failed for field "User.role": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := uc.mutation.GroupID(); !ok {
|
||||
if len(uc.mutation.GroupIDs()) == 0 {
|
||||
return &ValidationError{Name: "group", err: errors.New(`ent: missing required edge "User.group"`)}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"entgo.io/ent"
|
||||
"entgo.io/ent/dialect/sql"
|
||||
"entgo.io/ent/dialect/sql/sqlgraph"
|
||||
"entgo.io/ent/schema/field"
|
||||
@@ -135,7 +136,7 @@ func (uq *UserQuery) QueryNotifiers() *NotifierQuery {
|
||||
// First returns the first User entity from the query.
|
||||
// Returns a *NotFoundError when no User was found.
|
||||
func (uq *UserQuery) First(ctx context.Context) (*User, error) {
|
||||
nodes, err := uq.Limit(1).All(setContextOp(ctx, uq.ctx, "First"))
|
||||
nodes, err := uq.Limit(1).All(setContextOp(ctx, uq.ctx, ent.OpQueryFirst))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -158,7 +159,7 @@ func (uq *UserQuery) FirstX(ctx context.Context) *User {
|
||||
// Returns a *NotFoundError when no User ID was found.
|
||||
func (uq *UserQuery) FirstID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = uq.Limit(1).IDs(setContextOp(ctx, uq.ctx, "FirstID")); err != nil {
|
||||
if ids, err = uq.Limit(1).IDs(setContextOp(ctx, uq.ctx, ent.OpQueryFirstID)); err != nil {
|
||||
return
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
@@ -181,7 +182,7 @@ func (uq *UserQuery) FirstIDX(ctx context.Context) uuid.UUID {
|
||||
// Returns a *NotSingularError when more than one User entity is found.
|
||||
// Returns a *NotFoundError when no User entities are found.
|
||||
func (uq *UserQuery) Only(ctx context.Context) (*User, error) {
|
||||
nodes, err := uq.Limit(2).All(setContextOp(ctx, uq.ctx, "Only"))
|
||||
nodes, err := uq.Limit(2).All(setContextOp(ctx, uq.ctx, ent.OpQueryOnly))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -209,7 +210,7 @@ func (uq *UserQuery) OnlyX(ctx context.Context) *User {
|
||||
// Returns a *NotFoundError when no entities are found.
|
||||
func (uq *UserQuery) OnlyID(ctx context.Context) (id uuid.UUID, err error) {
|
||||
var ids []uuid.UUID
|
||||
if ids, err = uq.Limit(2).IDs(setContextOp(ctx, uq.ctx, "OnlyID")); err != nil {
|
||||
if ids, err = uq.Limit(2).IDs(setContextOp(ctx, uq.ctx, ent.OpQueryOnlyID)); err != nil {
|
||||
return
|
||||
}
|
||||
switch len(ids) {
|
||||
@@ -234,7 +235,7 @@ func (uq *UserQuery) OnlyIDX(ctx context.Context) uuid.UUID {
|
||||
|
||||
// All executes the query and returns a list of Users.
|
||||
func (uq *UserQuery) All(ctx context.Context) ([]*User, error) {
|
||||
ctx = setContextOp(ctx, uq.ctx, "All")
|
||||
ctx = setContextOp(ctx, uq.ctx, ent.OpQueryAll)
|
||||
if err := uq.prepareQuery(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -256,7 +257,7 @@ func (uq *UserQuery) IDs(ctx context.Context) (ids []uuid.UUID, err error) {
|
||||
if uq.ctx.Unique == nil && uq.path != nil {
|
||||
uq.Unique(true)
|
||||
}
|
||||
ctx = setContextOp(ctx, uq.ctx, "IDs")
|
||||
ctx = setContextOp(ctx, uq.ctx, ent.OpQueryIDs)
|
||||
if err = uq.Select(user.FieldID).Scan(ctx, &ids); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -274,7 +275,7 @@ func (uq *UserQuery) IDsX(ctx context.Context) []uuid.UUID {
|
||||
|
||||
// Count returns the count of the given query.
|
||||
func (uq *UserQuery) Count(ctx context.Context) (int, error) {
|
||||
ctx = setContextOp(ctx, uq.ctx, "Count")
|
||||
ctx = setContextOp(ctx, uq.ctx, ent.OpQueryCount)
|
||||
if err := uq.prepareQuery(ctx); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -292,7 +293,7 @@ func (uq *UserQuery) CountX(ctx context.Context) int {
|
||||
|
||||
// Exist returns true if the query has elements in the graph.
|
||||
func (uq *UserQuery) Exist(ctx context.Context) (bool, error) {
|
||||
ctx = setContextOp(ctx, uq.ctx, "Exist")
|
||||
ctx = setContextOp(ctx, uq.ctx, ent.OpQueryExist)
|
||||
switch _, err := uq.FirstID(ctx); {
|
||||
case IsNotFound(err):
|
||||
return false, nil
|
||||
@@ -687,7 +688,7 @@ func (ugb *UserGroupBy) Aggregate(fns ...AggregateFunc) *UserGroupBy {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (ugb *UserGroupBy) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, ugb.build.ctx, "GroupBy")
|
||||
ctx = setContextOp(ctx, ugb.build.ctx, ent.OpQueryGroupBy)
|
||||
if err := ugb.build.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -735,7 +736,7 @@ func (us *UserSelect) Aggregate(fns ...AggregateFunc) *UserSelect {
|
||||
|
||||
// Scan applies the selector query and scans the result into the given value.
|
||||
func (us *UserSelect) Scan(ctx context.Context, v any) error {
|
||||
ctx = setContextOp(ctx, us.ctx, "Select")
|
||||
ctx = setContextOp(ctx, us.ctx, ent.OpQuerySelect)
|
||||
if err := us.prepareQuery(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -294,7 +294,7 @@ func (uu *UserUpdate) check() error {
|
||||
return &ValidationError{Name: "role", err: fmt.Errorf(`ent: validator failed for field "User.role": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := uu.mutation.GroupID(); uu.mutation.GroupCleared() && !ok {
|
||||
if uu.mutation.GroupCleared() && len(uu.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "User.group"`)
|
||||
}
|
||||
return nil
|
||||
@@ -753,7 +753,7 @@ func (uuo *UserUpdateOne) check() error {
|
||||
return &ValidationError{Name: "role", err: fmt.Errorf(`ent: validator failed for field "User.role": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := uuo.mutation.GroupID(); uuo.mutation.GroupCleared() && !ok {
|
||||
if uuo.mutation.GroupCleared() && len(uuo.mutation.GroupIDs()) > 0 {
|
||||
return errors.New(`ent: clearing a required unique edge "User.group"`)
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -87,11 +87,11 @@ func (r *AttachmentRepo) Get(ctx context.Context, id uuid.UUID) (*ent.Attachment
|
||||
Only(ctx)
|
||||
}
|
||||
|
||||
func (r *AttachmentRepo) Update(ctx context.Context, itemID uuid.UUID, data *ItemAttachmentUpdate) (*ent.Attachment, error) {
|
||||
func (r *AttachmentRepo) Update(ctx context.Context, id uuid.UUID, data *ItemAttachmentUpdate) (*ent.Attachment, error) {
|
||||
// TODO: execute within Tx
|
||||
typ := attachment.Type(data.Type)
|
||||
|
||||
bldr := r.db.Attachment.UpdateOneID(itemID).
|
||||
bldr := r.db.Attachment.UpdateOneID(id).
|
||||
SetType(typ)
|
||||
|
||||
// Primary only applies to photos
|
||||
@@ -101,7 +101,12 @@ func (r *AttachmentRepo) Update(ctx context.Context, itemID uuid.UUID, data *Ite
|
||||
bldr = bldr.SetPrimary(false)
|
||||
}
|
||||
|
||||
itm, err := bldr.Save(ctx)
|
||||
updatedAttachment, err := bldr.Save(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
attachmentItem, err := updatedAttachment.QueryItem().Only(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -109,8 +114,8 @@ func (r *AttachmentRepo) Update(ctx context.Context, itemID uuid.UUID, data *Ite
|
||||
// Ensure all other attachments are not primary
|
||||
err = r.db.Attachment.Update().
|
||||
Where(
|
||||
attachment.HasItemWith(item.ID(itemID)),
|
||||
attachment.IDNEQ(itm.ID),
|
||||
attachment.HasItemWith(item.ID(attachmentItem.ID)),
|
||||
attachment.IDNEQ(updatedAttachment.ID),
|
||||
).
|
||||
SetPrimary(false).
|
||||
Exec(ctx)
|
||||
@@ -118,7 +123,7 @@ func (r *AttachmentRepo) Update(ctx context.Context, itemID uuid.UUID, data *Ite
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return r.Get(ctx, itm.ID)
|
||||
return r.Get(ctx, updatedAttachment.ID)
|
||||
}
|
||||
|
||||
func (r *AttachmentRepo) Delete(ctx context.Context, id uuid.UUID) error {
|
||||
|
||||
@@ -133,3 +133,25 @@ func TestAttachmentRepo_Delete(t *testing.T) {
|
||||
_, err = tRepos.Attachments.Get(context.Background(), entity.ID)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestAttachmentRepo_EnsureSinglePrimaryAttachment(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
attachments := useAttachments(t, 2)
|
||||
|
||||
setAndVerifyPrimary := func(primaryAttachmentID, nonPrimaryAttachmentID uuid.UUID) {
|
||||
primaryAttachment, err := tRepos.Attachments.Update(ctx, primaryAttachmentID, &ItemAttachmentUpdate{
|
||||
Type: attachment.TypePhoto.String(),
|
||||
Primary: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
nonPrimaryAttachment, err := tRepos.Attachments.Get(ctx, nonPrimaryAttachmentID)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.True(t, primaryAttachment.Primary)
|
||||
assert.False(t, nonPrimaryAttachment.Primary)
|
||||
}
|
||||
|
||||
setAndVerifyPrimary(attachments[0].ID, attachments[1].ID)
|
||||
setAndVerifyPrimary(attachments[1].ID, attachments[0].ID)
|
||||
}
|
||||
|
||||
@@ -93,12 +93,12 @@ type (
|
||||
// Purchase
|
||||
PurchaseTime types.Date `json:"purchaseTime"`
|
||||
PurchaseFrom string `json:"purchaseFrom" validate:"max=255"`
|
||||
PurchasePrice float64 `json:"purchasePrice,string"`
|
||||
PurchasePrice float64 `json:"purchasePrice" extensions:"x-nullable,x-omitempty"`
|
||||
|
||||
// Sold
|
||||
SoldTime types.Date `json:"soldTime"`
|
||||
SoldTo string `json:"soldTo" validate:"max=255"`
|
||||
SoldPrice float64 `json:"soldPrice,string"`
|
||||
SoldPrice float64 `json:"soldPrice" extensions:"x-nullable,x-omitempty"`
|
||||
SoldNotes string `json:"soldNotes"`
|
||||
|
||||
// Extras
|
||||
@@ -123,7 +123,7 @@ type (
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
|
||||
PurchasePrice float64 `json:"purchasePrice,string"`
|
||||
PurchasePrice float64 `json:"purchasePrice"`
|
||||
|
||||
// Edges
|
||||
Location *LocationSummary `json:"location,omitempty" extensions:"x-nullable,x-omitempty"`
|
||||
@@ -153,7 +153,7 @@ type (
|
||||
// Sold
|
||||
SoldTime types.Date `json:"soldTime"`
|
||||
SoldTo string `json:"soldTo"`
|
||||
SoldPrice float64 `json:"soldPrice,string"`
|
||||
SoldPrice float64 `json:"soldPrice"`
|
||||
SoldNotes string `json:"soldNotes"`
|
||||
|
||||
// Extras
|
||||
|
||||
@@ -2210,8 +2210,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"purchaseTime": {
|
||||
"description": "Purchase",
|
||||
@@ -2227,8 +2226,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"soldPrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"soldTime": {
|
||||
"description": "Sold",
|
||||
@@ -2316,8 +2314,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number"
|
||||
},
|
||||
"quantity": {
|
||||
"type": "integer"
|
||||
@@ -2340,6 +2337,9 @@
|
||||
},
|
||||
"repo.ItemUpdate": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"properties": {
|
||||
"archived": {
|
||||
"type": "boolean"
|
||||
@@ -2348,7 +2348,8 @@
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 1000
|
||||
},
|
||||
"fields": {
|
||||
"type": "array",
|
||||
@@ -2383,7 +2384,9 @@
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255,
|
||||
"minLength": 1
|
||||
},
|
||||
"notes": {
|
||||
"description": "Extras",
|
||||
@@ -2395,11 +2398,13 @@
|
||||
"x-omitempty": true
|
||||
},
|
||||
"purchaseFrom": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255
|
||||
},
|
||||
"purchasePrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number",
|
||||
"x-nullable": true,
|
||||
"x-omitempty": true
|
||||
},
|
||||
"purchaseTime": {
|
||||
"description": "Purchase",
|
||||
@@ -2416,15 +2421,17 @@
|
||||
"type": "string"
|
||||
},
|
||||
"soldPrice": {
|
||||
"type": "string",
|
||||
"example": "0"
|
||||
"type": "number",
|
||||
"x-nullable": true,
|
||||
"x-omitempty": true
|
||||
},
|
||||
"soldTime": {
|
||||
"description": "Sold",
|
||||
"type": "string"
|
||||
},
|
||||
"soldTo": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"maxLength": 255
|
||||
},
|
||||
"warrantyDetails": {
|
||||
"type": "string"
|
||||
@@ -2756,7 +2763,6 @@
|
||||
"type": "string"
|
||||
},
|
||||
"url": {
|
||||
"description": "URL field is not exposed to the client",
|
||||
"type": "string"
|
||||
},
|
||||
"userId": {
|
||||
|
||||
@@ -35,7 +35,7 @@ swagger update command `task swag`
|
||||
|
||||
### Frontend Development Notes
|
||||
|
||||
start command `task: ui:dev`
|
||||
start command `task ui:dev`
|
||||
|
||||
1. The frontend is a Vue 3 app with Nuxt.js that uses Tailwind and DaisyUI for styling.
|
||||
2. We're using Vitest for our automated testing. You can run these with `task ui:watch`.
|
||||
|
||||
@@ -28,3 +28,61 @@
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background-color: #9B9B9B;
|
||||
}
|
||||
|
||||
.scroll-bg::-webkit-scrollbar {
|
||||
width: 0.5rem;
|
||||
}
|
||||
|
||||
.scroll-bg::-webkit-scrollbar-thumb {
|
||||
border-radius: 0.25rem;
|
||||
@apply bg-base-300;
|
||||
}
|
||||
|
||||
.markdown > :first-child {
|
||||
margin-top: 0px !important;
|
||||
}
|
||||
|
||||
.markdown :where(p, ul, ol, dl, blockquote, h1, h2, h3, h4, h5, h6) {
|
||||
margin-top: var(--y-gap);
|
||||
margin-bottom: var(--y-gap);
|
||||
}
|
||||
|
||||
.markdown :where(ul) {
|
||||
list-style: disc;
|
||||
margin-left: 2rem;
|
||||
}
|
||||
|
||||
.markdown :where(ol) {
|
||||
list-style: decimal;
|
||||
margin-left: 2rem;
|
||||
}
|
||||
/* Heading Styles */
|
||||
.markdown :where(h1) {
|
||||
font-size: 2rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h2) {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h3) {
|
||||
font-size: 1.25rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h4) {
|
||||
font-size: 1rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h5) {
|
||||
font-size: 0.875rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h6) {
|
||||
font-size: 0.75rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
class="flex items-center text-3xl font-bold tracking-tight"
|
||||
:class="{
|
||||
'text-neutral-content': dark,
|
||||
'text-content': !dark,
|
||||
}"
|
||||
>
|
||||
<slot />
|
||||
|
||||
@@ -85,7 +85,10 @@
|
||||
type Props = {
|
||||
label: string;
|
||||
modelValue: SupportValues | null | undefined;
|
||||
items: string[] | object[];
|
||||
items: {
|
||||
id: string;
|
||||
treeString: string;
|
||||
}[];
|
||||
display?: string;
|
||||
multiple?: boolean;
|
||||
};
|
||||
@@ -156,11 +159,28 @@
|
||||
|
||||
const matches = index.value.search("*" + search.value + "*");
|
||||
|
||||
const resultIDs = [];
|
||||
for (let i = 0; i < matches.length; i++) {
|
||||
const match = matches[i];
|
||||
const item = props.items[parseInt(match.ref)];
|
||||
const display = extractDisplay(item);
|
||||
list.push({ id: i, display, value: item });
|
||||
resultIDs.push(item.id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Supplementary search,
|
||||
* Resolve the issue of language not being supported
|
||||
*/
|
||||
for (let i = 0; i < props.items.length; i++) {
|
||||
const item = props.items[i];
|
||||
if (resultIDs.find(item_ => item_ === item.id) !== undefined) {
|
||||
continue;
|
||||
}
|
||||
if (item.treeString.includes(search.value)) {
|
||||
const display = extractDisplay(item);
|
||||
list.push({ id: i, display, value: item });
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
:class="{
|
||||
'text-red-600':
|
||||
typeof value === 'string' &&
|
||||
((maxLength && value.length > maxLength) || (minLength && value.length < minLength)),
|
||||
((maxLength !== -1 && value.length > maxLength) || (minLength !== -1 && value.length < minLength)),
|
||||
}"
|
||||
>
|
||||
{{ typeof value === "string" && (maxLength || minLength) ? `${value.length}/${maxLength}` : "" }}
|
||||
{{ typeof value === "string" && (maxLength !== -1 || minLength !== -1) ? `${value.length}/${maxLength}` : "" }}
|
||||
</span>
|
||||
</label>
|
||||
<textarea ref="el" v-model="value" class="textarea textarea-bordered h-28 w-full" :placeholder="placeholder" />
|
||||
@@ -21,10 +21,10 @@
|
||||
:class="{
|
||||
'text-red-600':
|
||||
typeof value === 'string' &&
|
||||
((maxLength && value.length > maxLength) || (minLength && value.length < minLength)),
|
||||
((maxLength !== -1 && value.length > maxLength) || (minLength !== -1 && value.length < minLength)),
|
||||
}"
|
||||
>
|
||||
{{ typeof value === "string" && (maxLength || minLength) ? `${value.length}/${maxLength}` : "" }}
|
||||
{{ typeof value === "string" && (maxLength !== -1 || minLength !== -1) ? `${value.length}/${maxLength}` : "" }}
|
||||
</span>
|
||||
</label>
|
||||
<textarea
|
||||
@@ -63,10 +63,12 @@
|
||||
},
|
||||
maxLength: {
|
||||
type: Number,
|
||||
default: -1,
|
||||
required: false,
|
||||
},
|
||||
minLength: {
|
||||
type: Number,
|
||||
default: -1,
|
||||
required: false,
|
||||
},
|
||||
});
|
||||
@@ -84,7 +86,4 @@
|
||||
});
|
||||
|
||||
const value = useVModel(props, "modelValue", emit);
|
||||
const valueLen = computed(() => {
|
||||
return value.value ? value.value.length : 0;
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
:class="{
|
||||
'text-red-600':
|
||||
typeof value === 'string' &&
|
||||
((maxLength && value.length > maxLength) || (minLength && value.length < minLength)),
|
||||
((maxLength !== -1 && value.length > maxLength) || (minLength !== -1 && value.length < minLength)),
|
||||
}"
|
||||
>
|
||||
{{ typeof value === "string" && (maxLength || minLength) ? `${value.length}/${maxLength}` : "" }}
|
||||
{{ typeof value === "string" && (maxLength !== -1 || minLength !== -1) ? `${value.length}/${maxLength}` : "" }}
|
||||
</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -28,10 +28,10 @@
|
||||
:class="{
|
||||
'text-red-600':
|
||||
typeof value === 'string' &&
|
||||
((maxLength && value.length > maxLength) || (minLength && value.length < minLength)),
|
||||
((maxLength !== -1 && value.length > maxLength) || (minLength !== -1 && value.length < minLength)),
|
||||
}"
|
||||
>
|
||||
{{ typeof value === "string" && (maxLength || minLength) ? `${value.length}/${maxLength}` : "" }}
|
||||
{{ typeof value === "string" && (maxLength !== -1 || minLength !== -1) ? `${value.length}/${maxLength}` : "" }}
|
||||
</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -76,10 +76,12 @@
|
||||
},
|
||||
maxLength: {
|
||||
type: Number,
|
||||
default: -1,
|
||||
required: false,
|
||||
},
|
||||
minLength: {
|
||||
type: Number,
|
||||
default: -1,
|
||||
required: false,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,19 +1,25 @@
|
||||
<template>
|
||||
<NuxtLink class="group card rounded-md border border-gray-300" :to="`/item/${item.id}`">
|
||||
<div class="relative h-[200px]">
|
||||
<img v-if="imageUrl" class="h-[200px] w-full rounded-t border-gray-300 object-cover shadow-sm" :src="imageUrl" />
|
||||
<div class="absolute bottom-1 left-1">
|
||||
<img
|
||||
v-if="imageUrl"
|
||||
class="h-[200px] w-full rounded-t border-gray-300 object-cover shadow-sm"
|
||||
:src="imageUrl"
|
||||
alt=""
|
||||
/>
|
||||
<div class="absolute bottom-1 left-1 text-wrap">
|
||||
<NuxtLink
|
||||
v-if="item.location"
|
||||
class="badge rounded-md text-sm shadow-md hover:link"
|
||||
:to="`/location/${item.location.id}`"
|
||||
loading="lazy"
|
||||
>
|
||||
{{ item.location.name }}
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-span-4 flex grow flex-col gap-y-1 rounded-b bg-base-100 p-4 pt-2">
|
||||
<h2 class="line-clamp-2 text-ellipsis text-lg font-bold">{{ item.name }}</h2>
|
||||
<h2 class="line-clamp-2 text-ellipsis text-wrap text-lg font-bold">{{ item.name }}</h2>
|
||||
<div class="divider my-0"></div>
|
||||
<div class="flex gap-2">
|
||||
<div v-if="item.insured" class="tooltip z-10" data-tip="Insured">
|
||||
|
||||
@@ -8,17 +8,27 @@
|
||||
v-model="form.name"
|
||||
:trigger-focus="focused"
|
||||
:autofocus="true"
|
||||
label="Item Name"
|
||||
:label="$t('components.item.create_modal.item_name')"
|
||||
:max-length="255"
|
||||
:min-length="1"
|
||||
/>
|
||||
<FormTextArea v-model="form.description" label="Item Description" :max-length="1000" />
|
||||
<FormMultiselect v-model="form.labels" label="Labels" :items="labels ?? []" />
|
||||
<FormTextArea
|
||||
v-model="form.description"
|
||||
:label="$t('components.item.create_modal.item_description')"
|
||||
:max-length="1000"
|
||||
/>
|
||||
<FormMultiselect v-model="form.labels" :label="$t('global.labels')" :items="labels ?? []" />
|
||||
|
||||
<div class="modal-action mb-6">
|
||||
<div>
|
||||
<label for="photo" class="btn">{{ $t("components.item.create_modal.photo_button") }}</label>
|
||||
<input id="photo" class="hidden" type="file" accept="image/png,image/jpeg,image/gif" @change="previewImage" />
|
||||
<input
|
||||
id="photo"
|
||||
class="hidden"
|
||||
type="file"
|
||||
accept="image/png,image/jpeg,image/gif,image/avif,image/webp"
|
||||
@change="previewImage"
|
||||
/>
|
||||
</div>
|
||||
<div class="grow"></div>
|
||||
<div>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
}"
|
||||
>
|
||||
<template v-if="typeof h === 'string'">{{ h }}</template>
|
||||
<template v-else>{{ h.text }}</template>
|
||||
<template v-else>{{ $t(h.text) }}</template>
|
||||
<div
|
||||
v-if="sortByProperty === h.value"
|
||||
:class="`inline-flex ${sortByProperty === h.value ? '' : 'opacity-0'}`"
|
||||
@@ -45,7 +45,7 @@
|
||||
}"
|
||||
>
|
||||
<template v-if="h.type === 'name'">
|
||||
<NuxtLink class="hover" :to="`/item/${d.id}`">
|
||||
<NuxtLink class="hover text-wrap" :to="`/item/${d.id}`">
|
||||
{{ d.name }}
|
||||
</NuxtLink>
|
||||
</template>
|
||||
@@ -83,7 +83,7 @@
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content rounded-box flex w-64 flex-col gap-2 bg-base-100 p-2 pl-3 shadow">
|
||||
<li>Headers:</li>
|
||||
<li v-for="(h, i) in headers" class="flex flex-row items-center gap-1">
|
||||
<li v-for="(h, i) in headers" :key="h.value" class="flex flex-row items-center gap-1">
|
||||
<button
|
||||
class="btn btn-square btn-ghost btn-xs"
|
||||
:class="{
|
||||
@@ -109,11 +109,11 @@
|
||||
:checked="h.enabled"
|
||||
@change="toggleHeader(h.value)"
|
||||
/>
|
||||
<label class="label-text" :for="h.value"> {{ h.text }} </label>
|
||||
<label class="label-text" :for="h.value"> {{ $t(h.text) }} </label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="hidden md:block">Rows per page</div>
|
||||
<div class="hidden md:block">{{ $t("components.item.view.table.rows_per_page") }}</div>
|
||||
<select v-model.number="pagination.rowsPerPage" class="select select-primary select-sm">
|
||||
<option :value="10">10</option>
|
||||
<option :value="25">25</option>
|
||||
@@ -122,7 +122,7 @@
|
||||
</select>
|
||||
<div class="btn-group">
|
||||
<button :disabled="!hasPrev" class="btn btn-sm" @click="prev()">«</button>
|
||||
<button class="btn btn-sm">Page {{ pagination.page }}</button>
|
||||
<button class="btn btn-sm">{{ $t("components.item.view.table.page") }} {{ pagination.page }}</button>
|
||||
<button :disabled="!hasNext" class="btn btn-sm" @click="next()">»</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -149,20 +149,29 @@
|
||||
const preferences = useViewPreferences();
|
||||
|
||||
const defaultHeaders = [
|
||||
{ text: "Name", value: "name", enabled: true, type: "name" },
|
||||
{ text: "Quantity", value: "quantity", align: "center", enabled: true },
|
||||
{ text: "Insured", value: "insured", align: "center", enabled: true, type: "boolean" },
|
||||
{ text: "Price", value: "purchasePrice", align: "center", enabled: true, type: "price" },
|
||||
{ text: "Location", value: "location", align: "center", enabled: false, type: "location" },
|
||||
{ text: "Archived", value: "archived", align: "center", enabled: false, type: "boolean" },
|
||||
{ text: "Created At", value: "createdAt", align: "center", enabled: false, type: "date" },
|
||||
{ text: "Updated At", value: "updatedAt", align: "center", enabled: false, type: "date" },
|
||||
{
|
||||
text: "items.name",
|
||||
value: "name",
|
||||
enabled: true,
|
||||
type: "name",
|
||||
},
|
||||
{ text: "items.quantity", value: "quantity", align: "center", enabled: true },
|
||||
{ text: "items.insured", value: "insured", align: "center", enabled: true, type: "boolean" },
|
||||
{ text: "items.purchase_price", value: "purchasePrice", align: "center", enabled: true, type: "price" },
|
||||
{ text: "items.location", value: "location", align: "center", enabled: false, type: "location" },
|
||||
{ text: "items.archived", value: "archived", align: "center", enabled: false, type: "boolean" },
|
||||
{ text: "items.created_at", value: "createdAt", align: "center", enabled: false, type: "date" },
|
||||
{ text: "items.updated_at", value: "updatedAt", align: "center", enabled: false, type: "date" },
|
||||
] satisfies TableHeader[];
|
||||
|
||||
const headers = ref<TableHeader[]>(
|
||||
(preferences.value.tableHeaders ?? []).concat(
|
||||
defaultHeaders.filter(h => !preferences.value.tableHeaders?.find(h2 => h2.value === h.value))
|
||||
)
|
||||
(preferences.value.tableHeaders ?? [])
|
||||
.concat(defaultHeaders.filter(h => !preferences.value.tableHeaders?.find(h2 => h2.value === h.value)))
|
||||
// this is a hack to make sure that any changes to the defaultHeaders are reflected in the preferences
|
||||
.map(h => ({
|
||||
...(defaultHeaders.find(h2 => h2.value === h.value) as TableHeader),
|
||||
enabled: h.enabled,
|
||||
}))
|
||||
);
|
||||
|
||||
console.log(headers.value);
|
||||
|
||||
@@ -7,11 +7,15 @@
|
||||
v-model="form.name"
|
||||
:trigger-focus="focused"
|
||||
:autofocus="true"
|
||||
label="Label Name"
|
||||
:label="$t('components.label.create_modal.label_name')"
|
||||
:max-length="255"
|
||||
:min-length="1"
|
||||
/>
|
||||
<FormTextArea v-model="form.description" label="Label Description" :max-length="255" />
|
||||
<FormTextArea
|
||||
v-model="form.description"
|
||||
:label="$t('components.label.create_modal.label_description')"
|
||||
:max-length="255"
|
||||
/>
|
||||
<div class="modal-action">
|
||||
<div class="flex justify-center">
|
||||
<BaseButton class="rounded-r-none" :loading="loading" type="submit"> {{ $t("global.create") }} </BaseButton>
|
||||
|
||||
@@ -8,11 +8,15 @@
|
||||
:trigger-focus="focused"
|
||||
:autofocus="true"
|
||||
:required="true"
|
||||
label="Location Name"
|
||||
:label="$t('components.location.create_modal.location_name')"
|
||||
:max-length="255"
|
||||
:min-length="1"
|
||||
/>
|
||||
<FormTextArea v-model="form.description" label="Location Description" :max-length="1000" />
|
||||
<FormTextArea
|
||||
v-model="form.description"
|
||||
:label="$t('components.location.create_modal.location_description')"
|
||||
:max-length="1000"
|
||||
/>
|
||||
<LocationSelector v-model="form.parent" />
|
||||
<div class="modal-action">
|
||||
<div class="flex justify-center">
|
||||
@@ -21,7 +25,7 @@
|
||||
<label tabindex="0" class="btn rounded-l-none rounded-r-xl">
|
||||
<MdiChevronDown class="size-5" />
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu rounded-box bg-base-100 right-0 w-64 p-2 shadow">
|
||||
<ul tabindex="0" class="dropdown-content menu rounded-box right-0 w-64 bg-base-100 p-2 shadow">
|
||||
<li>
|
||||
<button type="button" @click="create(false)">{{ $t("global.create_and_add") }}</button>
|
||||
</li>
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
<template>
|
||||
<FormAutocomplete2 v-if="locations" v-model="value" :items="locations" display="name" label="Parent Location">
|
||||
<FormAutocomplete2
|
||||
v-if="locations"
|
||||
v-model="value"
|
||||
:items="locations"
|
||||
display="name"
|
||||
:label="$t('components.location.selector.parent_location')"
|
||||
>
|
||||
<template #display="{ item, selected, active }">
|
||||
<div>
|
||||
<div class="flex w-full">
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- eslint-disable-next-line tailwindcss/no-custom-classname -->
|
||||
<div class="root border-2 p-4">
|
||||
<p v-if="locs.length === 0" class="text-center text-sm">
|
||||
{{ $t("location.tree.no_locations") }}
|
||||
|
||||
@@ -25,17 +25,17 @@
|
||||
},
|
||||
});
|
||||
|
||||
const { data: maintenanceDataList, refresh: refreshList } = useAsyncData<MaintenanceEntryWithDetails[]>(
|
||||
const { data: maintenanceDataList, refresh: refreshList } = useAsyncData(
|
||||
async () => {
|
||||
const { data } =
|
||||
props.currentItemId !== undefined
|
||||
? await api.items.maintenance.getLog(props.currentItemId, { status: maintenanceFilterStatus.value })
|
||||
: await api.maintenance.getAll({ status: maintenanceFilterStatus.value });
|
||||
console.log(data);
|
||||
return data as MaintenanceEntryWithDetails[];
|
||||
return data;
|
||||
},
|
||||
{
|
||||
watch: maintenanceFilterStatus,
|
||||
watch: [maintenanceFilterStatus],
|
||||
}
|
||||
);
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
<StatCard
|
||||
v-for="stat in stats"
|
||||
:key="stat.id"
|
||||
class="stats border-l-primary block shadow-xl"
|
||||
class="stats block border-l-primary shadow-xl"
|
||||
:title="stat.title"
|
||||
:value="stat.value"
|
||||
:type="stat.type"
|
||||
@@ -189,7 +189,7 @@
|
||||
<div v-if="props.currentItemId" class="hidden first:block">
|
||||
<button
|
||||
type="button"
|
||||
class="border-base-content relative block w-full rounded-lg border-2 border-dashed p-12 text-center"
|
||||
class="relative block w-full rounded-lg border-2 border-dashed border-base-content p-12 text-center"
|
||||
@click="maintenanceEditModal?.openCreateModal(props.currentItemId)"
|
||||
>
|
||||
<MdiWrenchClock class="inline size-16" />
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<dl class="sm:divide-y sm:divide-gray-300">
|
||||
<div v-for="(detail, i) in details" :key="i" class="group py-4 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||
<dt class="text-sm font-medium text-base-content">
|
||||
{{ detail.name }}
|
||||
{{ $t(detail.name) }}
|
||||
</dt>
|
||||
<dd class="text-start text-sm text-base-content sm:col-span-2">
|
||||
<slot :name="detail.slot || detail.name" v-bind="{ detail }">
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- eslint-disable-next-line vue/no-v-html -->
|
||||
<div class="markdown text-wrap" v-html="raw"></div>
|
||||
</template>
|
||||
|
||||
@@ -31,53 +32,4 @@
|
||||
* {
|
||||
--y-gap: 0.65rem;
|
||||
}
|
||||
|
||||
.markdown > :first-child {
|
||||
margin-top: 0px !important;
|
||||
}
|
||||
|
||||
.markdown :where(p, ul, ol, dl, blockquote, h1, h2, h3, h4, h5, h6) {
|
||||
margin-top: var(--y-gap);
|
||||
margin-bottom: var(--y-gap);
|
||||
}
|
||||
|
||||
.markdown :where(ul) {
|
||||
list-style: disc;
|
||||
margin-left: 2rem;
|
||||
}
|
||||
|
||||
.markdown :where(ol) {
|
||||
list-style: decimal;
|
||||
margin-left: 2rem;
|
||||
}
|
||||
/* Heading Styles */
|
||||
.markdown :where(h1) {
|
||||
font-size: 2rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h2) {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h3) {
|
||||
font-size: 1.25rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h4) {
|
||||
font-size: 1rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h5) {
|
||||
font-size: 0.875rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.markdown :where(h6) {
|
||||
font-size: 0.75rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import { useI18n } from "vue-i18n";
|
||||
import { type UseTimeAgoMessages, type UseTimeAgoUnitNamesDefault } from "@vueuse/core";
|
||||
|
||||
const cache = {
|
||||
currency: "",
|
||||
};
|
||||
@@ -37,6 +40,49 @@ function ordinalIndicator(num: number) {
|
||||
}
|
||||
}
|
||||
|
||||
export function useLocaleTimeAgo(date: Date) {
|
||||
const { t } = useI18n();
|
||||
|
||||
const I18N_MESSAGES: UseTimeAgoMessages<UseTimeAgoUnitNamesDefault> = {
|
||||
justNow: t("components.global.date_time.just-now"),
|
||||
past: n => (n.match(/\d/) ? t("components.global.date_time.ago", [n]) : n),
|
||||
future: n => (n.match(/\d/) ? t("components.global.date_time.in", [n]) : n),
|
||||
month: (n, past) =>
|
||||
n === 1
|
||||
? past
|
||||
? t("components.global.date_time.last-month")
|
||||
: t("components.global.date_time.next-month")
|
||||
: `${n} ${t(`components.global.date_time.months`)}`,
|
||||
year: (n, past) =>
|
||||
n === 1
|
||||
? past
|
||||
? t("components.global.date_time.last-year")
|
||||
: t("components.global.date_time.next-year")
|
||||
: `${n} ${t(`components.global.date_time.years`)}`,
|
||||
day: (n, past) =>
|
||||
n === 1
|
||||
? past
|
||||
? t("components.global.date_time.yesterday")
|
||||
: t("components.global.date_time.tomorrow")
|
||||
: `${n} ${t(`components.global.date_time.days`)}`,
|
||||
week: (n, past) =>
|
||||
n === 1
|
||||
? past
|
||||
? t("components.global.date_time.last-week")
|
||||
: t("components.global.date_time.next-week")
|
||||
: `${n} ${t(`components.global.date_time.weeks`)}`,
|
||||
hour: n => `${n} ${n === 1 ? t("components.global.date_time.hour") : t("components.global.date_time.hours")}`,
|
||||
minute: n => `${n} ${n === 1 ? t("components.global.date_time.minute") : t("components.global.date_time.minutes")}`,
|
||||
second: n => `${n} ${n === 1 ? t("components.global.date_time.second") : t("components.global.date_time.seconds")}`,
|
||||
invalid: "",
|
||||
};
|
||||
|
||||
return useTimeAgo(date, {
|
||||
fullDateFormatter: (date: Date) => date.toLocaleDateString(),
|
||||
messages: I18N_MESSAGES,
|
||||
});
|
||||
}
|
||||
|
||||
export function fmtDate(value: string | Date, fmt: DateTimeFormat = "human"): string {
|
||||
const months = [
|
||||
"January",
|
||||
@@ -64,7 +110,7 @@ export function fmtDate(value: string | Date, fmt: DateTimeFormat = "human"): st
|
||||
|
||||
switch (fmt) {
|
||||
case "relative":
|
||||
return useTimeAgo(dt).value + useDateFormat(dt, " (YYYY-MM-DD)").value;
|
||||
return useLocaleTimeAgo(dt).value + useDateFormat(dt, " (YYYY-MM-DD)").value;
|
||||
case "long":
|
||||
return useDateFormat(dt, "YYYY-MM-DD (dddd)").value;
|
||||
case "short":
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { Ref } from "vue";
|
||||
import type { TableHeader } from "components/Item/View/Table.types";
|
||||
import type { TableHeader } from "~/components/Item/View/Table.types";
|
||||
import type { DaisyTheme } from "~~/lib/data/themes";
|
||||
|
||||
export type ViewType = "table" | "card" | "tree";
|
||||
|
||||
@@ -12,15 +12,15 @@
|
||||
<AppToast />
|
||||
<div class="drawer drawer-mobile">
|
||||
<input id="my-drawer-2" v-model="drawerToggle" type="checkbox" class="drawer-toggle" />
|
||||
<div class="drawer-content bg-base-300 justify-center pt-20 lg:pt-0">
|
||||
<div class="drawer-content justify-center bg-base-300 pt-20 lg:pt-0">
|
||||
<AppHeaderDecor v-if="preferences.displayHeaderDecor" class="-mt-10 hidden lg:block" />
|
||||
<!-- Button -->
|
||||
<div class="navbar drawer-button bg-primary fixed top-0 z-[99] shadow-md lg:hidden">
|
||||
<div class="navbar drawer-button fixed top-0 z-[99] bg-primary shadow-md lg:hidden">
|
||||
<label for="my-drawer-2" class="btn btn-square btn-ghost drawer-button text-base-100 lg:hidden">
|
||||
<MdiMenu class="size-6" />
|
||||
</label>
|
||||
<NuxtLink to="/home">
|
||||
<h2 class="text-base-100 flex text-3xl font-bold tracking-tight">
|
||||
<h2 class="flex text-3xl font-bold tracking-tight text-base-100">
|
||||
HomeB
|
||||
<AppLogo class="-mb-3 w-8" />
|
||||
x
|
||||
@@ -29,7 +29,7 @@
|
||||
</div>
|
||||
|
||||
<slot></slot>
|
||||
<footer v-if="status" class="bg-base-300 text-secondary-content bottom-0 w-full pb-4 text-center">
|
||||
<footer v-if="status" class="bottom-0 w-full bg-base-300 pb-4 text-center text-secondary-content">
|
||||
<p class="text-center text-sm">
|
||||
{{ $t("global.version", { version: status.build.version }) }} ~
|
||||
{{ $t("global.build", { build: status.build.commit }) }}
|
||||
@@ -42,17 +42,17 @@
|
||||
<label for="my-drawer-2" class="drawer-overlay"></label>
|
||||
|
||||
<!-- Top Section -->
|
||||
<div class="bg-base-200 flex min-w-40 max-w-min flex-col p-5 md:py-10">
|
||||
<div class="flex min-w-40 max-w-min flex-col bg-base-200 p-5 md:py-10">
|
||||
<div class="space-y-8">
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
<p>{{ $t("global.welcome", { username: username }) }}</p>
|
||||
<NuxtLink class="avatar placeholder" to="/home">
|
||||
<div class="bg-base-300 text-neutral-content w-24 rounded-full p-4">
|
||||
<div class="w-24 rounded-full bg-base-300 p-4 text-neutral-content">
|
||||
<AppLogo />
|
||||
</div>
|
||||
</NuxtLink>
|
||||
</div>
|
||||
<div class="bg-base-200 flex flex-col">
|
||||
<div class="flex flex-col bg-base-200">
|
||||
<div class="mb-6">
|
||||
<div class="dropdown visible w-full">
|
||||
<label tabindex="0" class="text-no-transform btn btn-primary btn-block text-lg">
|
||||
@@ -61,10 +61,10 @@
|
||||
</span>
|
||||
{{ $t("global.create") }}
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu rounded-box bg-base-100 w-full p-2 shadow">
|
||||
<li v-for="btn in dropdown" :key="btn.name">
|
||||
<ul tabindex="0" class="dropdown-content menu rounded-box w-full bg-base-100 p-2 shadow">
|
||||
<li v-for="btn in dropdown" :key="btn.id">
|
||||
<button @click="btn.action">
|
||||
{{ btn.name }}
|
||||
{{ btn.name.value }}
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -81,7 +81,7 @@
|
||||
}"
|
||||
>
|
||||
<component :is="n.icon" class="mr-4 size-6" />
|
||||
{{ n.name }}
|
||||
{{ n.name.value }}
|
||||
</NuxtLink>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -89,7 +89,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Bottom -->
|
||||
<button class="rounded-btn hover:bg-base-300 mx-2 mt-auto p-3" @click="logout">
|
||||
<button class="rounded-btn mx-2 mt-auto p-3 hover:bg-base-300" @click="logout">
|
||||
{{ $t("global.sign_out") }}
|
||||
</button>
|
||||
</div>
|
||||
@@ -135,19 +135,22 @@
|
||||
|
||||
const dropdown = [
|
||||
{
|
||||
name: "Item / Asset",
|
||||
id: 0,
|
||||
name: computed(() => t("menu.create_item")),
|
||||
action: () => {
|
||||
modals.item = true;
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Location",
|
||||
id: 1,
|
||||
name: computed(() => t("menu.create_location")),
|
||||
action: () => {
|
||||
modals.location = true;
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Label",
|
||||
id: 2,
|
||||
name: computed(() => t("menu.create_label")),
|
||||
action: () => {
|
||||
modals.label = true;
|
||||
},
|
||||
@@ -168,42 +171,42 @@
|
||||
icon: MdiHome,
|
||||
active: computed(() => route.path === "/home"),
|
||||
id: 0,
|
||||
name: t("menu.home"),
|
||||
name: computed(() => t("menu.home")),
|
||||
to: "/home",
|
||||
},
|
||||
{
|
||||
icon: MdiFileTree,
|
||||
id: 1,
|
||||
active: computed(() => route.path === "/locations"),
|
||||
name: t("menu.locations"),
|
||||
name: computed(() => t("menu.locations")),
|
||||
to: "/locations",
|
||||
},
|
||||
{
|
||||
icon: MdiMagnify,
|
||||
id: 2,
|
||||
active: computed(() => route.path === "/items"),
|
||||
name: t("menu.search"),
|
||||
name: computed(() => t("menu.search")),
|
||||
to: "/items",
|
||||
},
|
||||
{
|
||||
icon: MdiWrench,
|
||||
id: 3,
|
||||
active: computed(() => route.path === "/maintenance"),
|
||||
name: t("menu.maintenance"),
|
||||
name: computed(() => t("menu.maintenance")),
|
||||
to: "/maintenance",
|
||||
},
|
||||
{
|
||||
icon: MdiAccount,
|
||||
id: 4,
|
||||
active: computed(() => route.path === "/profile"),
|
||||
name: t("menu.profile"),
|
||||
name: computed(() => t("menu.profile")),
|
||||
to: "/profile",
|
||||
},
|
||||
{
|
||||
icon: MdiCog,
|
||||
id: 5,
|
||||
active: computed(() => route.path === "/tools"),
|
||||
name: t("menu.tools"),
|
||||
name: computed(() => t("menu.tools")),
|
||||
to: "/tools",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -148,9 +148,7 @@ describe("user should be able to create an item and add an attachment", () => {
|
||||
{
|
||||
const { response, data } = await api.items.maintenance.getLog(item.id);
|
||||
expect(response.status).toBe(200);
|
||||
expect(data.entries).toHaveLength(maintenanceEntries.length);
|
||||
expect(data.costAverage).toBeGreaterThan(0);
|
||||
expect(data.costTotal).toBeGreaterThan(0);
|
||||
expect(data).toHaveLength(maintenanceEntries.length);
|
||||
}
|
||||
|
||||
cleanup();
|
||||
|
||||
@@ -12,7 +12,7 @@ import type {
|
||||
MaintenanceEntryCreate,
|
||||
MaintenanceEntryWithDetails,
|
||||
} from "../types/data-contracts";
|
||||
import type { AttachmentTypes, PaginationResult } from "../types/non-generated";
|
||||
import type { AttachmentTypes, ItemSummaryPaginationResult } from "../types/non-generated";
|
||||
import type { MaintenanceFilters } from "./maintenance.ts";
|
||||
import type { Requests } from "~~/lib/requests";
|
||||
|
||||
@@ -98,7 +98,7 @@ export class ItemsApi extends BaseAPI {
|
||||
}
|
||||
|
||||
getAll(q: ItemsQuery = {}) {
|
||||
return this.http.get<PaginationResult<ItemSummary>>({ url: route("/items", q) });
|
||||
return this.http.get<ItemSummaryPaginationResult<ItemSummary>>({ url: route("/items", q) });
|
||||
}
|
||||
|
||||
create(item: ItemCreate) {
|
||||
|
||||
@@ -106,15 +106,13 @@ export interface ItemOut {
|
||||
notes: string;
|
||||
parent?: ItemSummary | null;
|
||||
purchaseFrom: string;
|
||||
/** @example "0" */
|
||||
purchasePrice: string;
|
||||
purchasePrice: number;
|
||||
/** Purchase */
|
||||
purchaseTime: Date | string;
|
||||
quantity: number;
|
||||
serialNumber: string;
|
||||
soldNotes: string;
|
||||
/** @example "0" */
|
||||
soldPrice: string;
|
||||
soldPrice: number;
|
||||
/** Sold */
|
||||
soldTime: Date | string;
|
||||
soldTo: string;
|
||||
@@ -145,8 +143,7 @@ export interface ItemSummary {
|
||||
/** Edges */
|
||||
location?: LocationSummary | null;
|
||||
name: string;
|
||||
/** @example "0" */
|
||||
purchasePrice: string;
|
||||
purchasePrice: number;
|
||||
quantity: number;
|
||||
updatedAt: Date | string;
|
||||
}
|
||||
@@ -159,6 +156,7 @@ export enum ItemType {
|
||||
export interface ItemUpdate {
|
||||
archived: boolean;
|
||||
assetId: string;
|
||||
/** @maxLength 1000 */
|
||||
description: string;
|
||||
fields: ItemField[];
|
||||
id: string;
|
||||
@@ -170,23 +168,27 @@ export interface ItemUpdate {
|
||||
locationId: string;
|
||||
manufacturer: string;
|
||||
modelNumber: string;
|
||||
/**
|
||||
* @minLength 1
|
||||
* @maxLength 255
|
||||
*/
|
||||
name: string;
|
||||
/** Extras */
|
||||
notes: string;
|
||||
parentId?: string | null;
|
||||
/** @maxLength 255 */
|
||||
purchaseFrom: string;
|
||||
/** @example "0" */
|
||||
purchasePrice: string;
|
||||
purchasePrice?: number | null;
|
||||
/** Purchase */
|
||||
purchaseTime: Date | string;
|
||||
quantity: number;
|
||||
/** Identifications */
|
||||
serialNumber: string;
|
||||
soldNotes: string;
|
||||
/** @example "0" */
|
||||
soldPrice: string;
|
||||
soldPrice?: number | null;
|
||||
/** Sold */
|
||||
soldTime: Date | string;
|
||||
/** @maxLength 255 */
|
||||
soldTo: string;
|
||||
warrantyDetails: string;
|
||||
warrantyExpires: Date | string;
|
||||
@@ -323,7 +325,6 @@ export interface NotifierOut {
|
||||
isActive: boolean;
|
||||
name: string;
|
||||
updatedAt: Date | string;
|
||||
/** URL field is not exposed to the client */
|
||||
url: string;
|
||||
userId: string;
|
||||
}
|
||||
|
||||
@@ -16,3 +16,7 @@ export interface PaginationResult<T> {
|
||||
pageSize: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
export interface ItemSummaryPaginationResult<T> extends PaginationResult<T> {
|
||||
totalPrice: number;
|
||||
}
|
||||
|
||||
52
frontend/locales/da-DK.json
Normal file
52
frontend/locales/da-DK.json
Normal file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"components": {
|
||||
"global": {
|
||||
"password_score": {
|
||||
"password_strength": "Adgangskodestyrke"
|
||||
}
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"photo_button": "Foto 📷",
|
||||
"title": "Opret genstand"
|
||||
},
|
||||
"view": {
|
||||
"selectable": {
|
||||
"card": "Kort",
|
||||
"items": "Genstande",
|
||||
"no_items": "Ingen genstande at vise",
|
||||
"table": "Tabel"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"title": "Opret label"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"title": "Opret lokation"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Ingen tilgængelige lokationer. Opret nye lokationer gennem\n`<`span class=\"link-primary\">`Opret`<`/span`>` knappen i navigationslinjen."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"confirm": "Bekræft",
|
||||
"create": "Opret",
|
||||
"create_and_add": "Opret og tilføj ny",
|
||||
"created": "Oprettet",
|
||||
"email": "Email",
|
||||
"follow_dev": "Følg udvikleren",
|
||||
"github": "GitHub projekt"
|
||||
},
|
||||
"tools": {
|
||||
"import_export": "Importer/Eksporter",
|
||||
"reports": "Rapporter",
|
||||
"reports_set": {
|
||||
"bill_of_materials": "Stykliste"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,30 @@
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"date_time": {
|
||||
"ago": "vor {0}",
|
||||
"days": "Tage",
|
||||
"hour": "Stunde",
|
||||
"hours": "Stunden",
|
||||
"in": "in {0}",
|
||||
"just-now": "gerade eben",
|
||||
"last-month": "letzten Monat",
|
||||
"last-week": "Letzte Woche",
|
||||
"last-year": "letztes Jahr",
|
||||
"minute": "Minute",
|
||||
"minutes": "Minuten",
|
||||
"months": "Monate",
|
||||
"next-month": "nächster Monat",
|
||||
"next-week": "Nächste Woche",
|
||||
"next-year": "nächstes Jahr",
|
||||
"second": "Sekunde",
|
||||
"seconds": "Sekunden",
|
||||
"tomorrow": "Morgen",
|
||||
"week": "Woche",
|
||||
"weeks": "Wochen",
|
||||
"years": "Jahre",
|
||||
"yesterday": "Gestern"
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "Seiten-URL"
|
||||
},
|
||||
@@ -18,6 +42,8 @@
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"item_description": "Artikelbezeichnung",
|
||||
"item_name": "Artikelname",
|
||||
"photo_button": "Foto 📷",
|
||||
"title": "Gegenstand erstellen"
|
||||
},
|
||||
@@ -27,29 +53,45 @@
|
||||
"items": "Gegenstände",
|
||||
"no_items": "Keine Gegenstände anzuzeigen",
|
||||
"table": "Tabelle"
|
||||
},
|
||||
"table": {
|
||||
"page": "Seite",
|
||||
"rows_per_page": "Zeilen pro Seite"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"title": "Etikett erstellen"
|
||||
"label_description": "Label Beschreibung",
|
||||
"label_name": "Name Etikett",
|
||||
"title": "Label erstellen"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"location_description": "Standortbeschreibung",
|
||||
"location_name": "Standortnamen",
|
||||
"title": "Standort erstellen"
|
||||
},
|
||||
"selector": {
|
||||
"parent_location": "Übergeordneter Standort"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Keine Standorte verfügbar. Fügen Sie neue Standorte über die Schaltfläche\n `<`span class=\"link-primary\"`>`Erstellen`<`/span`>` in der Navigationsleiste hinzu."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"add": "Hinzufügen",
|
||||
"build": "Build: { build }",
|
||||
"confirm": "Bestätigen",
|
||||
"create": "Erstellen",
|
||||
"create_and_add": "Erstellen und weiteren hinzufügen",
|
||||
"created": "Erstellt",
|
||||
"delete": "Löschen",
|
||||
"details": "Details",
|
||||
"duplicate": "Duplizieren",
|
||||
"edit": "Bearbeiten",
|
||||
"email": "E-Mail",
|
||||
"follow_dev": "Dem Entwickler folgen",
|
||||
"github": "GitHub-Projekt",
|
||||
@@ -57,15 +99,29 @@
|
||||
"join_discord": "Discord beitreten",
|
||||
"labels": "Etiketten",
|
||||
"locations": "Lagerorte",
|
||||
"maintenance": "Wartung",
|
||||
"name": "Name",
|
||||
"password": "Passwort",
|
||||
"read_docs": "Dokumentation lesen",
|
||||
"save": "Speichern",
|
||||
"search": "Suche",
|
||||
"sign_out": "Abmelden",
|
||||
"submit": "Einreichen",
|
||||
"update": "Aktualisieren",
|
||||
"value": "Wert",
|
||||
"version": "Version: { version }",
|
||||
"welcome": "Willkommen, { username }"
|
||||
},
|
||||
"home": {
|
||||
"labels": "Labels",
|
||||
"quick_statistics": "Schnelle Statistiken",
|
||||
"recently_added": "Kürzlich hinzugefügt",
|
||||
"storage_locations": "Lagerstandorte",
|
||||
"total_items": "Gesamtanzahl Elemente",
|
||||
"total_labels": "Gesamtanzahl Label",
|
||||
"total_locations": "Gesamtanzahl Standorte",
|
||||
"total_value": "Gesamtwert"
|
||||
},
|
||||
"index": {
|
||||
"disabled_registration": "Registrierung deaktiviert",
|
||||
"dont_join_group": "Möchtest du nicht einer Gruppe beitreten?",
|
||||
@@ -80,32 +136,71 @@
|
||||
},
|
||||
"items": {
|
||||
"add": "Hinzufügen",
|
||||
"advanced": "Erweitert",
|
||||
"archived": "Archiviert",
|
||||
"asset_id": "Asset-ID",
|
||||
"attachment": "Anhang",
|
||||
"attachments": "Anhänge",
|
||||
"changes_persisted_immediately": "Änderungen an Anhängen werden sofort gespeichert",
|
||||
"created_at": "Erstellt am",
|
||||
"custom_fields": "Benutzerdefinierte Felder",
|
||||
"description": "Beschreibung",
|
||||
"details": "Details",
|
||||
"drag_and_drop": "Ziehen Sie Dateien hierher und legen Sie sie dort ab oder klicken Sie, um Dateien auszuwählen",
|
||||
"edit_details": "Details bearbeiten",
|
||||
"field_selector": "Feldauswahl",
|
||||
"field_value": "Feldwert",
|
||||
"first": "Erste",
|
||||
"include_archive": "Archivierte Elemente einschließen",
|
||||
"insured": "Versichert",
|
||||
"last": "Letzte",
|
||||
"lifetime_warranty": "Lebenslange Garantie",
|
||||
"location": "Standort",
|
||||
"manual": "Bedienungsanleitung",
|
||||
"manuals": "Bedienungsanleitungen",
|
||||
"manufacturer": "Hersteller",
|
||||
"model_number": "Modelnummer",
|
||||
"name": "Name",
|
||||
"negate_labels": "Ausgewählte Etiketten negieren",
|
||||
"next_page": "Nächste Seite",
|
||||
"no_results": "Keine Elemente gefunden",
|
||||
"notes": "Anmerkungen",
|
||||
"options": "Optionen (Options)",
|
||||
"order_by": "Sortieren nach",
|
||||
"pages": "Seite { page } von { totalPages }",
|
||||
"parent_item": "Übergeordnetes Element",
|
||||
"photo": "Foto",
|
||||
"photos": "Fotos",
|
||||
"prev_page": "Vorherige Seite",
|
||||
"query_id": "Abfrage Asset-ID-Nummer: { id }",
|
||||
"purchase_date": "Einkaufsdatum",
|
||||
"purchase_details": "Einkaufsdetails",
|
||||
"purchase_price": "Einkaufspreis",
|
||||
"purchased_from": "Eingekauft von",
|
||||
"quantity": "Menge",
|
||||
"query_id": "Abfrage der Anlagen-ID-Nummer: { id }",
|
||||
"receipt": "Beleg",
|
||||
"receipts": "Quittungen",
|
||||
"reset_search": "Suche zurücksetzen",
|
||||
"results": "{ total } Ergebnisse",
|
||||
"serial_number": "Seriennummer",
|
||||
"show_advanced_view_options": "Erweiterter Angzeigeoptionen anzeigen",
|
||||
"sold_at": "Verkauft am",
|
||||
"sold_details": "Verkaufsdetails",
|
||||
"sold_price": "Verkaufspreis",
|
||||
"sold_to": "Verkauft an",
|
||||
"tip_1": "Standort- und Etikettenfilter verwenden die 'ODER'-Operation. Wenn mehr als eines ausgewählt ist, wird\n nur eines für eine Übereinstimmung benötigt.",
|
||||
"tip_2": "Suchen, die mit '#' beginnen, fragen nach einer Asset-ID (Beispiel '#000-001')",
|
||||
"tip_3": "Feldfilter verwenden die 'ODER'-Operation. Wenn mehr als eines ausgewählt ist, wird nur eines\n für eine Übereinstimmung benötigt.",
|
||||
"tips": "Tipps",
|
||||
"tips_sub": "Suchtipps",
|
||||
"updated_at": "Aktualisiert am"
|
||||
"updated_at": "Aktualisiert am",
|
||||
"warranty": "Gewährleistung",
|
||||
"warranty_details": "Garantiedetails",
|
||||
"warranty_expires": "Garantie läuft ab am"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Keine Labels gefunden"
|
||||
"no_results": "Keine Labels gefunden",
|
||||
"update_label": "Label aktualisieren"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Katalanisch",
|
||||
@@ -115,20 +210,26 @@
|
||||
"fr": "Französisch",
|
||||
"hu": "Ungarisch",
|
||||
"it": "Italienisch",
|
||||
"ja-JP": "Japanisch",
|
||||
"nl": "Niederländisch",
|
||||
"pl": "Polnisch",
|
||||
"pt-BR": "Portugiesisch (Brasilien)",
|
||||
"pt-PT": "Portugiesisch (Portugal)",
|
||||
"ru": "Russisch",
|
||||
"sl": "Slowenisch",
|
||||
"sv": "Schwedisch",
|
||||
"tr": "Türkisch",
|
||||
"uk-UA": "Ukrainisch",
|
||||
"zh-CN": "Chinesisch (einfach)",
|
||||
"zh-HK": "Chinesisch (Hong Kong)",
|
||||
"zh-MO": "Chinesisch (Macao)",
|
||||
"zh-TW": "Chinesisch (Traditionell)"
|
||||
},
|
||||
"locations": {
|
||||
"no_results": "Keine Standorte gefunden"
|
||||
"child_locations": "Unter-Standorte",
|
||||
"collapse_tree": "Baum einklappen",
|
||||
"no_results": "Keine Standorte gefunden",
|
||||
"update_location": "Aktualisiere Standort"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
@@ -160,12 +261,15 @@
|
||||
"toast": {
|
||||
"failed_to_create": "Eintrag konnte nicht erstellt werden",
|
||||
"failed_to_delete": "Eintrag konnte nicht gelöscht werden",
|
||||
"failed_to_update": "Fehler beim Aktualisieren des Eintrags."
|
||||
"failed_to_update": "Fehler beim Aktualisieren des Eintrags"
|
||||
},
|
||||
"total_cost": "Gesamtkosten",
|
||||
"total_entries": "Gesamteinträge"
|
||||
},
|
||||
"menu": {
|
||||
"create_item": "Artikel / Vermögenswert",
|
||||
"create_label": "Label",
|
||||
"create_location": "Standort",
|
||||
"home": "Home",
|
||||
"locations": "Lagerorte",
|
||||
"maintenance": "Wartung",
|
||||
@@ -182,6 +286,7 @@
|
||||
"delete_account_sub": "Lösche dein Konto und alle zugehörigen Daten. Dies kann nicht rückgängig gemacht werden.",
|
||||
"display_header": "{ currentValue, select, true {Header ausblenden} false {Header anzeigen} other {Kein Treffer}}",
|
||||
"enabled": "Aktiviert",
|
||||
"example": "Beispiel",
|
||||
"gen_invite": "Einladungslink generieren",
|
||||
"group_settings": "Gruppeneinstellungen",
|
||||
"group_settings_sub": "Gemeinsame Gruppeneinstellungen. Möglicherweise müssen Sie Ihren Browser aktualisieren, damit die Einstellungen wirksam werden.",
|
||||
@@ -194,7 +299,7 @@
|
||||
"notifiers_sub": "Erhalte Benachrichtigungen über bevorstehende Wartungserinnerungen",
|
||||
"test": "Test",
|
||||
"theme_settings": "Themes",
|
||||
"theme_settings_sub": "Theme-Einstellungen werden im lokalen Speicher deines Browsers gespeichert. Du kannst das Theme jederzeit ändern. Wenn du Probleme hast, dein Theme einzustellen, versuche, die Seite neu zu laden.",
|
||||
"theme_settings_sub": "Theme-Einstellungen werden im lokalen Speicher deines Browsers gespeichert. Du kannst das Theme jederzeit ändern.\nWenn du Probleme hast, dein Theme einzustellen, versuche, die Seite neu zu laden.",
|
||||
"update_group": "Gruppe aktualisieren",
|
||||
"update_language": "Sprache aktualisieren",
|
||||
"url": "URL",
|
||||
@@ -206,14 +311,14 @@
|
||||
"actions_set": {
|
||||
"ensure_ids": "Sicherstellen von Asset-IDs",
|
||||
"ensure_ids_button": "Sicherstellen von Asset-IDs",
|
||||
"ensure_ids_sub": "Es wird sichergestellt, dass alle Artikel in Ihrem Bestand ein gültiges asset_id-Feld haben. Dazu wird das Feld mit der höchsten aktuellen asset_id in der Datenbank ermittelt und der nächste Wert auf jeden Artikel mit einem nicht gesetzten asset_id-Feld angewendet. Dies geschieht in der Reihenfolge des Feldes created_at.",
|
||||
"ensure_ids_sub": "Stellt sicher, dass alle Elemente in Ihrem Inventar ein gültiges asset_id-Feld haben. Dazu wird die das höchste aktuelle asset_id-Feld in der Datenbank ermittelt und der nächste Wert auf jeden Element mit einem nicht gesetzten asset_id-Feld angewendet. Dies geschieht in der Reihenfolge des Feldes created_at.",
|
||||
"ensure_import_refs": "Sicherstellen, dass Import-Referenzen importiert wurden",
|
||||
"ensure_import_refs_button": "Sicherstellen, dass Referenzen importiert werden",
|
||||
"ensure_import_refs_sub": "Es wird sichergestellt, dass alle Gegenstände in Ihrem Inventar ein gültiges import_ref-Feld haben. Dazu wird nach dem Zufallsprinzip eine 8-stellige Zeichenkette für jeden Gegenstand mit einem ungültigen import_ref-Feld erzeugt.",
|
||||
"ensure_import_refs_sub": "Stellt sicher, dass alle Elemente in deinem Inventar ein gültiges import_ref-Feld haben. Dazu wird nach dem Zufallsprinzip eine 8-stellige Zeichenkette für jedes Element mit einem leeren import_ref-Feld erzeugt.",
|
||||
"set_primary_photo": "Primärfoto festlegen",
|
||||
"set_primary_photo_button": "Primäres Foto festlegen",
|
||||
"set_primary_photo_sub": "In Homebox Version v0.10.0 wurde die Auswahl des Primärbilds von angehängten Bildern hinzugefügt. Mit dieser Funktion wird für jeden Artikel ohne Primärbild das erste angehängt Bild als solches definiert. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'See GitHub PR #576'</a>'",
|
||||
"zero_datetimes": "Null-Punkt-Datum-Zeiten",
|
||||
"zero_datetimes": "Leeren der Datum & Zeiten der Elemente",
|
||||
"zero_datetimes_button": "Null-Punkt-Datum-Zeiten",
|
||||
"zero_datetimes_sub": "Setzt den Zeitwert für alle Datums-Zeit-Felder in Ihrem Inventar auf den Anfang des Datums zurück. Damit wird ein Fehler behoben, der zu Beginn der Entwicklung der Website eingeführt wurde und dazu führte, dass das Datum zusammen mit der Uhrzeit gespeichert wurde, was zu Problemen bei der Anzeige von genauen Werten in Datumsfeldern führte. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'See Github Issue #236 for more details.'</a>'"
|
||||
},
|
||||
@@ -222,20 +327,20 @@
|
||||
"import_export_set": {
|
||||
"export": "Gesamten Bestand exportieren",
|
||||
"export_button": "Gesamten Bestand exportieren",
|
||||
"export_sub": "Exportiert das Standard-CSV-Format für Homebox",
|
||||
"export_sub": "Exportiert das Standard-CSV-Format für Homebox. Diese Aktion exportiert alle Elemente in ihrem Inventar.",
|
||||
"import": "Inventar importieren",
|
||||
"import_button": "Inventar importieren",
|
||||
"import_sub": "Importiert das Standard-CSV-Format für Homebox. Ohne eine '<code>'HB.import_ref'</code>' Spalte werden vorhandenen Artikel in Ihrem Bestand '<b>'nicht'</b>' überschrieben, sondern nur neue Artikel hinzugefügt. Zeilen mit einer '<code>'HB.import_ref'</code>' Spalte werden mit vorhandenen Artikeln mit der gleichen import_ref zusammengeführt, sofern vorhanden."
|
||||
},
|
||||
"import_export_sub": "Importieren und exportieren Sie Ihren Lagerbestand in und aus einer CSV-Datei",
|
||||
"import_export_sub": "Importieren und exportieren Sie Ihren Lagerbestand in und aus einer CSV-Datei. Dies ist nützlich zum migrieren ihres Inventars zu einer neuen Instanz von Homebox.",
|
||||
"reports": "Berichte",
|
||||
"reports_set": {
|
||||
"asset_labels": "Asset-ID-Etiketten",
|
||||
"asset_labels": "Asset-ID-Labels",
|
||||
"asset_labels_button": "Etiketten-Generator",
|
||||
"asset_labels_sub": "Erzeugt eine druckbare PDF-Datei mit Etiketten für eine Reihe von Asset-IDs. Diese sind nicht spezifisch für deine Inventargegenstände, so dass du die Etiketten im Voraus ausdrucken und bei Erhalt auf deinen Inventargegenständen anbringen kannst.",
|
||||
"bill_of_materials": "Stückliste",
|
||||
"bill_of_materials_button": "Stückliste generieren",
|
||||
"bill_of_materials_sub": "Generiert eine CSV-Datei (Comma Separated Values), die in ein Tabellenkalkulationsprogramm importiert werden kann"
|
||||
"bill_of_materials_sub": "Generiert eine CSV-Datei (Comma Separated Values), die in ein Tabellenkalkulationsprogramm importiert werden kann. Diese ist eine Zusammenfasung ihres Inventars mit einfachen Elementen- und Preisinformationen."
|
||||
},
|
||||
"reports_sub": "Erstellen Sie verschiedene Berichte für Ihr Inventar."
|
||||
}
|
||||
|
||||
@@ -9,6 +9,30 @@
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"date_time": {
|
||||
"ago": "{0} ago",
|
||||
"days": "days",
|
||||
"hour": "hour",
|
||||
"hours": "hours",
|
||||
"in": "in {0}",
|
||||
"just-now": "just now",
|
||||
"last-month": "last month",
|
||||
"last-week": "last week",
|
||||
"last-year": "last year",
|
||||
"minute": "minute",
|
||||
"minutes": "minutes",
|
||||
"months": "months",
|
||||
"next-month": "next month",
|
||||
"next-week": "next week",
|
||||
"next-year": "next year",
|
||||
"second": "second",
|
||||
"seconds": "seconds",
|
||||
"tomorrow": "tomorrow",
|
||||
"week": "week",
|
||||
"weeks": "weeks",
|
||||
"years": "years",
|
||||
"yesterday": "yesterday"
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "Page URL"
|
||||
},
|
||||
@@ -18,6 +42,8 @@
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"item_description": "Item Description",
|
||||
"item_name": "Item Name",
|
||||
"photo_button": "Photo 📷",
|
||||
"title": "Create Item"
|
||||
},
|
||||
@@ -27,29 +53,45 @@
|
||||
"items": "Items",
|
||||
"no_items": "No Items to Display",
|
||||
"table": "Table"
|
||||
},
|
||||
"table": {
|
||||
"page": "Page",
|
||||
"rows_per_page": "Rows per page"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"label_description": "Label Description",
|
||||
"label_name": "Label Name",
|
||||
"title": "Create Label"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"location_description": "Location Description",
|
||||
"location_name": "Location Name",
|
||||
"title": "Create Location"
|
||||
},
|
||||
"selector": {
|
||||
"parent_location": "Parent Location"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "No locations available. Add new locations through the\n `<`span class=\"link-primary\"`>`Create`<`/span`>` button on the navigation bar."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"add": "Add",
|
||||
"build": "Build: { build }",
|
||||
"confirm": "Confirm",
|
||||
"create": "Create",
|
||||
"create_and_add": "Create and Add Another",
|
||||
"created": "Created",
|
||||
"delete": "Delete",
|
||||
"details": "Details",
|
||||
"duplicate": "Duplicate",
|
||||
"edit": "Edit",
|
||||
"email": "Email",
|
||||
"follow_dev": "Follow the Developer",
|
||||
"github": "GitHub Project",
|
||||
@@ -57,15 +99,29 @@
|
||||
"join_discord": "Join the Discord",
|
||||
"labels": "Labels",
|
||||
"locations": "Locations",
|
||||
"maintenance": "Maintenance",
|
||||
"name": "Name",
|
||||
"password": "Password",
|
||||
"read_docs": "Read the Docs",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"sign_out": "Sign Out",
|
||||
"submit": "Submit",
|
||||
"update": "Update",
|
||||
"value": "Value",
|
||||
"version": "Version: { version }",
|
||||
"welcome": "Welcome, { username }"
|
||||
},
|
||||
"home": {
|
||||
"labels": "Labels",
|
||||
"quick_statistics": "Quick Statistics",
|
||||
"recently_added": "Recently Added",
|
||||
"storage_locations": "Storage Locations",
|
||||
"total_items": "Total Items",
|
||||
"total_labels": "Total Labels",
|
||||
"total_locations": "Total Locations",
|
||||
"total_value": "Total Value"
|
||||
},
|
||||
"index": {
|
||||
"disabled_registration": "Registration Disabled",
|
||||
"dont_join_group": "Don't want to join a group?",
|
||||
@@ -80,32 +136,71 @@
|
||||
},
|
||||
"items": {
|
||||
"add": "Add",
|
||||
"advanced": "Advanced",
|
||||
"archived": "Archived",
|
||||
"asset_id": "Asset ID",
|
||||
"attachment": "Attachment",
|
||||
"attachments": "Attachments",
|
||||
"changes_persisted_immediately": "Changes to attachments will be saved immediately",
|
||||
"created_at": "Created At",
|
||||
"custom_fields": "Custom Fields",
|
||||
"description": "Description",
|
||||
"details": "Details",
|
||||
"drag_and_drop": "Drag and drop files here or click to select files",
|
||||
"edit_details": "Edit Details",
|
||||
"field_selector": "Field Selector",
|
||||
"field_value": "Field Value",
|
||||
"first": "First",
|
||||
"include_archive": "Include Archived Items",
|
||||
"insured": "Insured",
|
||||
"last": "Last",
|
||||
"lifetime_warranty": "Lifetime Warranty",
|
||||
"location": "Location",
|
||||
"manual": "Manual",
|
||||
"manuals": "Manuals",
|
||||
"manufacturer": "Manufacturer",
|
||||
"model_number": "Model Number",
|
||||
"name": "Name",
|
||||
"negate_labels": "Negate Selected Labels",
|
||||
"next_page": "Next Page",
|
||||
"no_results": "No Items Found",
|
||||
"notes": "Notes",
|
||||
"options": "Options",
|
||||
"order_by": "Order By",
|
||||
"pages": "Page { page } of { totalPages }",
|
||||
"parent_item": "Parent Item",
|
||||
"photo": "Photo",
|
||||
"photos": "Photos",
|
||||
"prev_page": "Previous Page",
|
||||
"purchase_date": "Purchase Date",
|
||||
"purchase_details": "Purchase Details",
|
||||
"purchase_price": "Purchase Price",
|
||||
"purchased_from": "Purchased From",
|
||||
"quantity": "Quantity",
|
||||
"query_id": "Querying Asset ID Number: { id }",
|
||||
"receipt": "Receipt",
|
||||
"receipts": "Receipts",
|
||||
"reset_search": "Reset Search",
|
||||
"results": "{ total } Results",
|
||||
"serial_number": "Serial Number",
|
||||
"show_advanced_view_options": "Show Advanced View Options",
|
||||
"sold_at": "Sold At",
|
||||
"sold_details": "Sold Details",
|
||||
"sold_price": "Sold Price",
|
||||
"sold_to": "Sold To",
|
||||
"tip_1": "Location and label filters use the 'OR' operation. If more than one is selected only one will be\n required for a match.",
|
||||
"tip_2": "Searches prefixed with '#'' will query for a asset ID (example '#000-001')",
|
||||
"tip_3": "Field filters use the 'OR' operation. If more than one is selected only one will be required for a\n match.",
|
||||
"tips": "Tips",
|
||||
"tips_sub": "Search Tips",
|
||||
"updated_at": "Updated At"
|
||||
"updated_at": "Updated At",
|
||||
"warranty": "Warranty",
|
||||
"warranty_details": "Warranty Details",
|
||||
"warranty_expires": "Warranty Expires"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "No Labels Found"
|
||||
"no_results": "No Labels Found",
|
||||
"update_label": "Update Label"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Catalan",
|
||||
@@ -115,20 +210,26 @@
|
||||
"fr": "French",
|
||||
"hu": "Hungarian",
|
||||
"it": "Italian",
|
||||
"ja-JP": "Japanese",
|
||||
"nl": "Dutch",
|
||||
"pl": "Polish",
|
||||
"pt-BR": "Portuguese (Brazil)",
|
||||
"pt-PT": "Portuguese (Portugal)",
|
||||
"ru": "Russian",
|
||||
"sl": "Slovenian",
|
||||
"sv": "Swedish",
|
||||
"tr": "Turkish",
|
||||
"uk-UA": "Ukrainian",
|
||||
"zh-CN": "Chinese (Simplified)",
|
||||
"zh-HK": "Chinese (Hong Kong)",
|
||||
"zh-MO": "Chinese (Macau)",
|
||||
"zh-TW": "Chinese (Traditional)"
|
||||
},
|
||||
"locations": {
|
||||
"no_results": "No Locations Found"
|
||||
"child_locations": "Child Locations",
|
||||
"collapse_tree": "Collapse Tree",
|
||||
"no_results": "No Locations Found",
|
||||
"update_location": "Update Location"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
@@ -137,12 +238,12 @@
|
||||
"scheduled": "Scheduled"
|
||||
},
|
||||
"list": {
|
||||
"complete": "Complete",
|
||||
"create_first": "Create Your First Entry",
|
||||
"delete": "Delete",
|
||||
"duplicate": "Duplicate",
|
||||
"edit": "Edit",
|
||||
"new": "New",
|
||||
"complete": "Complete",
|
||||
"duplicate" : "Duplicate"
|
||||
"new": "New"
|
||||
},
|
||||
"modal": {
|
||||
"completed_date": "Completed Date",
|
||||
@@ -166,6 +267,9 @@
|
||||
"total_entries": "Total Entries"
|
||||
},
|
||||
"menu": {
|
||||
"create_item": "Item / Asset",
|
||||
"create_label": "Label",
|
||||
"create_location": "Location",
|
||||
"home": "Home",
|
||||
"locations": "Locations",
|
||||
"maintenance": "Maintenance",
|
||||
@@ -182,6 +286,7 @@
|
||||
"delete_account_sub": "Delete your account and all its associated data. This can not be undone.",
|
||||
"display_header": "{ currentValue, select, true {Hide Header} false {Show Header} other {Not Hit}}",
|
||||
"enabled": "Enabled",
|
||||
"example": "Example",
|
||||
"gen_invite": "Generate Invite Link",
|
||||
"group_settings": "Group Settings",
|
||||
"group_settings_sub": "Shared Group Settings. You may need to refresh your browser for some settings to apply.",
|
||||
|
||||
@@ -2,13 +2,37 @@
|
||||
"components": {
|
||||
"app": {
|
||||
"import_dialog": {
|
||||
"change_warning": "Se ha modificado el comportamiento de las importaciones con import_refs existentes. Si existe una import_ref en el archivo CSV, el \nelemento se actualizará con los valores del archivo CSV.",
|
||||
"change_warning": "Se ha modificado el comportamiento de las importaciones con import_refs existentes. Si existe una import_ref en el archivo CSV, el\nelemento se actualizará con los valores del archivo CSV.",
|
||||
"description": "Importa un archivo CSV que contenga tus elementos, etiquetas y ubicaciones. Consulta la documentación para obtener más información sobre el \nformato requerido.",
|
||||
"title": "Importar Archivo CSV",
|
||||
"upload": "Subir"
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"date_time": {
|
||||
"ago": "hace {0}",
|
||||
"days": "días",
|
||||
"hour": "hora",
|
||||
"hours": "horas",
|
||||
"in": "en {0}",
|
||||
"just-now": "Justo ahora",
|
||||
"last-month": "mes pasado",
|
||||
"last-week": "semana pasada",
|
||||
"last-year": "año pasado",
|
||||
"minute": "minuto",
|
||||
"minutes": "minutos",
|
||||
"months": "meses",
|
||||
"next-month": "próximo mes",
|
||||
"next-week": "próxima semana",
|
||||
"next-year": "próximo año",
|
||||
"second": "segundo",
|
||||
"seconds": "segundos",
|
||||
"tomorrow": "mañana",
|
||||
"week": "semana",
|
||||
"weeks": "semanas",
|
||||
"years": "años",
|
||||
"yesterday": "ayer"
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "URL de página"
|
||||
},
|
||||
@@ -18,6 +42,8 @@
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"item_description": "Descripción del artículo",
|
||||
"item_name": "Nombre del artículo",
|
||||
"photo_button": "Foto 📷",
|
||||
"title": "Crear Elemento"
|
||||
},
|
||||
@@ -27,26 +53,45 @@
|
||||
"items": "Elementos",
|
||||
"no_items": "No hay elementos para mostrar",
|
||||
"table": "Tabla"
|
||||
},
|
||||
"table": {
|
||||
"page": "Página",
|
||||
"rows_per_page": "Renglones por página"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"label_description": "Descripción de la etiqueta",
|
||||
"label_name": "Nombre de la etiqueta",
|
||||
"title": "Crear Etiqueta"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"location_description": "Descripción de la ubicación",
|
||||
"location_name": "Nombre de la ubicación",
|
||||
"title": "Crear Ubicación"
|
||||
},
|
||||
"selector": {
|
||||
"parent_location": "Ubicación padre"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "No hay ubicaciones disponibles. Añade nuevas ubicaciones mediante el botón de\n`<`span class=\"link-primary\"`>`Crear`<`/span`>` en la barra de navegación."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"add": "Agregar",
|
||||
"build": "Compilación: { build }",
|
||||
"confirm": "Confirmar",
|
||||
"create": "Crear",
|
||||
"create_and_add": "Crear y Añadir Otro",
|
||||
"created": "Creado",
|
||||
"delete": "Eliminar",
|
||||
"details": "Detalles",
|
||||
"duplicate": "Duplicar",
|
||||
"edit": "Editar",
|
||||
"email": "Email",
|
||||
"follow_dev": "Seguir al Desarrollador",
|
||||
"github": "Proyecto GitHub",
|
||||
@@ -54,15 +99,29 @@
|
||||
"join_discord": "Únete al Discord",
|
||||
"labels": "Etiquetas",
|
||||
"locations": "Ubicaciones",
|
||||
"maintenance": "Mantenimiento",
|
||||
"name": "Nombre",
|
||||
"password": "Contraseña",
|
||||
"read_docs": "Lee la Documentación",
|
||||
"save": "Guardar",
|
||||
"search": "Buscar",
|
||||
"sign_out": "Cerrar Sesión",
|
||||
"submit": "Enviar",
|
||||
"update": "Actualizar",
|
||||
"value": "Valor",
|
||||
"version": "Versión: { version }",
|
||||
"welcome": "Bienvenido/a, { username }"
|
||||
},
|
||||
"home": {
|
||||
"labels": "Etiquetas",
|
||||
"quick_statistics": "Estadísticas rápidas",
|
||||
"recently_added": "Añadidos recientemente",
|
||||
"storage_locations": "Ubicaciones de almacenamiento",
|
||||
"total_items": "Total artículos",
|
||||
"total_labels": "Total étiquetas",
|
||||
"total_locations": "Total ubicaciónes",
|
||||
"total_value": "Valor total"
|
||||
},
|
||||
"index": {
|
||||
"disabled_registration": "Registro Desactivado",
|
||||
"dont_join_group": "¿No quieres unirte a un grupo?",
|
||||
@@ -77,29 +136,71 @@
|
||||
},
|
||||
"items": {
|
||||
"add": "Añadir",
|
||||
"advanced": "Avanzado",
|
||||
"archived": "Archivado",
|
||||
"asset_id": "Activo ID",
|
||||
"attachment": "Adjunto",
|
||||
"attachments": "Adjuntos",
|
||||
"changes_persisted_immediately": "Los cambios a los archivos adjuntos se guardaran inmediatamente",
|
||||
"created_at": "Creado El",
|
||||
"custom_fields": "Campos Personalizados",
|
||||
"description": "Descripción",
|
||||
"details": "Detalles",
|
||||
"drag_and_drop": "Arrastra y suelta los archivos aquí o selecciona los archivos",
|
||||
"edit_details": "Editar detalles",
|
||||
"field_selector": "Selector de Campo",
|
||||
"field_value": "Valor del Campo",
|
||||
"first": "Primer",
|
||||
"include_archive": "Incluir Elementos Archivados",
|
||||
"insured": "Asegurado",
|
||||
"last": "Último",
|
||||
"lifetime_warranty": "Garantia de por vida",
|
||||
"location": "Ubicación",
|
||||
"manual": "Manual",
|
||||
"manuals": "Manuales",
|
||||
"manufacturer": "Fabricante",
|
||||
"model_number": "Número de modelo",
|
||||
"name": "Nombre",
|
||||
"negate_labels": "Negar Etiquetas Seleccionadas",
|
||||
"next_page": "Siguiente Página",
|
||||
"no_results": "No se Encontraron Elementos",
|
||||
"notes": "Notas",
|
||||
"options": "Opciones",
|
||||
"order_by": "Ordenar Por",
|
||||
"pages": "Página { page } de { totalPages }",
|
||||
"parent_item": "Articulo Padre",
|
||||
"photo": "Foto",
|
||||
"photos": "Fotos",
|
||||
"prev_page": "Anterior Página",
|
||||
"purchase_date": "Fecha de compra",
|
||||
"purchase_details": "Detalles de compra",
|
||||
"purchase_price": "Precio de compra",
|
||||
"purchased_from": "Comprado de",
|
||||
"quantity": "Cantidad",
|
||||
"query_id": "Consultar Número ID del Activo: { id }",
|
||||
"receipt": "Recibo",
|
||||
"receipts": "Recibos",
|
||||
"reset_search": "Restablecer Búsqueda",
|
||||
"results": "{ total } Resultados",
|
||||
"serial_number": "Número de serie",
|
||||
"show_advanced_view_options": "Mostrar opciones avanzadas de vista",
|
||||
"sold_at": "Vendido el",
|
||||
"sold_details": "Detalles de venta",
|
||||
"sold_price": "Precio de venta",
|
||||
"sold_to": "Vendido a",
|
||||
"tip_1": "Los filtros de ubicación y etiquetas utilizan el operador \"OR\". Si se selecciona más de uno, sólo uno será\n necesario para obtener una coincidencia.",
|
||||
"tip_2": "Las búsquedas precedidas de \"#\" buscarán un ID de activo (por ejemplo, \"#000-001\")",
|
||||
"tip_3": "Los filtros de campo utilizan el operador \"OR\". Si se selecciona más de uno, sólo se requerirá uno para una\n coincidencia.",
|
||||
"tips": "Sugerencias",
|
||||
"tips_sub": "Sugerencias de Búsqueda",
|
||||
"updated_at": "Actualizado El"
|
||||
"updated_at": "Actualizado El",
|
||||
"warranty": "Garantia",
|
||||
"warranty_details": "Detalles de garantía",
|
||||
"warranty_expires": "La garantia expira"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Etiquetas No Encontradas",
|
||||
"update_label": "Actualizar etiqueta"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Catalán",
|
||||
@@ -109,18 +210,73 @@
|
||||
"fr": "Francés",
|
||||
"hu": "Húngaro",
|
||||
"it": "Italiano",
|
||||
"ja-JP": "Japones",
|
||||
"nl": "Holandés",
|
||||
"pl": "Polaco",
|
||||
"pt-BR": "Portugués (Brasil)",
|
||||
"pt-PT": "Portugués",
|
||||
"ru": "Ruso",
|
||||
"sl": "Esloveno",
|
||||
"sv": "Sueco",
|
||||
"tr": "Turco",
|
||||
"uk-UA": "Ucraniano",
|
||||
"zh-CN": "Chino (Simplificado)",
|
||||
"zh-HK": "Chino (Hong Kong)",
|
||||
"zh-MO": "Chino (Macao)",
|
||||
"zh-TW": "Chino (Tradicional)"
|
||||
},
|
||||
"locations": {
|
||||
"child_locations": "Ubicaciones hijas",
|
||||
"collapse_tree": "Colapsar árbol",
|
||||
"no_results": "Ubicaciones No Encontradas",
|
||||
"update_location": "Actualizar ubicación"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
"both": "Ambos",
|
||||
"completed": "Completado",
|
||||
"scheduled": "Programado"
|
||||
},
|
||||
"list": {
|
||||
"complete": "Completar",
|
||||
"create_first": "Crea Tu Primera Entrada",
|
||||
"delete": "Eliminar",
|
||||
"duplicate": "Duplicar",
|
||||
"edit": "Editar",
|
||||
"new": "Nuevo"
|
||||
},
|
||||
"modal": {
|
||||
"completed_date": "Fecha Completado",
|
||||
"cost": "Coste",
|
||||
"delete_confirmation": "¿Seguro que quieres borrar esta entrada?",
|
||||
"edit_action": "Actualizar",
|
||||
"edit_title": "Editar Entrada",
|
||||
"entry_name": "Nombre de Entrada",
|
||||
"new_action": "Crear",
|
||||
"new_title": "Nueva Entrada",
|
||||
"notes": "Notas",
|
||||
"scheduled_date": "Fecha Programada"
|
||||
},
|
||||
"monthly_average": "Promedio Mensual",
|
||||
"toast": {
|
||||
"failed_to_create": "Error al crear la entrada",
|
||||
"failed_to_delete": "Error al eliminar la entrada",
|
||||
"failed_to_update": "Error al actualizar la entrada"
|
||||
},
|
||||
"total_cost": "Coste Total",
|
||||
"total_entries": "Total de Entradas"
|
||||
},
|
||||
"menu": {
|
||||
"create_item": "Articulo / Activo",
|
||||
"create_label": "Etiqueta",
|
||||
"create_location": "Ubicación",
|
||||
"home": "Inicio",
|
||||
"locations": "Ubicaciones",
|
||||
"maintenance": "Mantenimiento",
|
||||
"profile": "Perfil",
|
||||
"search": "Buscar",
|
||||
"tools": "Herramientas"
|
||||
},
|
||||
"profile": {
|
||||
"active": "Activo",
|
||||
"change_password": "Cambiar Contraseña",
|
||||
@@ -130,12 +286,14 @@
|
||||
"delete_account_sub": "Elimina tu cuenta y todos sus datos asociados. Esto no se puede deshacer.",
|
||||
"display_header": "{ currentValue, select, true {Ocultar Encabezado} false {Mostrar Encabezado} other {Desconocido}}",
|
||||
"enabled": "Habilitado",
|
||||
"example": "Ejemplo",
|
||||
"gen_invite": "Generar Enlace de Invitación",
|
||||
"group_settings": "Ajustes de Grupo",
|
||||
"group_settings_sub": "Configuración de Grupo Compartido. Es posible que tengas que actualizar tu navegador para que se apliquen algunos ajustes.",
|
||||
"inactive": "Inactivo",
|
||||
"language": "Idioma",
|
||||
"new_password": "Nueva Contraseña",
|
||||
"no_notifiers": "No hay notificadores configurados",
|
||||
"notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Notificación",
|
||||
"notifiers": "Notificaciones",
|
||||
"notifiers_sub": "Recibe notificaciones de los próximos recordatorios de mantenimiento",
|
||||
|
||||
32
frontend/locales/fi-FI.json
Normal file
32
frontend/locales/fi-FI.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"languages": {
|
||||
"pl": "Puola"
|
||||
},
|
||||
"maintenance": {
|
||||
"list": {
|
||||
"complete": "Valmis",
|
||||
"delete": "Poista"
|
||||
},
|
||||
"modal": {
|
||||
"new_action": "Luo"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"home": "Koti"
|
||||
},
|
||||
"profile": {
|
||||
"delete_account": "Poista tili",
|
||||
"test": "Testi"
|
||||
},
|
||||
"tools": {
|
||||
"actions_set": {
|
||||
"set_primary_photo": "Aseta oletuskuva"
|
||||
},
|
||||
"import_export": "Tuo/Vie",
|
||||
"import_export_set": {
|
||||
"export_button": "Vie varasto",
|
||||
"import_button": "Tuo varasto"
|
||||
},
|
||||
"reports": "Raportit"
|
||||
}
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
"components": {
|
||||
"app": {
|
||||
"import_dialog": {
|
||||
"change_warning": "Le comportement lors d’importations avec des import_ref existants a changé. Si une valeur pour import_ref est présente dans le fichier CSV, alors l’élément sera mis à jour avec celle-ci.",
|
||||
"description": "Importer un fichier CSV contenant vos articles, étiquettes, et emplacements. Voir la documentation pour plus d’informations sur le format requis.",
|
||||
"change_warning": "Le comportement lors d’importations avec des import_ref existants a changé. Si une valeur pour import_ref est présente dans le \nfichier CSV, alors l’élément sera mis à jour avec celle-ci.",
|
||||
"description": "Importer un fichier CSV contenant vos articles, étiquettes, et emplacements. Voir la documentation pour plus d’informations \nsur le format requis.",
|
||||
"title": "Importer un fichier CSV",
|
||||
"upload": "Téléverser"
|
||||
}
|
||||
@@ -40,7 +40,7 @@
|
||||
"title": "Créer un emplacement"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Aucun emplacement disponible. Ajoutez votre premiers emplacements avec le bouton `<`span class=\"link-primary\"`>`Créer`<`/span`>` dans la barre de navigation."
|
||||
"no_locations": "Aucun emplacement disponible. Ajoutez votre premiers emplacements avec\nle bouton `<`span class=\"link-primary\"`>`Créer`<`/span`>` dans la barre de navigation."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -61,7 +61,7 @@
|
||||
"password": "Mot de passe",
|
||||
"read_docs": "Lire la documentation",
|
||||
"search": "Rechercher",
|
||||
"sign_out": "Déconnexion",
|
||||
"sign_out": "Se déconnecter",
|
||||
"submit": "Soumettre",
|
||||
"version": "Version : { version }",
|
||||
"welcome": "Bienvenue, { username }"
|
||||
@@ -142,15 +142,15 @@
|
||||
"delete": "Supprimer",
|
||||
"duplicate": "Dupliquer",
|
||||
"edit": "Modifier",
|
||||
"new": "Ajouter"
|
||||
"new": "Nouveau"
|
||||
},
|
||||
"modal": {
|
||||
"completed_date": "Date d'achèvement",
|
||||
"cost": "Coût",
|
||||
"delete_confirmation": "Êtes-vous certain de vouloir supprimer cette entrée ?",
|
||||
"edit_action": "Modifier",
|
||||
"edit_action": "Mettre à jour",
|
||||
"edit_title": "Modifier l'entrée",
|
||||
"entry_name": "Nom",
|
||||
"entry_name": "Nom de l’entrée",
|
||||
"new_action": "Créer",
|
||||
"new_title": "Nouvelle entrée",
|
||||
"notes": "Notes",
|
||||
@@ -191,7 +191,7 @@
|
||||
"no_notifiers": "Aucune notification configurée",
|
||||
"notifier_modal": "Notifications { type, select, true {Edit} false {Create} other {Other}}",
|
||||
"notifiers": "Notifications",
|
||||
"notifiers_sub": "Recevez des notifications pour vous prévenir des prochaines maintenances.",
|
||||
"notifiers_sub": "Recevez des notifications pour vous prévenir des prochaines maintenances",
|
||||
"test": "Test",
|
||||
"theme_settings": "Paramètres du thème",
|
||||
"theme_settings_sub": "Les paramètres du thème sont stockés dans le navigateur. Vous pouvez les changer à tout moment. Si vous\nrencontrez des problèmes, il est conseillé de rafraichir la page.",
|
||||
@@ -214,7 +214,8 @@
|
||||
"set_primary_photo_button": "Définir la photo principale",
|
||||
"set_primary_photo_sub": "Dans la version v0.10.0 d'Homebox, le champ d'image principal à été ajouté aux pièces jointes de type photo. Cette action définira en tant qu'image principale toute première image en pièce jointe déjà présente en base de donnée, si le champ n'est pas déjà défini. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'Voir GitHub PR #576'</a>'",
|
||||
"zero_datetimes": "Remettre à zéro les dates et heures",
|
||||
"zero_datetimes_button": "Remettre à zéro les dates et heures"
|
||||
"zero_datetimes_button": "Remettre à zéro les dates et heures",
|
||||
"zero_datetimes_sub": "Réinitialise la valeur de tous les champs date/heure de votre inventaire à la date de début. Il s'agit de corriger une anomalie introduite au début du développement du site qui entraînait le stockage de la valeur temporelle avec l'heure, ce qui provoquait des problèmes avec les champs de date affichant des valeurs précises. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'Voir le rapport 236 de Github pour plus de détails.'</a> '"
|
||||
},
|
||||
"actions_sub": "Appliquer des actions en masse à votre inventaire. Ces actions sont irréversibles. '<b>'Soyez vigilant.'</b>'",
|
||||
"import_export": "Importer/Exporter",
|
||||
@@ -224,13 +225,13 @@
|
||||
"export_sub": "Exporte l'inventaire au format CSV Homebox. Cela exportera l'intégralité de votre inventaire.",
|
||||
"import": "Importer l'inventaire",
|
||||
"import_button": "Importer l'inventaire",
|
||||
"import_sub": "Importer un fichier CSV au format Homebox. Sans la colonne '<code>'HB.import_ref'</code>' , cela '<b>'n'écrasera pas'</b>' d'éléments de votre inventaire actuel, seuls les nouveaux éléments seront importés. Les lignes contenant une colonne '<code>'HB.import_ref'</code>' seront fusionnées avec les éléments existants comportant le même '<code>'HB.import_ref'</code>', si existant."
|
||||
"import_sub": "Importer un fichier CSV au format Homebox. Sans la colonne '<code>'HB.import_ref'</code>' , cela '<b>'n'écrasera pas'</b>' d'éléments de votre inventaire actuel, seuls les nouveaux éléments seront importés. Les lignes contenant une colonne '<code>'HB.import_ref'</code>' seront fusionnées avec les éléments existants comportant le même import_ref, si existant."
|
||||
},
|
||||
"import_export_sub": "Importez et exportez votre inventaire vers et depuis un fichier CSV",
|
||||
"import_export_sub": "Importez et exportez votre inventaire vers et depuis un fichier CSV. Ceci est utile pour migrer votre inventaire vers une nouvelle instance de Homebox.",
|
||||
"reports": "Rapports",
|
||||
"reports_set": {
|
||||
"asset_labels": "Étiquettes d’identifiant d’actif",
|
||||
"asset_labels_button": "Générateur d’étiquettes",
|
||||
"asset_labels_button": "Générateur d'étiquettes",
|
||||
"asset_labels_sub": "Génère un fichier PDF imprimable pour une plage d'identifiants d'actifs. Ils ne sont pas spécifiques à votre inventaire donc vous pouvez les imprimer en avance et les appliquer à votre inventaire par la suite.",
|
||||
"bill_of_materials": "Nomenclature",
|
||||
"bill_of_materials_button": "Générer une nomenclature",
|
||||
|
||||
@@ -2,13 +2,37 @@
|
||||
"components": {
|
||||
"app": {
|
||||
"import_dialog": {
|
||||
"change_warning": "Il comportamento per le importazioni con import_ref esistenti è cambiato. Se un import_ref è presente nel file CSV,\n l'elemento verrà aggiornato con i valori presenti nel file CSV.",
|
||||
"description": "Importa un file CSV contenente gli oggetti, le etichette e le posizioni. Vedi la documentazione per ulteriori informazioni sul \nformato richiesto.",
|
||||
"change_warning": "Il comportamento per le importazioni con import_ref esistenti è cambiato. Se un import_ref è presente nel file CSV,\n l'articolo verrà aggiornato con i valori presenti nel file CSV.",
|
||||
"description": "Importa un file CSV contenente gli articoli, le etichette e le posizioni. Vedi la documentazione per ulteriori informazioni sul \nformato richiesto.",
|
||||
"title": "Importa File CSV",
|
||||
"upload": "Carica"
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"date_time": {
|
||||
"ago": "{0} fa",
|
||||
"days": "giorni",
|
||||
"hour": "ora",
|
||||
"hours": "ore",
|
||||
"in": "tra {0}",
|
||||
"just-now": "Adesso",
|
||||
"last-month": "mese scorso",
|
||||
"last-week": "settimana precedente",
|
||||
"last-year": "anno precedente",
|
||||
"minute": "minuto",
|
||||
"minutes": "minuti",
|
||||
"months": "mesi",
|
||||
"next-month": "prossimo mese",
|
||||
"next-week": "settimana successiva",
|
||||
"next-year": "anno successivo",
|
||||
"second": "secondo",
|
||||
"seconds": "secondi",
|
||||
"tomorrow": "domani",
|
||||
"week": "settimana",
|
||||
"weeks": "settimane",
|
||||
"years": "anni",
|
||||
"yesterday": "ieri"
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "URL della Pagina"
|
||||
},
|
||||
@@ -18,35 +42,56 @@
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"item_description": "Descrizione Articolo",
|
||||
"item_name": "Nome articolo",
|
||||
"photo_button": "Foto 📷",
|
||||
"title": "Crea Oggetto"
|
||||
"title": "Crea Articolo"
|
||||
},
|
||||
"view": {
|
||||
"selectable": {
|
||||
"card": "Scheda",
|
||||
"items": "Oggetti",
|
||||
"no_items": "Nessun Oggetto da Visualizzare",
|
||||
"items": "Articoli",
|
||||
"no_items": "Nessun Articolo da Visualizzare",
|
||||
"table": "Tabella"
|
||||
},
|
||||
"table": {
|
||||
"page": "Pagina",
|
||||
"rows_per_page": "Righe per pagina"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"label_description": "Descrizione Etichetta",
|
||||
"label_name": "Nome Etichetta",
|
||||
"title": "Crea Etichetta"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"location_description": "Descrizione ubicazione",
|
||||
"location_name": "Nome ubicazione",
|
||||
"title": "Crea Posizione"
|
||||
},
|
||||
"selector": {
|
||||
"parent_location": "Ubicazione padre"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Nessuna posizione disponibile. Aggiungi nuove posizioni mediante il pulsante\n`<`span class=\"link-primary\"`>`Crea`<`/span`>` nella barra di navigazione."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"add": "Aggiungi",
|
||||
"build": "Compila: { build }",
|
||||
"confirm": "Conferma",
|
||||
"create": "Crea",
|
||||
"create_and_add": "Crea e aggiungi un altro",
|
||||
"created": "Creato",
|
||||
"delete": "Cancella",
|
||||
"details": "Dettagli",
|
||||
"duplicate": "Duplica",
|
||||
"edit": "Modifica",
|
||||
"email": "Email",
|
||||
"follow_dev": "Segui lo Sviluppatore",
|
||||
"github": "Progetto GitHub",
|
||||
@@ -54,15 +99,29 @@
|
||||
"join_discord": "Unisciti a Discord",
|
||||
"labels": "Etichette",
|
||||
"locations": "Posizioni",
|
||||
"maintenance": "Manutenzione",
|
||||
"name": "Nome",
|
||||
"password": "Password",
|
||||
"read_docs": "Leggi la Documentazione",
|
||||
"save": "Salva",
|
||||
"search": "Cerca",
|
||||
"sign_out": "Disconnetti",
|
||||
"submit": "Invia",
|
||||
"update": "Aggiorna",
|
||||
"value": "Valore",
|
||||
"version": "Versione: { version }",
|
||||
"welcome": "Benvenuto, { username }"
|
||||
},
|
||||
"home": {
|
||||
"labels": "Etichette",
|
||||
"quick_statistics": "Statistiche rapide",
|
||||
"recently_added": "Aggiunti di recente",
|
||||
"storage_locations": "Ubicazioni di magazzino",
|
||||
"total_items": "Articoli totali",
|
||||
"total_labels": "Etichette totali",
|
||||
"total_locations": "Ubicazioni totali",
|
||||
"total_value": "Valore totale"
|
||||
},
|
||||
"index": {
|
||||
"disabled_registration": "Registrazione Disabilitata",
|
||||
"dont_join_group": "Non vuoi unirti a un gruppo?",
|
||||
@@ -77,29 +136,71 @@
|
||||
},
|
||||
"items": {
|
||||
"add": "Aggiungi",
|
||||
"advanced": "Avanzate",
|
||||
"archived": "Archiviato",
|
||||
"asset_id": "ID Asset",
|
||||
"attachment": "Allegato",
|
||||
"attachments": "Allegati",
|
||||
"changes_persisted_immediately": "Le modifiche agli allegati verranno salvate immediatamente",
|
||||
"created_at": "Creato Il",
|
||||
"custom_fields": "Campi Personalizzati",
|
||||
"field_selector": "Selettore di Campo",
|
||||
"field_value": "Valore del Campo",
|
||||
"description": "Descrizione",
|
||||
"details": "Dettagli",
|
||||
"drag_and_drop": "Trascina e rilascia i file qui o fai clic per selezionare i file",
|
||||
"edit_details": "Modifica dettagli",
|
||||
"field_selector": "Campo Selezione",
|
||||
"field_value": "Campo valore",
|
||||
"first": "Primo",
|
||||
"include_archive": "Includi Articoli Archiviati",
|
||||
"insured": "Assicurato",
|
||||
"last": "Ultimo",
|
||||
"lifetime_warranty": "Garanzia a vita",
|
||||
"location": "Luogo",
|
||||
"manual": "Manuale",
|
||||
"manuals": "Manuali",
|
||||
"manufacturer": "Marca",
|
||||
"model_number": "Numero modello",
|
||||
"name": "Nome",
|
||||
"negate_labels": "Negare Etichette Selezionate",
|
||||
"next_page": "Pagina Successiva",
|
||||
"no_results": "Nessun Articolo Trovato",
|
||||
"notes": "Note",
|
||||
"options": "Opzioni",
|
||||
"order_by": "Ordina Per",
|
||||
"pages": "Pagina { page } di { totalPages }",
|
||||
"parent_item": "Articolo principale",
|
||||
"photo": "Foto",
|
||||
"photos": "Foto",
|
||||
"prev_page": "Pagina Precedente",
|
||||
"purchase_date": "Data di acquisto",
|
||||
"purchase_details": "Dettagli dell'acquisto",
|
||||
"purchase_price": "Prezzo di acquisto",
|
||||
"purchased_from": "Acqistato da",
|
||||
"quantity": "Quantità",
|
||||
"query_id": "ID dell'Asset in Ricerca: { id }",
|
||||
"receipt": "Ricevuta",
|
||||
"receipts": "Ricevute",
|
||||
"reset_search": "Reimposta Ricerca",
|
||||
"results": "{ total } Risultati",
|
||||
"serial_number": "Numero seriale",
|
||||
"show_advanced_view_options": "Mostra opzioni di visualizzazione avanzate",
|
||||
"sold_at": "Venduto su",
|
||||
"sold_details": "Dettagli di vendita",
|
||||
"sold_price": "Prezzo di vendita",
|
||||
"sold_to": "Venduto a",
|
||||
"tip_1": "I filtri di posizione ed etichetta utilizzano l'operazione 'OR'. Se ne viene selezionato più\n di uno, ne sarà richiesto solo uno per una corrispondenza.",
|
||||
"tip_2": "Le ricerche con prefisso '#' cercheranno un ID asset (esempio '#000-001')",
|
||||
"tip_3": "I filtri di campo utilizzano l'operazione 'OR'. Se ne viene selezionato più di uno, ne sarà\n richiesto solo uno per una corrispondenza.",
|
||||
"tips": "Suggerimenti",
|
||||
"tips_sub": "Suggerimenti per la Ricerca",
|
||||
"updated_at": "Aggiornato Il"
|
||||
"updated_at": "Aggiornato Il",
|
||||
"warranty": "Garanzia",
|
||||
"warranty_details": "Dettagli garanzia",
|
||||
"warranty_expires": "Garanzia scaduta"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Nessuna etichetta trovata",
|
||||
"update_label": "Aggiorna etichetta"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Catalano",
|
||||
@@ -109,18 +210,73 @@
|
||||
"fr": "Francese",
|
||||
"hu": "Ungherese",
|
||||
"it": "Italiano",
|
||||
"ja-JP": "Giapponese",
|
||||
"nl": "Olandese",
|
||||
"pl": "Polacco",
|
||||
"pt-BR": "Portoghese (Brasile)",
|
||||
"pt-PT": "Portoghese (Portogallo)",
|
||||
"ru": "Russo",
|
||||
"sl": "Sloveno",
|
||||
"sv": "Svedese",
|
||||
"tr": "Turco",
|
||||
"uk-UA": "Ucraino",
|
||||
"zh-CN": "Cinese (semplificato)",
|
||||
"zh-HK": "Cinese Mandarino",
|
||||
"zh-MO": "Cinese (Macao)",
|
||||
"zh-TW": "Cinese (tradizionale)"
|
||||
},
|
||||
"locations": {
|
||||
"child_locations": "Ubicazione figlia",
|
||||
"collapse_tree": "Contrai albero",
|
||||
"no_results": "Nessuna posizione trovata",
|
||||
"update_location": "Aggiorna ubicazione"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
"both": "Entrambi",
|
||||
"completed": "Completato",
|
||||
"scheduled": "Pianificato"
|
||||
},
|
||||
"list": {
|
||||
"complete": "Completa",
|
||||
"create_first": "Crea la tua prima voce",
|
||||
"delete": "Elimina",
|
||||
"duplicate": "Duplicare",
|
||||
"edit": "Modifica",
|
||||
"new": "Nuova"
|
||||
},
|
||||
"modal": {
|
||||
"completed_date": "Data di completamento",
|
||||
"cost": "Costo",
|
||||
"delete_confirmation": "Sei sicuro di voler eliminare questa voce?",
|
||||
"edit_action": "Aggiornare",
|
||||
"edit_title": "Modifica voce",
|
||||
"entry_name": "Inserisci il Nome",
|
||||
"new_action": "Crea",
|
||||
"new_title": "Nuova Voce",
|
||||
"notes": "Note",
|
||||
"scheduled_date": "Data programmata"
|
||||
},
|
||||
"monthly_average": "Media mensile",
|
||||
"toast": {
|
||||
"failed_to_create": "Impossibile creare la voce",
|
||||
"failed_to_delete": "Impossibile eliminare la voce",
|
||||
"failed_to_update": "Impossibile aggiornare la voce"
|
||||
},
|
||||
"total_cost": "Costo totale",
|
||||
"total_entries": "Voci totali"
|
||||
},
|
||||
"menu": {
|
||||
"create_item": "Articolo / Asset",
|
||||
"create_label": "Etichetta",
|
||||
"create_location": "Ubicazione",
|
||||
"home": "Home",
|
||||
"locations": "Posizioni",
|
||||
"maintenance": "Manutenzione",
|
||||
"profile": "Profilo",
|
||||
"search": "Cerca",
|
||||
"tools": "Strumenti"
|
||||
},
|
||||
"profile": {
|
||||
"active": "Attivo",
|
||||
"change_password": "Cambia Password",
|
||||
@@ -130,12 +286,14 @@
|
||||
"delete_account_sub": "Elimina il tuo account e tutti i dati associati. Questa operazione non può essere annullata.",
|
||||
"display_header": "{ currentValue, select, true {Nascondi intestazione} false {Mostra intestazione} other {Sconosciuto}}",
|
||||
"enabled": "Abilitato",
|
||||
"example": "Esempio",
|
||||
"gen_invite": "Genera Link di Invito",
|
||||
"group_settings": "Impostazioni Gruppo",
|
||||
"group_settings_sub": "Impostazioni Gruppo Condivise. Potrebbe essere necessario aggiornare il browser affinché alcune impostazioni vengano applicate.",
|
||||
"inactive": "Inattivo",
|
||||
"language": "Lingua",
|
||||
"new_password": "Nuova Password",
|
||||
"no_notifiers": "Nessun notificatore configurato",
|
||||
"notifier_modal": "{ type, select, true {Modifica} false {Crea} other {Altro}} Notifier",
|
||||
"notifiers": "Notifiche",
|
||||
"notifiers_sub": "Ricevi notifiche per i prossimi promemoria di manutenzione",
|
||||
@@ -153,15 +311,15 @@
|
||||
"actions_set": {
|
||||
"ensure_ids": "Verifica ID delle risorse",
|
||||
"ensure_ids_button": "Verifica ID delle risorse",
|
||||
"ensure_ids_sub": "Garantisce che tutti gli articoli nel tuo inventario abbiano un campo asset_id valido. Questo viene fatto trovando il campo asset_id corrente più alto nel database e applicando il valore successivo a ogni elemento che ha un campo asset_id non impostato. Questo viene fatto per il campo created_at.",
|
||||
"ensure_ids_sub": "Garantisce che tutti gli articoli nel tuo inventario abbiano un campo asset_id valido. Questo viene fatto trovando il campo asset_id corrente più alto nel database e applicando il valore successivo a ogni articolo che ha un campo asset_id non impostato. Questo viene fatto per il campo created_at.",
|
||||
"ensure_import_refs": "Verifica riferimenti di importazione",
|
||||
"ensure_import_refs_button": "Verifica riferimenti di importazione",
|
||||
"ensure_import_refs_sub": "Verifica che tutti gli articoli nel tuo inventario abbiano un campo import_ref valido. Questo viene fatto generando in modo casuale una stringa di 8 caratteri per ogni elemento che ha un campo import_ref non impostato.",
|
||||
"ensure_import_refs_sub": "Verifica che tutti gli articoli nel tuo inventario abbiano un campo import_ref valido. Questo viene fatto generando in modo casuale una stringa di 8 caratteri per ogni articolo che ha un campo import_ref non impostato.",
|
||||
"set_primary_photo": "Imposta foto principale",
|
||||
"set_primary_photo_button": "Imposta immagine principale",
|
||||
"set_primary_photo_sub": "Nella versione v0.10.0 di Homebox, il campo immagine principale è stato aggiunto agli allegati di tipo foto. Questa azione imposterà il campo immagine principale alla prima immagine nella matrice allegati nel database, se non è già impostato. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'Vedi GitHub PR #576'</a>'",
|
||||
"zero_datetimes": "Azzera Data e Orario oggetti",
|
||||
"zero_datetimes_button": "Azzera Date e Ora articoli",
|
||||
"zero_datetimes": "Azzera Data e Orario articolo",
|
||||
"zero_datetimes_button": "Azzera Date e Ora articolo",
|
||||
"zero_datetimes_sub": "Reimposta il valore dell'ora per tutti i campi data e ora dell'inventario all'inizio della data. Questo è per correggere un bug che è stato introdotto all'inizio dello sviluppo del sito che ha causato il valore di orario memorizzato con il tempo che ha causato problemi con i campi data visualizzazione dei valori esatti. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'Vedi Github Issue #236 per maggiori dettagli.'</a>'"
|
||||
},
|
||||
"actions_sub": "Applica Azioni massive al tuo inventario. Questo sono azioni irreversibili. '<b>'Presta attenzione.'</b>'",
|
||||
@@ -169,10 +327,10 @@
|
||||
"import_export_set": {
|
||||
"export": "Esporta Inventario",
|
||||
"export_button": "Esporta Inventario",
|
||||
"export_sub": "Esporta il formato CSV standard per Homebox. Questo esporterà tutti gli oggetti del tuo inventario.",
|
||||
"export_sub": "Esporta il formato CSV standard per Homebox. Questo esporterà tutti gli articoli del tuo inventario.",
|
||||
"import": "Importa Inventario",
|
||||
"import_button": "Importa Inventario",
|
||||
"import_sub": "Importa il formato CSV standard per Homebox. Senza una colonna '<code>'HB.import_ref'</code>' questo '<b>'non'</b>' sovrascriverà gli oggetti esistenti nel tuo inventario, aggiungerà solamente nuovi oggetti. Le righe con una colonna '<code>'HB.import_ref'</code>' saranno unite agli oggetti esistenti con lo stesso import_ref, se presente."
|
||||
"import_sub": "Importa il formato CSV standard per Homebox. Senza una colonna '<code>'HB.import_ref'</code>' questo '<b>'non'</b>' sovrascriverà gli articoli esistenti nel tuo inventario, aggiungerà solamente nuovi articoli. Le righe con una colonna '<code>'HB.import_ref'</code>' saranno unite agli articoli esistenti con lo stesso import_ref, se presente."
|
||||
},
|
||||
"import_export_sub": "Importa ed esporta il tuo inventario da e verso un file CSV. Questo è utile per migrare il tuo inventario verso una nuova istanza di Homebox.",
|
||||
"reports": "Rapporti",
|
||||
@@ -182,7 +340,7 @@
|
||||
"asset_labels_sub": "Genera una etichetta PDF stampabile per un gruppo di ID Risorsa. Le etichette non sono specifiche per il tuo inventario così puoi stamparle in anticipo ed applicarle al tuo inventario quando lo ricevi.",
|
||||
"bill_of_materials": "Distinta base",
|
||||
"bill_of_materials_button": "Genera BOM",
|
||||
"bill_of_materials_sub": "Genera un file CSV (Comma Separated Values) che può essere importato in un foglio di calcolo. Questo è un sommario del tuo inventario con informazioni di base su oggetto e prezzo."
|
||||
"bill_of_materials_sub": "Genera un file CSV (Valori Separati dalla Virgola) che può essere importato in un foglio di calcolo. Questo è un sommario del tuo inventario con informazioni di base su articoli e prezzi."
|
||||
},
|
||||
"reports_sub": "Genera diversi report per il tuo inventario."
|
||||
}
|
||||
|
||||
98
frontend/locales/ja-JP.json
Normal file
98
frontend/locales/ja-JP.json
Normal file
@@ -0,0 +1,98 @@
|
||||
{
|
||||
"components": {
|
||||
"app": {
|
||||
"import_dialog": {
|
||||
"change_warning": "既存のimport_refsを使用したインポートの動作が変更されました",
|
||||
"upload": "アップロード"
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"page_qr_code": {
|
||||
"page_url": "ページ URL"
|
||||
},
|
||||
"password_score": {
|
||||
"password_strength": "パスワード強度"
|
||||
}
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"photo_button": "写真📷"
|
||||
},
|
||||
"view": {
|
||||
"selectable": {
|
||||
"card": "カード",
|
||||
"items": "アイテム",
|
||||
"table": "テーブル"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"title": "ラベルを作成"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"title": "ロケーションを生産する"
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"build": "ビルド: { build }",
|
||||
"email": "メール",
|
||||
"github": "GitHub プロジェクト",
|
||||
"items": "アイテム",
|
||||
"labels": "ラベル",
|
||||
"locations": "ロケーション",
|
||||
"name": "名前",
|
||||
"password": "パスワード",
|
||||
"read_docs": "ドキュメントを読む",
|
||||
"search": "サーチ"
|
||||
},
|
||||
"index": {
|
||||
"login": "ログイン",
|
||||
"set_email": "メールは何ですか?",
|
||||
"set_name": "お名前は何ですか?"
|
||||
},
|
||||
"items": {
|
||||
"add": "足す",
|
||||
"next_page": "次の ページ",
|
||||
"prev_page": "先のページ"
|
||||
},
|
||||
"languages": {
|
||||
"en": "英語",
|
||||
"es": "スペイン語",
|
||||
"fr": "フランス語",
|
||||
"hu": "ハンガリー語",
|
||||
"it": "イタリア語",
|
||||
"nl": "オランダ語",
|
||||
"pl": "ポーランド語",
|
||||
"pt-BR": "ポルトガル語 (ブラジル)",
|
||||
"ru": "ロシア語",
|
||||
"sl": "スロベニア語",
|
||||
"sv": "スウェーデン語",
|
||||
"tr": "トルコ語"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
"both": "両方"
|
||||
},
|
||||
"modal": {
|
||||
"notes": "ノート"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"language": "言語",
|
||||
"test": "テスト",
|
||||
"url": "URL"
|
||||
},
|
||||
"tools": {
|
||||
"reports": "レポート",
|
||||
"reports_set": {
|
||||
"asset_labels": "アセット ID ラベル",
|
||||
"asset_labels_button": "レベルを生成する",
|
||||
"bill_of_materials": "部品表",
|
||||
"bill_of_materials_button": "部品表を生成する"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,30 @@
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"date_time": {
|
||||
"ago": "{0} geleden",
|
||||
"days": "dagen",
|
||||
"hour": "uur",
|
||||
"hours": "uren",
|
||||
"in": "in {0}",
|
||||
"just-now": "zojuist",
|
||||
"last-month": "afgelopen maand",
|
||||
"last-week": "vorige week",
|
||||
"last-year": "afgelopen jaar",
|
||||
"minute": "minuut",
|
||||
"minutes": "minuten",
|
||||
"months": "maanden",
|
||||
"next-month": "volgende maand",
|
||||
"next-week": "volgende week",
|
||||
"next-year": "volgend jaar",
|
||||
"second": "seconde",
|
||||
"seconds": "seconden",
|
||||
"tomorrow": "morgen",
|
||||
"week": "week",
|
||||
"weeks": "weken",
|
||||
"years": "jaren",
|
||||
"yesterday": "gisteren"
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "Pagina URL"
|
||||
},
|
||||
@@ -18,6 +42,8 @@
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"item_description": "Artikelomschrijving",
|
||||
"item_name": "Artikelnaam",
|
||||
"photo_button": "Foto 📷",
|
||||
"title": "Maak object"
|
||||
},
|
||||
@@ -27,26 +53,45 @@
|
||||
"items": "Objecten",
|
||||
"no_items": "Geen objecten om te tonen",
|
||||
"table": "Tabel"
|
||||
},
|
||||
"table": {
|
||||
"page": "Pagina",
|
||||
"rows_per_page": "Rijen per pagina"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"label_description": "label beschrijving",
|
||||
"label_name": "label naam",
|
||||
"title": "Maak label"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"location_description": "Locatie omschrijving",
|
||||
"location_name": "Locatie",
|
||||
"title": "Maak locatie"
|
||||
},
|
||||
"selector": {
|
||||
"parent_location": "Hoofd locatie"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Geen locaties beschikbaar. Voeg een nieuwe locatie toe\n via de `<`span class=\"link-primary\"`>`Creeer`<`/span`> knop op het navigatie menu."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"add": "Toevoegen",
|
||||
"build": "Bouw: { build }",
|
||||
"confirm": "Bevestigen",
|
||||
"create": "Maken",
|
||||
"create_and_add": "Maak en voeg nog een toe",
|
||||
"created": "Gemaakt",
|
||||
"delete": "Verwijderen",
|
||||
"details": "Details",
|
||||
"duplicate": "Dubbel",
|
||||
"edit": "Bewerk",
|
||||
"email": "E-mail",
|
||||
"follow_dev": "Volg de ontwikkelaar",
|
||||
"github": "GitHub Project",
|
||||
@@ -54,15 +99,29 @@
|
||||
"join_discord": "Sluit je aan bij de Discord",
|
||||
"labels": "etiketten",
|
||||
"locations": "Locaties",
|
||||
"maintenance": "Onderhoud",
|
||||
"name": "Naam",
|
||||
"password": "Wachtwoord",
|
||||
"read_docs": "Lees de documentatie",
|
||||
"save": "Opslaan",
|
||||
"search": "Zoeken",
|
||||
"sign_out": "Log uit",
|
||||
"submit": "Indienen",
|
||||
"update": "Bijwerken",
|
||||
"value": "Waarde",
|
||||
"version": "Versie: { version }",
|
||||
"welcome": "Welkom, { username }"
|
||||
},
|
||||
"home": {
|
||||
"labels": "etiketten",
|
||||
"quick_statistics": "Snelle statistieken",
|
||||
"recently_added": "Recent toegevoegd",
|
||||
"storage_locations": "Verblijfplaatsen",
|
||||
"total_items": "Totale items",
|
||||
"total_labels": "Totaal aantal labels",
|
||||
"total_locations": "Totaal aantal locaties",
|
||||
"total_value": "Totale Waarde"
|
||||
},
|
||||
"index": {
|
||||
"disabled_registration": "Registratie uitgeschakeld",
|
||||
"dont_join_group": "Wil je niet aan een groep deelnemen?",
|
||||
@@ -77,32 +136,71 @@
|
||||
},
|
||||
"items": {
|
||||
"add": "Toevoegen",
|
||||
"advanced": "Geavanceerd",
|
||||
"archived": "Is gearchiveerd",
|
||||
"asset_id": "Artikel ID",
|
||||
"attachment": "Bijlage",
|
||||
"attachments": "Bijlagen",
|
||||
"changes_persisted_immediately": "Gewijzigde bijlagen worden direct opgeslagen",
|
||||
"created_at": "Aangemaakt op",
|
||||
"custom_fields": "Aangepaste velden",
|
||||
"description": "Beschrijving",
|
||||
"details": "Details",
|
||||
"drag_and_drop": "Sleep bestanden hierheen en zet ze neer of klik om bestanden te selecteren",
|
||||
"edit_details": "Details bewerken",
|
||||
"field_selector": "Veld selectie",
|
||||
"field_value": "Veldwaarde",
|
||||
"first": "Eerst",
|
||||
"include_archive": "Inclusief gearchiveerde items",
|
||||
"insured": "Verzekerde",
|
||||
"last": "Achternaam",
|
||||
"lifetime_warranty": "Levenslange garantie",
|
||||
"location": "Locatie",
|
||||
"manual": "Handmatig",
|
||||
"manuals": "Handleidingen",
|
||||
"manufacturer": "Fabrikant",
|
||||
"model_number": "Modelnummer",
|
||||
"name": "Naam",
|
||||
"negate_labels": "Negeer Geselecteerde Etiketten",
|
||||
"next_page": "Volgende pagina",
|
||||
"no_results": "Geen Items Gevonden",
|
||||
"notes": "Opmerkingen",
|
||||
"options": "Opties",
|
||||
"order_by": "Sorteren op",
|
||||
"pages": "Pagina { page } van { totalPages }",
|
||||
"parent_item": "Hoofd Item",
|
||||
"photo": "Foto",
|
||||
"photos": "Foto's",
|
||||
"prev_page": "Vorige pagina",
|
||||
"purchase_date": "Aankoopdatum",
|
||||
"purchase_details": "Aankoopdetails",
|
||||
"purchase_price": "Aankoopprijs",
|
||||
"purchased_from": "Gekocht van",
|
||||
"quantity": "Aantal",
|
||||
"query_id": "ID-nummer van object opvragen: { id }",
|
||||
"receipt": "Bewijs",
|
||||
"receipts": "Bonnetjes",
|
||||
"reset_search": "Reset Zoeken",
|
||||
"results": "{ total } Resultaten",
|
||||
"serial_number": "Serienummer",
|
||||
"show_advanced_view_options": "geavanceerde opties weergeven",
|
||||
"sold_at": "Verkocht bij",
|
||||
"sold_details": "Verkochte details",
|
||||
"sold_price": "Verkoopprijs",
|
||||
"sold_to": "Verkocht Aan",
|
||||
"tip_1": "Locatie- en labelfilters gebruiken de 'OF' -werking. Als er meer dan een is geselecteerd,\nis er maar een nodig voor een overeenkomst.",
|
||||
"tip_2": "Zoekopdrachten voorafgegaan door '#'' zullen om een object-ID vragen (bijvoorbeeld '#000-001')",
|
||||
"tip_3": "Veldfilters gebruiken de 'OF' -bewerking. Indien meer dan 1 is geselecteerd\nzal er maar 1 nodig zijn voor een match.",
|
||||
"tips": "Tips",
|
||||
"tips_sub": "Zoektips",
|
||||
"updated_at": "Bijgewerkt op"
|
||||
"updated_at": "Bijgewerkt op",
|
||||
"warranty": "Garantie",
|
||||
"warranty_details": "Garantiedetails",
|
||||
"warranty_expires": "Garantie vervalt"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Geen labels gevonden"
|
||||
"no_results": "Geen labels gevonden",
|
||||
"update_label": "Etiket bijwerken"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Catalaans",
|
||||
@@ -112,20 +210,26 @@
|
||||
"fr": "Frans",
|
||||
"hu": "Hongaars",
|
||||
"it": "Italiaans",
|
||||
"ja-JP": "Japans",
|
||||
"nl": "Nederlands",
|
||||
"pl": "Pools",
|
||||
"pt-BR": "Portugees (Brazilië)",
|
||||
"pt-PT": "Portugees (Portugal)",
|
||||
"ru": "Russisch",
|
||||
"sl": "Sloveens",
|
||||
"sv": "Zweeds",
|
||||
"tr": "Turks",
|
||||
"uk-UA": "Oekraïens",
|
||||
"zh-CN": "Chinees (vereenvoudigd)",
|
||||
"zh-HK": "Chinees (Hong Kong)",
|
||||
"zh-MO": "Chinees (Macau)",
|
||||
"zh-TW": "Chinees (traditioneel)"
|
||||
},
|
||||
"locations": {
|
||||
"no_results": "Geen locaties gevonden"
|
||||
"child_locations": "Kind Locaties",
|
||||
"collapse_tree": "Structuur invouwen",
|
||||
"no_results": "Geen locaties gevonden",
|
||||
"update_location": "Locatie bijwerken"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
@@ -156,13 +260,16 @@
|
||||
"monthly_average": "Maandelijks",
|
||||
"toast": {
|
||||
"failed_to_create": "Kan invoer niet maken",
|
||||
"failed_to_delete": "Kon item niet verwijderen.",
|
||||
"failed_to_delete": "Kon item niet verwijderen",
|
||||
"failed_to_update": "Kan invoer niet bijwerken"
|
||||
},
|
||||
"total_cost": "Totale kosten",
|
||||
"total_entries": "Totaal aantal Inzendingen"
|
||||
},
|
||||
"menu": {
|
||||
"create_item": "Artikel / Object",
|
||||
"create_label": "Label",
|
||||
"create_location": "Locatie",
|
||||
"home": "Home",
|
||||
"locations": "Locaties",
|
||||
"maintenance": "Onderhoud",
|
||||
@@ -177,10 +284,12 @@
|
||||
"current_password": "Huidig Wachtwoord",
|
||||
"delete_account": "Verwijder account",
|
||||
"delete_account_sub": "Verwijder je account en alle geassocieerde data. Deze actie kan niet ongedaan worden.",
|
||||
"display_header": "{ currentValue, select, true {Header verbergen} false {Header weergeven} other {Geen gevonden}}",
|
||||
"enabled": "ingeschakeld",
|
||||
"example": "Voorbeeld",
|
||||
"gen_invite": "Genereer Uitnodigingslink",
|
||||
"group_settings": "Groeps Instellingen",
|
||||
"group_settings_sub": "Gedeelde groepsinstellingen",
|
||||
"group_settings_sub": "Gedeelde groepsinstellingen. Het kan zijn dat je je browser moet verversen om alle instellingen te zien werken.",
|
||||
"inactive": "Inactief",
|
||||
"language": "Taal",
|
||||
"new_password": "Nieuw Wachtwoord",
|
||||
@@ -202,21 +311,26 @@
|
||||
"actions_set": {
|
||||
"ensure_ids": "Zorg voor item-ID's",
|
||||
"ensure_ids_button": "Zorg voor item-ID's",
|
||||
"ensure_ids_sub": "Zorgt ervoor dat alle artikelen in je voorraad een geldig asset_id veld hebben. Dit wordt gedaan door de hoogste huidige asset_id veld in de database te vinden en de volgende waarde toe te passen op het volgende niet ingevoerde asset_id veld. Dit gebeurt op volgorde van het created_at veld.",
|
||||
"ensure_import_refs": "Zorg ervoor dat Import Refs",
|
||||
"ensure_import_refs_button": "Zorg ervoor dat Import Refs",
|
||||
"ensure_import_refs_sub": "Zorgt ervoor dat alle artikelen in je voorraad een geldig import_ref veld hebben. Dit gebeurt door een random 8 karakter string voor elk item te maken die geen import_ref veld heeft.",
|
||||
"set_primary_photo": "Hoofdfoto instellen",
|
||||
"set_primary_photo_button": "Hoofdfoto instellen",
|
||||
"set_primary_photo_sub": "In versie v0.10.0 van Homebox is het primaire afbeeldingsveld toegevoegd aan bijlagen van het type foto. Deze actie zet de primaire afbeelding naar de eerste afbeelding in de database, indien deze nog niet ingesteld is. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'Zie GitHub PR #576'</a>'",
|
||||
"zero_datetimes": "Nul item Datum Tijden",
|
||||
"zero_datetimes_button": "Nul item Datum Tijden"
|
||||
"zero_datetimes_button": "Nul item Datum Tijden",
|
||||
"zero_datetimes_sub": "Hiermee stelt u de tijdwaarde voor alle datum-/tijdvelden in uw voorraad in op het begin van de datum. Dit is een oplossing voor een fout in de applicatie geïntroduceerd in het begin van de ontwikkeling waarbij de tijd waarde verkeerd werd opgeslagen. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'Zie Github Issue #236 voor alle details.'</a>'"
|
||||
},
|
||||
"actions_sub": "Acties bulksgewijs toepassen op je voorraad. Deze zijn onomkeerbaar '<b>'Wees voorzichtig.'</b>'",
|
||||
"import_export": "Importeer/Exporteer",
|
||||
"import_export_set": {
|
||||
"export": "Export voorraad",
|
||||
"export_button": "Export voorraad",
|
||||
"export_sub": "Exporteert het standaard CSV-formaat voor Homebox",
|
||||
"export_sub": "Exporteert het standaard CSV-formaat voor Homebox. Dit exporteert alle items in jouw inventaris.",
|
||||
"import": "Inventaris Importeren",
|
||||
"import_button": "Inventaris Importeren"
|
||||
"import_button": "Inventaris Importeren",
|
||||
"import_sub": "Importeert het standaard CSV-formaat voor Homebox. Zonder een '<code>'HB.import_ref'</code>' kolom zal dit '<b>'geen'</b>' bestaande waardes overschrijven, maar enkel nieuwe items toevoegen. Rijen met een '<code>'HB.import_ref'</code>' kolom zullen samengevoegd worden met bestaande items, als die bestaan."
|
||||
},
|
||||
"import_export_sub": "Importeer en exporteer je voorraad van en naar een CSV-bestand. Dit is handig voor het migreren van je voorraad naar een nieuwe HomeBox installatie.",
|
||||
"reports": "Rapportages",
|
||||
|
||||
@@ -2,13 +2,36 @@
|
||||
"components": {
|
||||
"app": {
|
||||
"import_dialog": {
|
||||
"change_warning": "Zachowanie przy imporcie z istniejącymi import_ref zostało zmienione. Jeśli import_ref jest obecny w pliku CSV, \nprzedmiot zostanie zaktualizowany zgodnie z wartościami w pliku CSV.",
|
||||
"description": "Zaimportuj plik CSV zawierający Twoje przedmioty, etykiety i lokalizacje. Zobacz dokumentację, aby uzyskać \nwięcej informacji na temat wymaganego formatu.",
|
||||
"title": "Zaimportuj plik CSV",
|
||||
"upload": "Prześlij",
|
||||
"change_warning": "Zachowanie przy imporcie z istniejącymi import_ref zostało zmienione. Jeśli import_ref jest obecny w pliku CSV, \nprzedmiot zostanie zaktualizowany zgodnie z wartościami w pliku CSV."
|
||||
"upload": "Prześlij"
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"date_time": {
|
||||
"ago": "{0} temu",
|
||||
"days": "dni",
|
||||
"hour": "godzina",
|
||||
"hours": "godziny",
|
||||
"just-now": "teraz",
|
||||
"last-month": "ostatni miesiąc",
|
||||
"last-week": "ostatni tydzień",
|
||||
"last-year": "ostatni rok",
|
||||
"minute": "minuta",
|
||||
"minutes": "minuty",
|
||||
"months": "miesiące",
|
||||
"next-month": "następny miesiąc",
|
||||
"next-week": "następny tydzień",
|
||||
"next-year": "następny rok",
|
||||
"second": "sekunda",
|
||||
"seconds": "sekundy",
|
||||
"tomorrow": "jutro",
|
||||
"week": "tydzień",
|
||||
"weeks": "tygodnie",
|
||||
"years": "lat",
|
||||
"yesterday": "wczoraj"
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "Adres URL strony"
|
||||
},
|
||||
@@ -18,8 +41,10 @@
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"title": "Utwórz przedmiot",
|
||||
"photo_button": "Zdjęcie 📷"
|
||||
"item_description": "Opis przedmiotu",
|
||||
"item_name": "Nazwa przedmiotu",
|
||||
"photo_button": "Zdjęcie 📷",
|
||||
"title": "Utwórz przedmiot"
|
||||
},
|
||||
"view": {
|
||||
"selectable": {
|
||||
@@ -27,102 +52,265 @@
|
||||
"items": "Przedmioty",
|
||||
"no_items": "Brak przedmiotów do wyświetlenia",
|
||||
"table": "Tabela"
|
||||
},
|
||||
"table": {
|
||||
"page": "Strona",
|
||||
"rows_per_page": "Wiersze na stronę"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"label_description": "Opis etykiety",
|
||||
"label_name": "Nazwa etykiety",
|
||||
"title": "Stwórz nową etykietę"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"location_description": "Opis lokalizacji",
|
||||
"location_name": "Nazwa lokalizacji",
|
||||
"title": "Utwórz lokalizację"
|
||||
},
|
||||
"selector": {
|
||||
"parent_location": "Nadrzędna lokalizacja"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Brak dostępnych lokalizacji. Dodaj nowe lokalizacje poprzez przycisk\n `<`span class=\"link-primary\"`>`Utwórz`<`/span`>` na pasku nawigacyjnym."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"add": "Dodaj",
|
||||
"build": "Kompilacja: {build}",
|
||||
"follow_dev": "Śledź dewelopera",
|
||||
"github": "Projekt na GitHubie",
|
||||
"items": "Przedmioty",
|
||||
"version": "Wersja:{version}",
|
||||
"welcome": "Witaj, {username}",
|
||||
"confirm": "Potwierdź",
|
||||
"create": "Utwórz",
|
||||
"create_and_add": "Utwórz i dodaj kolejny",
|
||||
"created": "Utworzone",
|
||||
"delete": "Usuń",
|
||||
"details": "Szczegóły",
|
||||
"duplicate": "Duplikat",
|
||||
"edit": "Edytuj",
|
||||
"email": "E-mail",
|
||||
"follow_dev": "Śledź dewelopera",
|
||||
"github": "Projekt na GitHubie",
|
||||
"items": "Przedmioty",
|
||||
"join_discord": "Dołącz do Discorda",
|
||||
"labels": "Etykiety",
|
||||
"locations": "Lokalizacje",
|
||||
"maintenance": "Konserwacja",
|
||||
"name": "Nazwa",
|
||||
"password": "Hasło",
|
||||
"read_docs": "Przeczytaj dokumentację",
|
||||
"save": "Zapisz",
|
||||
"search": "Wyszukaj",
|
||||
"sign_out": "Wyloguj się",
|
||||
"submit": "Wyślij"
|
||||
"submit": "Wyślij",
|
||||
"update": "Aktualizuj",
|
||||
"value": "Wartość",
|
||||
"version": "Wersja:{version}",
|
||||
"welcome": "Witaj, {username}"
|
||||
},
|
||||
"home": {
|
||||
"labels": "Etykiety",
|
||||
"quick_statistics": "Szybkie statystyki",
|
||||
"recently_added": "Ostatnio dodane",
|
||||
"total_items": "Łączna liczba produktów",
|
||||
"total_labels": "Łączna liczba etykiet",
|
||||
"total_locations": "Łączna liczba lokalizacji",
|
||||
"total_value": "Łączna wartość"
|
||||
},
|
||||
"index": {
|
||||
"set_password": "Ustaw swoje hasło",
|
||||
"dont_join_group": "Nie chcesz dołączyć do grupy?",
|
||||
"disabled_registration": "Rejestracja jest wyłączona",
|
||||
"dont_join_group": "Nie chcesz dołączyć do grupy?",
|
||||
"joining_group": "Dołączasz do istniejącej grupy!",
|
||||
"login": "Zaloguj się",
|
||||
"register": "Zarejestruj się",
|
||||
"remember_me": "Zapamiętaj mnie",
|
||||
"set_email": "Jaki jest Twój adres e-mail?",
|
||||
"set_name": "Jak się nazywasz?",
|
||||
"set_password": "Ustaw swoje hasło",
|
||||
"tagline": "Śledź, organizuj i zarządzaj swoimi rzeczami."
|
||||
},
|
||||
"items": {
|
||||
"add": "Dodaj",
|
||||
"advanced": "Zaawansowane",
|
||||
"archived": "Zarchiwizowane",
|
||||
"attachment": "Załącznik",
|
||||
"attachments": "Załączniki",
|
||||
"changes_persisted_immediately": "Zmiany w załącznikach zostaną natychmiast zapisane",
|
||||
"created_at": "Data utworzenia",
|
||||
"custom_fields": "Pola niestandardowe",
|
||||
"description": "Opis",
|
||||
"details": "Szczegóły",
|
||||
"drag_and_drop": "Przeciągnij i upuść pliki tutaj lub kliknij, aby wybrać pliki",
|
||||
"edit_details": "Edytuj szczegóły",
|
||||
"field_selector": "Selektor pól",
|
||||
"field_value": "Wartość pola",
|
||||
"first": "Pierwszy",
|
||||
"include_archive": "Uwzględnij zarchiwizowane przedmioty",
|
||||
"negate_labels": "Neguj wybrane etykiety",
|
||||
"no_results": "Nie znaleziono przedmiotów",
|
||||
"query_id": "Zapytanie o numer identyfikacyjny zasobu: { id }",
|
||||
"results": "{ total } wyniki",
|
||||
"tip_3": "Filtry pól używają operacji 'LUB'. Jeśli wybrano więcej niż jeden, wystarczy jeden, \naby uzyskać dopasowanie.",
|
||||
"updated_at": "Zaktualizowano",
|
||||
"tip_1": "Filtry lokalizacji i etykiet używają operacji 'LUB'. Jeśli wybrano więcej niż jeden, wystarczy jeden, \naby uzyskać dopasowanie.",
|
||||
"pages": "Strona {page} z {totalPages}",
|
||||
"add": "Dodaj",
|
||||
"custom_fields": "Pola niestandardowe",
|
||||
"insured": "Ubezpieczony",
|
||||
"last": "Ostatni",
|
||||
"lifetime_warranty": "Dożywotnia gwarancja",
|
||||
"location": "Lokalizacja",
|
||||
"manual": "Instrukcja",
|
||||
"manuals": "Instrukcje",
|
||||
"manufacturer": "Producent",
|
||||
"model_number": "Model",
|
||||
"name": "Nazwa",
|
||||
"negate_labels": "Neguj wybrane etykiety",
|
||||
"next_page": "Następna strona",
|
||||
"no_results": "Nie znaleziono przedmiotów",
|
||||
"notes": "Notatki",
|
||||
"options": "Opcje",
|
||||
"order_by": "Ułóż według",
|
||||
"pages": "Strona {page} z {totalPages}",
|
||||
"parent_item": "Nadrzędny obiekt",
|
||||
"photo": "Zdjęcie",
|
||||
"photos": "Zdjęcia",
|
||||
"prev_page": "Poprzednia strona",
|
||||
"purchase_date": "Data zakupu",
|
||||
"purchase_details": "Szczegóły zakupu",
|
||||
"purchase_price": "Cena zakupu",
|
||||
"purchased_from": "Zakupiono od",
|
||||
"quantity": "Ilość",
|
||||
"query_id": "Zapytanie o numer identyfikacyjny zasobu: { id }",
|
||||
"receipt": "Paragon",
|
||||
"receipts": "Paragony",
|
||||
"reset_search": "Zresetuj wyszukiwanie",
|
||||
"results": "{ total } wyniki",
|
||||
"serial_number": "Numer seryjny",
|
||||
"show_advanced_view_options": "Pokaż ustawienia zaawansowane",
|
||||
"sold_at": "Sprzedane w",
|
||||
"sold_details": "Szczegóły sprzedaży",
|
||||
"sold_price": "Cena sprzedaży",
|
||||
"sold_to": "Sprzedane do",
|
||||
"tip_1": "Filtry lokalizacji i etykiet używają operacji 'LUB'. Jeśli wybrano więcej niż jeden, wystarczy jeden, \naby uzyskać dopasowanie.",
|
||||
"tip_2": "Wyszukiwania poprzedzone prefiksem \"#\" będą wysyłać zapytanie o identyfikator zasobu (na przykład \"#000-001\")",
|
||||
"tip_3": "Filtry pól używają operacji 'LUB'. Jeśli wybrano więcej niż jeden, wystarczy jeden, \naby uzyskać dopasowanie.",
|
||||
"tips": "Wskazówki",
|
||||
"tips_sub": "Wskazówki wyszukiwania",
|
||||
"order_by": "Ułóż według"
|
||||
"updated_at": "Zaktualizowano",
|
||||
"warranty": "Gwarancja",
|
||||
"warranty_details": "Szczegóły gwarancji",
|
||||
"warranty_expires": "Gwarancja wygasa"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Nie znaleziono etykiet",
|
||||
"update_label": "Aktualizuj etykietę"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Kataloński",
|
||||
"de": "Niemiecki",
|
||||
"en": "Angielski",
|
||||
"es": "Hiszpański",
|
||||
"fr": "Francuski",
|
||||
"hu": "Węgierski",
|
||||
"it": "Włoski",
|
||||
"ja-JP": "Japoński",
|
||||
"nl": "Holenderski",
|
||||
"pl": "Polski",
|
||||
"pt-BR": "Portugalski (Brazylia)",
|
||||
"pt-PT": "Portugalski (Portugalia)",
|
||||
"ru": "Rosyjski",
|
||||
"sl": "Słoweński",
|
||||
"sv": "Szwedzki",
|
||||
"tr": "Turecki",
|
||||
"uk-UA": "Ukraiński",
|
||||
"zh-CN": "Chiński (uproszczony)",
|
||||
"zh-HK": "Chiński (Hong Kong)",
|
||||
"zh-MO": "Chiński (Makau)",
|
||||
"zh-TW": "Chiński (tradycyjny)"
|
||||
},
|
||||
"locations": {
|
||||
"child_locations": "Podlokalizacje",
|
||||
"collapse_tree": "Zwiń drzewo",
|
||||
"no_results": "Nie znaleziono lokalizacji",
|
||||
"update_location": "Zaktualizuj lokalizację"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
"both": "Oba",
|
||||
"completed": "Zrealizowane",
|
||||
"scheduled": "Nadchodzące"
|
||||
},
|
||||
"list": {
|
||||
"complete": "Zakończone",
|
||||
"create_first": "Stwórz swój pierwszy wpis",
|
||||
"delete": "Usuń",
|
||||
"duplicate": "Duplikuj",
|
||||
"edit": "Edytuj",
|
||||
"new": "Nowe"
|
||||
},
|
||||
"modal": {
|
||||
"completed_date": "Data zakończenia",
|
||||
"cost": "Koszt",
|
||||
"delete_confirmation": "Czy na pewno chcesz usunąć ten wpis?",
|
||||
"edit_action": "Aktualizuj",
|
||||
"edit_title": "Edytuj wpis",
|
||||
"entry_name": "Nazwa wpisu",
|
||||
"new_action": "Utwórz",
|
||||
"new_title": "Nowy wpis",
|
||||
"notes": "Notatki",
|
||||
"scheduled_date": "Zaplanowana data"
|
||||
},
|
||||
"monthly_average": "Miesięczna średnia",
|
||||
"toast": {
|
||||
"failed_to_create": "Nie udało się utworzyć wpisu",
|
||||
"failed_to_delete": "Nie udało się usunąć wpisu",
|
||||
"failed_to_update": "Nie udało się zaktualizować wpisu"
|
||||
},
|
||||
"total_cost": "Całkowity koszt",
|
||||
"total_entries": "Suma wpisów"
|
||||
},
|
||||
"menu": {
|
||||
"create_item": "Przedmiot / Zasób",
|
||||
"create_label": "Etykieta",
|
||||
"create_location": "Lokalizacja",
|
||||
"home": "Strona główna",
|
||||
"locations": "Lokalizacje",
|
||||
"maintenance": "Konserwacja",
|
||||
"profile": "Profil",
|
||||
"search": "Wyszukaj",
|
||||
"tools": "Narzędzia"
|
||||
},
|
||||
"profile": {
|
||||
"active": "Aktywny",
|
||||
"change_password": "Zmiana hasła",
|
||||
"currency_format": "Format waluty",
|
||||
"current_password": "Bieżące hasło",
|
||||
"delete_account": "Usuń konto",
|
||||
"delete_account_sub": "Usuń swoje konto oraz wszystkie powiązane z nim dane. Tego nie można cofnąć.",
|
||||
"current_password": "Bieżące hasło",
|
||||
"group_settings_sub": "Ustawienia grupy udostępnione. Możesz potrzebować odświeżyć przeglądarkę, aby niektóre ustawienia zostały zastosowane.",
|
||||
"inactive": "Nieaktywny",
|
||||
"new_password": "Nowe hasło",
|
||||
"notifier_modal": "{type, select, true {Edytuj} false {Utwórz} other {Inny}} Powiadomiacz",
|
||||
"enabled": "Włączone",
|
||||
"example": "Przykład",
|
||||
"gen_invite": "Wygeneruj link z zaproszeniem",
|
||||
"group_settings": "Ustawienia grupy",
|
||||
"group_settings_sub": "Ustawienia grupy udostępnione. Możesz potrzebować odświeżyć przeglądarkę, aby niektóre ustawienia zostały zastosowane.",
|
||||
"inactive": "Nieaktywny",
|
||||
"language": "Język",
|
||||
"new_password": "Nowe hasło",
|
||||
"no_notifiers": "Nie skonfigurowano powiadomień",
|
||||
"notifier_modal": "{type, select, true {Edytuj} false {Utwórz} other {Inny}} Powiadomiacz",
|
||||
"notifiers": "Powiadomiacze",
|
||||
"notifiers_sub": "Otrzymuj powiadomienia o nadchodzących przypomnieniach o konserwacji",
|
||||
"theme_settings_sub": "Ustawienia motywu są przechowywane w lokalnej pamięci przeglądarki. Możesz zmienić motyw w dowolnym momencie. \nJeśli masz problemy z ustawieniem motywu, spróbuj odświeżyć przeglądarkę.",
|
||||
"test": "Test",
|
||||
"theme_settings": "Ustawienia tematu",
|
||||
"theme_settings_sub": "Ustawienia motywu są przechowywane w lokalnej pamięci przeglądarki. Możesz zmienić motyw w dowolnym momencie. \nJeśli masz problemy z ustawieniem motywu, spróbuj odświeżyć przeglądarkę.",
|
||||
"update_group": "Zaktualizuj grupę",
|
||||
"update_language": "Aktualizuj język",
|
||||
"url": "Adres URL",
|
||||
"user_profile": "Profil użytkownika",
|
||||
"user_profile_sub": "Zaproś użytkowników i zarządzaj swoim kontem."
|
||||
},
|
||||
"tools": {
|
||||
"actions": "Akcje na zasobach",
|
||||
"actions_set": {
|
||||
"ensure_ids": "Zapewnienie identyfikatorów zasobów",
|
||||
"ensure_import_refs_sub": "Zapewnia, że wszystkie przedmioty w Twoim asortymencie mają prawidłowe pole import_ref",
|
||||
"set_primary_photo": "Ustaw główne zdjęcie",
|
||||
"set_primary_photo_button": "Ustaw główne zdjęcie",
|
||||
"set_primary_photo_sub": "W wersji v0.10.0 Homebox pole głównego obrazu zostało dodane do załączników typu zdjęcie. Ta akcja ustawi pole głównego obrazu do pierwszego zdjęcia w załącznikach z bazy danych, jeżeli nie jest już ustawione. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'Zobacz GitHub PR #576'</a>'"
|
||||
},
|
||||
"import_export": "Import/eksport"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,12 +75,6 @@
|
||||
"set_password": "Defina a sua senha",
|
||||
"tagline": "Acompanhe, organize e faça a gestão das suas coisas."
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Nenhuma etiqueta encontrada"
|
||||
},
|
||||
"locations": {
|
||||
"no_results": "Nenhuma localização encontrada"
|
||||
},
|
||||
"items": {
|
||||
"add": "Adicionar",
|
||||
"created_at": "Criado em",
|
||||
@@ -107,6 +101,9 @@
|
||||
"tips_sub": "Dicas de pesquisa",
|
||||
"updated_at": "Atualizado em"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Nenhuma etiqueta encontrada"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Catalão",
|
||||
"de": "Alemão",
|
||||
@@ -127,6 +124,9 @@
|
||||
"zh-MO": "Chinês (Macau)",
|
||||
"zh-TW": "Chinês (Tradicional)"
|
||||
},
|
||||
"locations": {
|
||||
"no_results": "Nenhuma localização encontrada"
|
||||
},
|
||||
"profile": {
|
||||
"active": "Ativo",
|
||||
"change_password": "Alterar Senha",
|
||||
@@ -138,17 +138,17 @@
|
||||
"enabled": "Ativado",
|
||||
"gen_invite": "Gerar link de convite",
|
||||
"group_settings": "Definições de Grupo",
|
||||
"group_settings_sub": "Definições de Grupo Partilhadas. Pode ter de atualizar a página para algumas definições serem aplicadas.",
|
||||
"group_settings_sub": "Definições de Grupo Partilhadas. Pode ter de atualizar a página para algumas definições serem aplicadas.",
|
||||
"inactive": "Inativo",
|
||||
"language": "Idioma",
|
||||
"new_password": "Nova Senha",
|
||||
"no_notifiers": "Nenhum notificador configurado",
|
||||
"notifier_modal": "{ type, select, true {Editar} false {Criar} other {Outro}} Notificador",
|
||||
"notifiers": "Notificadores",
|
||||
"notifiers_sub": "Receba notificações para os próximos lembretes de manutenção",
|
||||
"no_notifiers": "Nenhum notificador configurado",
|
||||
"test": "Testar",
|
||||
"theme_settings": "Definições do tema",
|
||||
"theme_settings_sub": "As configurações do tema são guardadas no armazenamento local do seu navegador. Pode alterar o tema em qualquer altura.\nSe encontrar algum problema com a alteração do tema, tente refrescar o browser.",
|
||||
"theme_settings_sub": "As configurações do tema são guardadas no armazenamento local do seu navegador. Pode alterar o tema em qualquer altura.\nSe encontrar algum problema com a alteração do tema, tente refrescar o browser.",
|
||||
"update_group": "Atualizar Grupo",
|
||||
"update_language": "Atualizar Idioma",
|
||||
"url": "URL",
|
||||
@@ -170,7 +170,7 @@
|
||||
"zero_datetimes": "Zero Item Data e Hora",
|
||||
"zero_datetimes_button": "Zero Data Horas do Item"
|
||||
},
|
||||
"actions_sub": "Aplicar Ações ao seu inventário em massa. Estas acções são irreversíveis. '<b>'Cuidado.'</b>'",
|
||||
"actions_sub": "Aplicar Ações ao seu inventário em massa. Estas acções são irreversíveis. '<b>'Cuidado.'</b>'",
|
||||
"import_export": "Importar/Exportar",
|
||||
"import_export_set": {
|
||||
"export": "Exportar Inventário",
|
||||
@@ -178,7 +178,7 @@
|
||||
"export_sub": "Exporta o formato CSV padrão para o Homebox. Isto vai exportar todos os items do inventário.",
|
||||
"import": "Importar inventário",
|
||||
"import_button": "Importar inventário",
|
||||
"import_sub": "Importa o formato standard do CSV para o Homebox. Sem uma coluna '<code>'HB.import_ref'</code>' , isto '<b>'não '</b>' vai escrever por cima de items existentes no inventário, apenas adiciona novos. As linhas com uma coluna '<code>'HB.import_ref'</code>' vão ser fundidas com os items que tenham o mesmo import_ref, se existirem."
|
||||
"import_sub": "Importa o formato standard do CSV para o Homebox. Sem uma coluna '<code>'HB.import_ref'</code>' , isto '<b>'não '</b>' vai escrever por cima de items existentes no inventário, apenas adiciona novos. As linhas com uma coluna '<code>'HB.import_ref'</code>' vão ser fundidas com os items que tenham o mesmo import_ref, se existirem."
|
||||
},
|
||||
"import_export_sub": "Importe e exporte o seu inventário de e para um ficheiro CSV. Isto é útil para migrar o inventário para uma nova instância do Homebox.",
|
||||
"reports": "Relatórios",
|
||||
|
||||
211
frontend/locales/ro-RO.json
Normal file
211
frontend/locales/ro-RO.json
Normal file
@@ -0,0 +1,211 @@
|
||||
{
|
||||
"components": {
|
||||
"app": {
|
||||
"import_dialog": {
|
||||
"title": "Importă fișier CSV",
|
||||
"upload": "Încarcă"
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"page_qr_code": {
|
||||
"page_url": "URL Pagină"
|
||||
},
|
||||
"password_score": {
|
||||
"password_strength": "Complexitate Parolă"
|
||||
}
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"photo_button": "Imagine 📷",
|
||||
"title": "Crează articol"
|
||||
},
|
||||
"view": {
|
||||
"selectable": {
|
||||
"card": "Cartelă",
|
||||
"items": "Articole",
|
||||
"no_items": "Nu există articole pentru afișare",
|
||||
"table": "Tabel"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"title": "Crează Etichetă"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"title": "Crează Locație"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Nu există locații disponibile. Adaugă o locație nouă folosind butonul\n`<`span class=\"link-primary\"`>`Crează`<`/span`>` din bara de navigație."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"build": "Build: { build }",
|
||||
"confirm": "Confirmă",
|
||||
"create": "Crează",
|
||||
"create_and_add": "Crează și Adaugă încă un articol",
|
||||
"created": "Creat",
|
||||
"email": "Adresă de email",
|
||||
"follow_dev": "Urmărește developer-ul",
|
||||
"github": "Proiect GitHub",
|
||||
"items": "Articole",
|
||||
"join_discord": "Vino pe Discord",
|
||||
"labels": "Etichete",
|
||||
"locations": "Locații",
|
||||
"name": "Nume",
|
||||
"password": "Parolă",
|
||||
"read_docs": "Citește documentația",
|
||||
"search": "Caută",
|
||||
"sign_out": "Ieșire",
|
||||
"submit": "Trimite",
|
||||
"version": "Versiune: { version }",
|
||||
"welcome": "Bun venit, { username }"
|
||||
},
|
||||
"index": {
|
||||
"disabled_registration": "Înregistrare Dezactivată",
|
||||
"dont_join_group": "Nu vrei sa te alături unui grup?",
|
||||
"joining_group": "Te alături unui grup existent!",
|
||||
"login": "Autentificare",
|
||||
"register": "Înregistrare",
|
||||
"remember_me": "Ține-mă minte",
|
||||
"set_email": "Care este adresa ta de email?",
|
||||
"set_name": "Care este numele tău?",
|
||||
"set_password": "Setează-ți parola",
|
||||
"tagline": "Urmărește, Organizează și Gestionează lucrurile tale."
|
||||
},
|
||||
"items": {
|
||||
"add": "Adaugă",
|
||||
"created_at": "Creat la",
|
||||
"custom_fields": "Câmpuri personalizate",
|
||||
"field_selector": "Selector Câmp",
|
||||
"field_value": "Valoare Câmp",
|
||||
"first": "Primul",
|
||||
"include_archive": "Include Articole Arhivate",
|
||||
"last": "Ultimul",
|
||||
"negate_labels": "Neagă Etichetele Selectate",
|
||||
"next_page": "Următoarea Pagină",
|
||||
"no_results": "Nu s-au găsit articole",
|
||||
"options": "Opțiuni",
|
||||
"order_by": "Ordonează După",
|
||||
"pages": "Pagina { page } din { totalPages }",
|
||||
"prev_page": "Pagina Anterioară",
|
||||
"reset_search": "Resetează Căutare",
|
||||
"results": "{ total } Rezultate",
|
||||
"tip_2": "Căutările prefixate cu '#' vor efectua o căutare după ID de activ (exemplu '#000-001')",
|
||||
"tips": "Sfaturi",
|
||||
"tips_sub": "Sfaturi Căutare",
|
||||
"updated_at": "Actualizat La"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Nu s-au găsit Etichete"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Catalană",
|
||||
"de": "Germană",
|
||||
"en": "Engleză",
|
||||
"es": "Spaniolă",
|
||||
"fr": "Franceză",
|
||||
"hu": "Maghiară",
|
||||
"it": "Italiană",
|
||||
"nl": "Olandeză",
|
||||
"pl": "Poloneză",
|
||||
"pt-BR": "Portugheză (Brazilia)",
|
||||
"ru": "Rusă",
|
||||
"sl": "Slovenă",
|
||||
"sv": "Suedeză",
|
||||
"tr": "Turcă",
|
||||
"zh-CN": "Chineză (Simplificată)",
|
||||
"zh-HK": "Chineză (Hong Kong)",
|
||||
"zh-MO": "Chineză (Macau)",
|
||||
"zh-TW": "Chineză (Tradițională)"
|
||||
},
|
||||
"locations": {
|
||||
"no_results": "Nu s-au găsit Locații"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
"both": "Ambele",
|
||||
"completed": "Finalizat",
|
||||
"scheduled": "Programat"
|
||||
},
|
||||
"list": {
|
||||
"complete": "Finalizat",
|
||||
"create_first": "Crează Prima ta Înregistrare",
|
||||
"delete": "Șterge",
|
||||
"duplicate": "Duplicat",
|
||||
"edit": "Redactare",
|
||||
"new": "Nou"
|
||||
},
|
||||
"modal": {
|
||||
"completed_date": "Dată finalizare",
|
||||
"cost": "Preț",
|
||||
"delete_confirmation": "Ești sigur ca dorești ștergerea acestei înregistrări?",
|
||||
"edit_action": "Actualizare",
|
||||
"edit_title": "Redactare Înregistrare",
|
||||
"entry_name": "Nume Înregistrare",
|
||||
"new_action": "Crează",
|
||||
"new_title": "Înregistrare Nouă",
|
||||
"notes": "Notițe",
|
||||
"scheduled_date": "Dată Programată"
|
||||
},
|
||||
"monthly_average": "Media Lunară",
|
||||
"toast": {
|
||||
"failed_to_create": "Nu s-a putut crea înregistrarea",
|
||||
"failed_to_delete": "Nu s-a putut șterge înregistrarea",
|
||||
"failed_to_update": "Nu s-a putut actualiza înregistrarea"
|
||||
},
|
||||
"total_cost": "Preț Total",
|
||||
"total_entries": "Înregistrări Totale"
|
||||
},
|
||||
"menu": {
|
||||
"home": "Acasă",
|
||||
"locations": "Locații",
|
||||
"maintenance": "Mentenanță",
|
||||
"profile": "Profil",
|
||||
"search": "Caută",
|
||||
"tools": "Unelte"
|
||||
},
|
||||
"profile": {
|
||||
"active": "Activ",
|
||||
"change_password": "Schimbă Parola",
|
||||
"currency_format": "Format monedă",
|
||||
"current_password": "Parola Actuală",
|
||||
"delete_account": "Șterge Cont",
|
||||
"enabled": "Activat",
|
||||
"gen_invite": "Generează Link Invitație",
|
||||
"group_settings": "Setări Grup",
|
||||
"inactive": "Inactiv",
|
||||
"language": "Limbă",
|
||||
"new_password": "Parolă Nouă",
|
||||
"test": "Test",
|
||||
"theme_settings": "Setări Temă",
|
||||
"update_group": "Actualizare Grup",
|
||||
"update_language": "Actualizare Limbă",
|
||||
"url": "URL",
|
||||
"user_profile": "Profil Utilizator"
|
||||
},
|
||||
"tools": {
|
||||
"actions": "Acțiuni Inventar",
|
||||
"actions_set": {
|
||||
"set_primary_photo": "Setează ca Imagine Principală",
|
||||
"set_primary_photo_button": "Setează ca Imagine Principală"
|
||||
},
|
||||
"import_export": "Import/Export",
|
||||
"import_export_set": {
|
||||
"export": "Exportă Inventar",
|
||||
"export_button": "Exportă Inventar",
|
||||
"import": "Importă Inventar",
|
||||
"import_button": "Importă Inventar"
|
||||
},
|
||||
"reports": "Rapoarte",
|
||||
"reports_set": {
|
||||
"asset_labels": "Etichete de identificare a activului",
|
||||
"asset_labels_button": "Generator de etichete",
|
||||
"bill_of_materials": "Lista Materialelor",
|
||||
"bill_of_materials_button": "Generează BOM"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,29 @@
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"date_time": {
|
||||
"ago": "{0} назад",
|
||||
"days": "дней",
|
||||
"hour": "час",
|
||||
"hours": "часов",
|
||||
"in": "через {0}",
|
||||
"last-month": "предыдущий месяц",
|
||||
"last-week": "предыдущая неделя",
|
||||
"last-year": "предыдущий год",
|
||||
"minute": "минута",
|
||||
"minutes": "минут",
|
||||
"months": "месяцев",
|
||||
"next-month": "следующий месяц",
|
||||
"next-week": "следующая неделя",
|
||||
"next-year": "следующий год",
|
||||
"second": "секунда",
|
||||
"seconds": "секунд",
|
||||
"tomorrow": "завтра",
|
||||
"week": "неделя",
|
||||
"weeks": "недели",
|
||||
"years": "лет",
|
||||
"yesterday": "вчера"
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "URL-адрес страницы"
|
||||
},
|
||||
@@ -18,6 +41,8 @@
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"item_description": "Описание элемента",
|
||||
"item_name": "Имя элемента",
|
||||
"photo_button": "Фото 📷",
|
||||
"title": "Создать элемент"
|
||||
},
|
||||
@@ -27,17 +52,24 @@
|
||||
"items": "Элементы",
|
||||
"no_items": "Нет элементов для отображения",
|
||||
"table": "Таблица"
|
||||
},
|
||||
"table": {
|
||||
"page": "Страница",
|
||||
"rows_per_page": "Строк на странице"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"title": "Создать ярлык"
|
||||
"title": "Создать метку"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"title": "Создать локацию"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Нет доступных локаций. Добавьте новую локацию, \nнажав на кнопку `<`span class=\"link-primary\"`>`Создать`<`/span`>` в навигационном меню."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -49,10 +81,10 @@
|
||||
"created": "Создано",
|
||||
"email": "Email",
|
||||
"follow_dev": "Следить за разработчиком",
|
||||
"github": "Проект Github",
|
||||
"github": "Github проект",
|
||||
"items": "Элементы",
|
||||
"join_discord": "Присоединяйтесь к Discord",
|
||||
"labels": "Ярлыки",
|
||||
"labels": "Метки",
|
||||
"locations": "Локации",
|
||||
"name": "Имя",
|
||||
"password": "Пароль",
|
||||
@@ -82,7 +114,7 @@
|
||||
"field_selector": "Поле выбора",
|
||||
"field_value": "Значение поля",
|
||||
"first": "Первый",
|
||||
"include_archive": "Включить архивированные элементы",
|
||||
"include_archive": "Включая архивированные элементы",
|
||||
"last": "Последний",
|
||||
"negate_labels": "Снять выбранные ярлыки",
|
||||
"next_page": "Следующая страница",
|
||||
@@ -92,7 +124,7 @@
|
||||
"pages": "Страница {page} из {totalPages}",
|
||||
"prev_page": "Предыдущая страница",
|
||||
"query_id": "Запрос идентификационного номера актива: { id }",
|
||||
"reset_search": "Сбросить Поиск",
|
||||
"reset_search": "Сбросить поиск",
|
||||
"results": "{ total } Результатов",
|
||||
"tip_1": "При фильтрации по локации и по ярлыкам используется логический оператор «ИЛИ». Если выбрано несколько фильтров, то для срабатывания\n требуется лишь одно совпадение.",
|
||||
"tip_2": "Поисковые запросы с префиксом \"#\" должны включать в себя ID актива (прим. '#000-001')",
|
||||
@@ -101,6 +133,75 @@
|
||||
"tips_sub": "Поисковые подсказки",
|
||||
"updated_at": "Обновлено в"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Метки не найдены"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Каталанский",
|
||||
"de": "Немецкий",
|
||||
"en": "Английский",
|
||||
"es": "Испанский",
|
||||
"fr": "французский",
|
||||
"hu": "Венгерский",
|
||||
"it": "Итальянский",
|
||||
"nl": "Голландский",
|
||||
"pl": "Польский",
|
||||
"pt-BR": "Португальский (Бразилия)",
|
||||
"ru": "Русский",
|
||||
"sl": "Словенский",
|
||||
"sv": "Шведский",
|
||||
"tr": "Турецкий",
|
||||
"zh-CN": "Китайский (упрощенный)",
|
||||
"zh-HK": "Китайский (Гонконг)",
|
||||
"zh-MO": "Китайский (Макао)",
|
||||
"zh-TW": "китайский (традиционный)"
|
||||
},
|
||||
"locations": {
|
||||
"no_results": "Локаций не найдено"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
"both": "Оба",
|
||||
"completed": "Завершено",
|
||||
"scheduled": "Запланировано"
|
||||
},
|
||||
"list": {
|
||||
"complete": "Завершить",
|
||||
"create_first": "Создайте свою первую запись",
|
||||
"delete": "Удалить",
|
||||
"duplicate": "Дубликат",
|
||||
"edit": "Изменить",
|
||||
"new": "Новое"
|
||||
},
|
||||
"modal": {
|
||||
"completed_date": "Дата завершения",
|
||||
"cost": "Стоимость",
|
||||
"delete_confirmation": "Вы уверены, что хотите удалить эту запись?",
|
||||
"edit_action": "Обновить",
|
||||
"edit_title": "Изменить запись",
|
||||
"entry_name": "Название",
|
||||
"new_action": "Создать",
|
||||
"new_title": "Новая запись",
|
||||
"notes": "Заметки",
|
||||
"scheduled_date": "Планируемая дата"
|
||||
},
|
||||
"monthly_average": "Среднемесячный показатель",
|
||||
"toast": {
|
||||
"failed_to_create": "Не удалось создать запись",
|
||||
"failed_to_delete": "Не удалось удалить запись",
|
||||
"failed_to_update": "Ошибка обновления записи"
|
||||
},
|
||||
"total_cost": "Общая стоимость",
|
||||
"total_entries": "Всего записей"
|
||||
},
|
||||
"menu": {
|
||||
"home": "Главная",
|
||||
"locations": "Локации",
|
||||
"maintenance": "Техническое обслуживание и ремонт",
|
||||
"profile": "Профиль",
|
||||
"search": "Поиск",
|
||||
"tools": "Инструменты"
|
||||
},
|
||||
"profile": {
|
||||
"active": "Активный",
|
||||
"change_password": "Изменить пароль",
|
||||
@@ -108,7 +209,7 @@
|
||||
"current_password": "Текущий пароль",
|
||||
"delete_account": "Удалить аккаунт",
|
||||
"delete_account_sub": "Удалить свой аккаунт и все связанные с ним данные. Это действие невозможно отменить.",
|
||||
"display_header": "{ currentValue, select, true {Hide Header} false {Show Header} other {Not Hit}}",
|
||||
"display_header": "{ currentValue, select, true {Скрыть заголовок} false {Показать заголовок} other {Нет результатов}}",
|
||||
"enabled": "Активен",
|
||||
"gen_invite": "Сгенерировать ссылку-приглашение",
|
||||
"group_settings": "Настройки группы",
|
||||
@@ -116,9 +217,10 @@
|
||||
"inactive": "Неактивный",
|
||||
"language": "Язык",
|
||||
"new_password": "Новый пароль",
|
||||
"notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Уведомитель",
|
||||
"no_notifiers": "Нет настроенных уведомлений",
|
||||
"notifier_modal": "{ type, select, true {Изменить} false {Создать} other {Другое}} Уведомитель",
|
||||
"notifiers": "Уведомители",
|
||||
"notifiers_sub": "Получить уведомление о предстоящем обслуживании",
|
||||
"notifiers_sub": "Получать уведомления о предстоящем обслуживании",
|
||||
"test": "Тест",
|
||||
"theme_settings": "Настройки темы",
|
||||
"theme_settings_sub": "Настройки темы хранятся в локальном хранилище браузера. Вы можете изменить тему в любое время. Если у вас\n не удается установить тему, попробуйте перезапустить браузер.",
|
||||
@@ -136,27 +238,33 @@
|
||||
"ensure_ids_sub": "Гарантирует, что все вещи в вашем инвентаре будут иметь корректное поле asset_id. Это производится при помощи поиска самого большого текущего значения поля asset_id в базе данных и применяет ко всем вещам новые значения, где они не были установлены в поле asset_id. Это производится в порядке сортировки по полю created_at.",
|
||||
"ensure_import_refs": "Проверка ссылок импорта",
|
||||
"ensure_import_refs_button": "Обеспечение импорта ссылок",
|
||||
"ensure_import_refs_sub": "Гарантирует что все вещи в Вашем инвентаре имеют корректное поле import_ref. Это производится при помощи генерации строки из 8 случайных символов для каждой вещи, где не поле import_ref не заполнено."
|
||||
"ensure_import_refs_sub": "Гарантирует что все вещи в Вашем инвентаре имеют корректное поле import_ref. Это производится при помощи генерации строки из 8 случайных символов для каждой вещи, где не поле import_ref не заполнено.",
|
||||
"set_primary_photo": "Установить основное фото",
|
||||
"set_primary_photo_button": "Установить основное фото",
|
||||
"set_primary_photo_sub": "В Homebox v0.10.0 мы добавили возможность отмечать вложенные фото как основное изображение. Это действие устанавливает первую фотографию во вложениях в качестве основной, если основное изображение еще не выбрано. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'Посмотреть pull request #576'</a>'",
|
||||
"zero_datetimes": "Сбросить даты",
|
||||
"zero_datetimes_button": "Сбросить даты",
|
||||
"zero_datetimes_sub": "Сбрасывает значение полей даты и времени на начало даты в полном наборе. Это исправляет ошибку, когда сохранение значений времени на ранних этапах разработки сайта приводило к ошибке в точном отображении дат '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'Посмотреть Issue #236 подробнее.'</a>'"
|
||||
},
|
||||
"actions_sub": "Применить действия ко всему Вашему инвентарю. Это необратимое действие. '<b>'Будьте осторожны.'</b>'",
|
||||
"actions_sub": "Применить действия ко всему вашему инвентарю. Это необратимое действие. '<b>'Будьте осторожны.'</b>'",
|
||||
"import_export": "Импорт/Экспорт",
|
||||
"import_export_set": {
|
||||
"export": "Экспортировать инвентарь",
|
||||
"export_button": "Экспортировать инвентарь",
|
||||
"export_sub": "Экспортирует файл в стандартном CSV формате для Homebox. Это экспортирует все Ваши вещи из Вашего инвентаря.",
|
||||
"import": "Импорт из инвентаря",
|
||||
"import": "Импортировать инвентарь",
|
||||
"import_button": "Импортировать инвентарь",
|
||||
"import_sub": "Импортирует стандартный CSV формат в Homebox. Без колонки '<code>'HB.import_ref'</code>' , это '<b>'не'</b>' перезапишет какую либо существующую вещь в вашем инвентаре, только добавит новые вещи. Строки с колонкой '<code>'HB.import_ref'</code>' будут объеденены с существующими вещами с теми же import_ref, если такие существуют."
|
||||
"import_sub": "Импортировать стандартный CSV формат в Homebox. Без колонки '<code>'HB.import_ref'</code>' , это '<b>'не'</b>' перезапишет какую либо существующую вещь в вашем инвентаре, только добавит новые вещи. Строки с колонкой '<code>'HB.import_ref'</code>' будут объеденены с существующими вещами с теми же import_ref, если такие существуют."
|
||||
},
|
||||
"import_export_sub": "Импортировать или экспортировать ваш инвентарь в или из CSV файла. Это полезно при миграции вашего инвентаря в новый экземпляр Homebox.",
|
||||
"reports": "Отчеты",
|
||||
"reports_set": {
|
||||
"asset_labels": "Этикетки с ID активов",
|
||||
"asset_labels_button": "Генератор этикеток",
|
||||
"asset_labels_sub": "Генерирует PDF с этикетками для диапазона ID активов. Отсутствует привязка к Вашему инвентарю, так что Вы можете напечатать этикетки заранее и применить их к вашему инвентарю позднее.",
|
||||
"asset_labels": "Метки с ID активов",
|
||||
"asset_labels_button": "Генератор меток",
|
||||
"asset_labels_sub": "Генерирует PDF с метками для диапазона ID активов. Отсутствует привязка к Вашему инвентарю, так что вы можете напечатать метки заранее и применить их к вашему инвентарю позже.",
|
||||
"bill_of_materials": "Ведомость материалов",
|
||||
"bill_of_materials_button": "Сгенерировать BOM",
|
||||
"bill_of_materials_sub": "Генерирует файл CSV (значения, разделенные запятой), который может быть импортировать в приложении электронных таблиц. Это сводка вашего инвентаря с базовой информацией о вещах и их цене."
|
||||
"bill_of_materials_button": "Сгенерировать список запчастей",
|
||||
"bill_of_materials_sub": "Генерирует CSV файл (значения, разделенные запятой), который может быть импортирован в приложении электронных таблиц. Это сводка вашего инвентаря с базовой информацией о вещах и их цене."
|
||||
},
|
||||
"reports_sub": "Создавайте различные отчеты для вашего инвентаря."
|
||||
}
|
||||
|
||||
347
frontend/locales/sk-SK.json
Normal file
347
frontend/locales/sk-SK.json
Normal file
@@ -0,0 +1,347 @@
|
||||
{
|
||||
"components": {
|
||||
"app": {
|
||||
"import_dialog": {
|
||||
"change_warning": "Správanie pre importy s existujúcimi import_refs sa zmenilo. Ak sa v súbore CSV nachádza import_ref,\npoložka bude aktualizovaná hodnotami v súbore CSV.",
|
||||
"description": "Importujte súbor CSV obsahujúci vaše položky, štítky a miesta. Ďalšie informácie nájdete v dokumentácii\npožadovaný formát.",
|
||||
"title": "Importovať súbor CSV",
|
||||
"upload": "Nahrať"
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"date_time": {
|
||||
"ago": "{0} pred",
|
||||
"days": "dní",
|
||||
"hour": "hodina",
|
||||
"hours": "hodiny",
|
||||
"in": "v {0}",
|
||||
"just-now": "práve teraz",
|
||||
"last-month": "minulý mesiac",
|
||||
"last-week": "minulý týždeň",
|
||||
"last-year": "minulý rok",
|
||||
"minute": "minúta",
|
||||
"minutes": "minút",
|
||||
"months": "mesiacov",
|
||||
"next-month": "budúci mesiac",
|
||||
"next-week": "budúci týždeň",
|
||||
"next-year": "budúci rok",
|
||||
"second": "sekunda",
|
||||
"seconds": "sekúnd",
|
||||
"tomorrow": "zajtra",
|
||||
"week": "týždeň",
|
||||
"weeks": "týždňov",
|
||||
"years": "rokov",
|
||||
"yesterday": "včera"
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "URL stránka"
|
||||
},
|
||||
"password_score": {
|
||||
"password_strength": "Sila hesla"
|
||||
}
|
||||
},
|
||||
"item": {
|
||||
"create_modal": {
|
||||
"item_description": "Popis položky",
|
||||
"item_name": "Názov položky",
|
||||
"photo_button": "Foto 📷",
|
||||
"title": "Vytvoriť položku"
|
||||
},
|
||||
"view": {
|
||||
"selectable": {
|
||||
"card": "Karta",
|
||||
"items": "Položky",
|
||||
"no_items": "Žiadne položky na zobrazenie",
|
||||
"table": "Tabuľka"
|
||||
},
|
||||
"table": {
|
||||
"page": "Stránka",
|
||||
"rows_per_page": "Počet riadkov na stránku"
|
||||
}
|
||||
}
|
||||
},
|
||||
"label": {
|
||||
"create_modal": {
|
||||
"label_description": "Popis štítku",
|
||||
"label_name": "Názov štítku",
|
||||
"title": "Vytvoriť štítok"
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"create_modal": {
|
||||
"location_description": "Popis miesta",
|
||||
"location_name": "Názov miesta",
|
||||
"title": "Vytvoriť polohu"
|
||||
},
|
||||
"selector": {
|
||||
"parent_location": "Poloha rodiča"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Nie sú k dispozícii žiadne miesta. Pridajte nové miesta cez\n `<`span class=\"link-primary\"`>`Vytvoriť`<`/span`>` na navigačnom paneli."
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"add": "Pridať",
|
||||
"build": "Zostava: { build }",
|
||||
"confirm": "Potvrďte",
|
||||
"create": "Vytvorte",
|
||||
"create_and_add": "Vytvoriť a pridať ďalšie",
|
||||
"created": "Vytvorené",
|
||||
"delete": "Odstrániť",
|
||||
"details": "Podrobnosti",
|
||||
"duplicate": "Duplicitné",
|
||||
"edit": "Upraviť",
|
||||
"email": "Email",
|
||||
"follow_dev": "Sledujte vývojára",
|
||||
"github": "Projekt GitHub",
|
||||
"items": "Položky",
|
||||
"join_discord": "Pripojte sa k Discordu",
|
||||
"labels": "Štítky",
|
||||
"locations": "Miesta",
|
||||
"maintenance": "Údržba",
|
||||
"name": "Meno",
|
||||
"password": "heslo",
|
||||
"read_docs": "Prečítajte si Dokumenty",
|
||||
"save": "Uložiť",
|
||||
"search": "Hľadať",
|
||||
"sign_out": "Odhlásiť sa",
|
||||
"submit": "Odoslať",
|
||||
"update": "Aktualizovať",
|
||||
"value": "Hodnota",
|
||||
"version": "Verzia: { version }",
|
||||
"welcome": "Vitajte, { username }"
|
||||
},
|
||||
"home": {
|
||||
"labels": "Štítky",
|
||||
"quick_statistics": "Rýchla štatistika",
|
||||
"recently_added": "Nedávno pridané",
|
||||
"storage_locations": "Skladovacie miesta",
|
||||
"total_items": "Celkový počet položiek",
|
||||
"total_labels": "Celkový počet štítkov",
|
||||
"total_locations": "Celkový počet miest",
|
||||
"total_value": "Celková hodnota"
|
||||
},
|
||||
"index": {
|
||||
"disabled_registration": "Registrácia zakázaná",
|
||||
"dont_join_group": "Nechcete sa pridať do skupiny?",
|
||||
"joining_group": "Pripájate sa k existujúcej skupine!",
|
||||
"login": "Prihláste sa",
|
||||
"register": "Zaregistrujte sa",
|
||||
"remember_me": "Pamätaj si ma",
|
||||
"set_email": "Aký je váš e-mail?",
|
||||
"set_name": "Ako sa voláte?",
|
||||
"set_password": "Nastavte si heslo",
|
||||
"tagline": "Sledujte, organizujte a spravujte svoje veci."
|
||||
},
|
||||
"items": {
|
||||
"add": "Pridať",
|
||||
"advanced": "Pokročilé",
|
||||
"archived": "Archivované",
|
||||
"asset_id": "ID majetku",
|
||||
"attachment": "Príloha",
|
||||
"attachments": "Prílohy",
|
||||
"changes_persisted_immediately": "Zmeny príloh sa okamžite uložia",
|
||||
"created_at": "Vytvoril v",
|
||||
"custom_fields": "Vlastné polia",
|
||||
"description": "Popis",
|
||||
"details": "Podrobnosti",
|
||||
"drag_and_drop": "Presuňte súbory sem alebo kliknutím vyberte súbory",
|
||||
"edit_details": "Upraviť podrobnosti",
|
||||
"field_selector": "Výber poľa",
|
||||
"field_value": "Hodnota poľa",
|
||||
"first": "Prvý",
|
||||
"include_archive": "Zahrnúť archivované položky",
|
||||
"insured": "Poistený",
|
||||
"last": "Posledný",
|
||||
"lifetime_warranty": "Doživotná záruka",
|
||||
"location": "Poloha",
|
||||
"manual": "Príručka",
|
||||
"manuals": "Príručky",
|
||||
"manufacturer": "Výrobca",
|
||||
"model_number": "Číslo modelu",
|
||||
"name": "Meno",
|
||||
"negate_labels": "Negovať vybrané označenia",
|
||||
"next_page": "Ďalšia strana",
|
||||
"no_results": "Nenašli sa žiadne položky",
|
||||
"notes": "Poznámky",
|
||||
"options": "Možnosti",
|
||||
"order_by": "Objednať podľa",
|
||||
"pages": "Strana { page } z { totalPages }",
|
||||
"parent_item": "Nadradená položka",
|
||||
"photo": "Fotografia",
|
||||
"photos": "Fotografie",
|
||||
"prev_page": "Predchádzajúca stránka",
|
||||
"purchase_date": "Dátum nákupu",
|
||||
"purchase_details": "Podrobnosti o nákupe",
|
||||
"purchase_price": "Kúpna cena",
|
||||
"purchased_from": "Zakúpené od",
|
||||
"quantity": "Množstvo",
|
||||
"query_id": "Dopyt na ID číslo majetku: { id }",
|
||||
"receipt": "Účtenka",
|
||||
"receipts": "Účtenky",
|
||||
"reset_search": "Obnoviť vyhľadávanie",
|
||||
"results": "{ total } Výsledky",
|
||||
"serial_number": "Sériové číslo",
|
||||
"show_advanced_view_options": "Zobraziť rozšírené možnosti zobrazenia",
|
||||
"sold_at": "Predané v",
|
||||
"sold_details": "Podrobnosti o predaji",
|
||||
"sold_price": "Predajná cena",
|
||||
"sold_to": "Predané Komu",
|
||||
"tip_1": "Filtre umiestnení a štítkov používajú operáciu 'OR'. Ak je vybratých viac ako jeden,\n bude vybraný iba jeden potrebné na zápas.",
|
||||
"tip_2": "Vyhľadávania s predponou # budú dotazovať na identifikátor diela (napríklad #000-001)",
|
||||
"tip_3": "Filtre poľa používajú operáciu 'OR' . Ak je vybratých viac ako jeden, bude potrebný iba jeden pre a\n zápas.",
|
||||
"tips": "Tipy",
|
||||
"tips_sub": "Tipy na vyhľadávanie",
|
||||
"updated_at": "Čas aktualizácie",
|
||||
"warranty": "Záruka",
|
||||
"warranty_details": "Podrobnosti o záruke",
|
||||
"warranty_expires": "Záruka vyprší"
|
||||
},
|
||||
"labels": {
|
||||
"no_results": "Nenašli sa žiadne štítky",
|
||||
"update_label": "Aktualizovať štítok"
|
||||
},
|
||||
"languages": {
|
||||
"ca": "Katalánsky",
|
||||
"de": "Nemecky",
|
||||
"en": "Anglicky",
|
||||
"es": "Španielsky",
|
||||
"fr": "Francúzsky",
|
||||
"hu": "Maďarsky",
|
||||
"it": "Taliančina",
|
||||
"ja-JP": "Japonsky",
|
||||
"nl": "Holandsky",
|
||||
"pl": "Poľsky",
|
||||
"pt-BR": "Portugalsky (Brazília)",
|
||||
"pt-PT": "Portugalsky (Portugalsko)",
|
||||
"ru": "Ruština",
|
||||
"sl": "Slovinsky",
|
||||
"sv": "Švédčina",
|
||||
"tr": "Turečtina",
|
||||
"uk-UA": "Ukrajinsky",
|
||||
"zh-CN": "Čínština (zjednodušená)",
|
||||
"zh-HK": "Čínsky (Hong Kong) Name",
|
||||
"zh-MO": "Čínština (Macao)",
|
||||
"zh-TW": "Číština (tradičná)"
|
||||
},
|
||||
"locations": {
|
||||
"child_locations": "Umiestnenie dieťaťa",
|
||||
"collapse_tree": "Zbaliť strom",
|
||||
"no_results": "Žiadne lokality neboli nájdené.",
|
||||
"update_location": "Aktualizovať lokalitu"
|
||||
},
|
||||
"maintenance": {
|
||||
"filter": {
|
||||
"both": "Obe",
|
||||
"completed": "Dokončené",
|
||||
"scheduled": "Naplánované"
|
||||
},
|
||||
"list": {
|
||||
"complete": "Hotovo",
|
||||
"create_first": "Vytvorte si svoj prvý záznam",
|
||||
"delete": "Zmazať",
|
||||
"duplicate": "Duplikovať",
|
||||
"edit": "Upraviť",
|
||||
"new": "New"
|
||||
},
|
||||
"modal": {
|
||||
"completed_date": "Dátum dokončenia",
|
||||
"cost": "Náklady",
|
||||
"delete_confirmation": "Skutočne si prajete vymazať tento záznam?",
|
||||
"edit_action": "Aktualizácia",
|
||||
"edit_title": "Upraviť položku",
|
||||
"entry_name": "Názov záznamu",
|
||||
"new_action": "Vytvoriť",
|
||||
"new_title": "Nová položka",
|
||||
"notes": "Poznámky",
|
||||
"scheduled_date": "Plánovaný dátum"
|
||||
},
|
||||
"monthly_average": "Mesačný priemer",
|
||||
"toast": {
|
||||
"failed_to_create": "Nepodarilo sa vytvoriť položku",
|
||||
"failed_to_delete": "Nepodarilo sa odstrániť záznam",
|
||||
"failed_to_update": "Nepodarilo sa aktualizovať položku"
|
||||
},
|
||||
"total_cost": "Celkové náklady",
|
||||
"total_entries": "Počet položiek"
|
||||
},
|
||||
"menu": {
|
||||
"create_item": "Položka / Aktívum",
|
||||
"create_label": "Štítok",
|
||||
"create_location": "Poloha",
|
||||
"home": "Domovská stránka",
|
||||
"locations": "Miesta",
|
||||
"maintenance": "Údržba",
|
||||
"profile": "Profil",
|
||||
"search": "Hľadať",
|
||||
"tools": "Nástroje"
|
||||
},
|
||||
"profile": {
|
||||
"active": "Aktívne",
|
||||
"change_password": "Zmeniť heslo",
|
||||
"currency_format": "Formát meny",
|
||||
"current_password": "Aktuálne heslo",
|
||||
"delete_account": "Odstrániť účet",
|
||||
"delete_account_sub": "Odstráňte svoj účet a všetky súvisiace údaje. Toto nie je možné vrátiť späť.",
|
||||
"display_header": "{ currentValue, select, true {Skryť hlavičku} false {Zobraziť hlavičku} other {Nie Hit}}",
|
||||
"enabled": "Povolené",
|
||||
"example": "Príklad",
|
||||
"gen_invite": "Vygenerovať odkaz na pozvánku",
|
||||
"group_settings": "Nastavenie skupiny",
|
||||
"group_settings_sub": "Nastavenia zdieľanej skupiny. Možno budete musieť obnoviť prehliadač, aby sa uplatnili niektoré nastavenia.",
|
||||
"inactive": "Neaktívne",
|
||||
"language": "Jazyk",
|
||||
"new_password": "Nové heslo",
|
||||
"no_notifiers": "Nie sú nakonfigurovaní žiadni upozorňovatelia",
|
||||
"notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Oznamovateľ",
|
||||
"notifiers": "Oznamovatelia",
|
||||
"notifiers_sub": "Dostávajte upozornenia na nadchádzajúce pripomenutia údržby",
|
||||
"test": "Test",
|
||||
"theme_settings": "Nastavenie motívu",
|
||||
"theme_settings_sub": "Nastavenia motívu sú uložené v lokálnom úložisku vášho prehliadača. Tému môžete kedykoľvek zmeniť. Ak mate\n problémy s nastavením motívu, skúste obnoviť prehliadač.",
|
||||
"update_group": "aktualizačná skupina",
|
||||
"update_language": "Aktualizovať súbor jazyka",
|
||||
"url": "URL",
|
||||
"user_profile": "Profil používateľa",
|
||||
"user_profile_sub": "Pozvite používateľov a spravujte svoj účet."
|
||||
},
|
||||
"tools": {
|
||||
"actions": "Akcie inventára",
|
||||
"actions_set": {
|
||||
"ensure_ids": "Zabezpečenie identifikátorov aktív",
|
||||
"ensure_ids_button": "Zabezpečenie identifikátorov aktív",
|
||||
"ensure_ids_sub": "Zabezpečuje, že všetky položky vo vašom inventári majú platné pole asset_id. To sa dosiahne nájdením najvyššieho aktuálneho poľa asset_id v databáze a aplikáciou ďalšej hodnoty na každú položku, ktorá má pole asset_id nenastavené. Toto sa vykonáva v poradí podľa poľa created_at.",
|
||||
"ensure_import_refs": "Zabezpečte import referencií",
|
||||
"ensure_import_refs_button": "Zabezpečte import referencií",
|
||||
"ensure_import_refs_sub": "Zabezpečuje, že všetky položky vo vašom inventári majú platné pole import_ref. To sa dosiahne náhodným vygenerovaním 8-znakového reťazca pre každú položku, ktorá má nenastavené pole import_ref.",
|
||||
"set_primary_photo": "Nastaviť primárnu fotografiu",
|
||||
"set_primary_photo_button": "Nastaviť primárnu fotografiu",
|
||||
"set_primary_photo_sub": "Vo verzii v0.10.0 Homeboxu bolo k prílohám typu fotografia pridané pole primárneho obrázka. Táto akcia nastaví pole primárneho obrázka na prvý obrázok v poli príloh v databáze, ak ešte nie je nastavený. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'See GitHub PR #576'</a>'",
|
||||
"zero_datetimes": "Dátum nulovej položky Časy",
|
||||
"zero_datetimes_button": "Dátum nulovej položky Časy",
|
||||
"zero_datetimes_sub": "Obnoví hodnotu času pre všetky polia dátumu a času vo vašom inventári na začiatok dátumu. Ide o opravu chyby, ktorá bola zavedená na začiatku vývoja stránky a ktorá spôsobila, že sa hodnota času uložila s časom, čo spôsobilo problémy s poliami dátumu zobrazujúcimi presné hodnoty. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'See Github Issue #236 for more details.'</a>'"
|
||||
},
|
||||
"actions_sub": "Hromadne použite akcie na svoj inventár. Toto sú nezvratné akcie. '<b>'Buďte opatrní.'</b>'",
|
||||
"import_export": "Import/export",
|
||||
"import_export_set": {
|
||||
"export": "Export zásob",
|
||||
"export_button": "Export zásob",
|
||||
"export_sub": "Exportuje štandardný formát CSV pre Homebox. Týmto sa exportujú všetky položky vo vašom inventári.",
|
||||
"import": "Importovať inventár",
|
||||
"import_button": "Importovať inventár",
|
||||
"import_sub": "Importuje štandardný formát CSV pre Homebox. Bez '<code>'HB.import_ref'</code>' stĺpca to bude '<b>'nie'</b>' prepísať všetky existujúce položky vo vašom inventári, iba pridať nové položky. Riadky so '<code>'HB.import_ref'</code>' stĺpcom sa zlúčia do existujúcich položiek s rovnakým import_ref, ak taký existuje."
|
||||
},
|
||||
"import_export_sub": "Importujte a exportujte svoj inventár do a zo súboru CSV. Je to užitočné pri migrácii inventára do novej inštancie Homeboxu.",
|
||||
"reports": "Správy",
|
||||
"reports_set": {
|
||||
"asset_labels": "Štítky ID diela",
|
||||
"asset_labels_button": "Generátor štítkov",
|
||||
"asset_labels_sub": "Generuje tlačiteľné PDF štítkov pre rad Asset ID. Tieto nie sú špecifické pre váš inventár, takže štítky si môžete vytlačiť vopred a aplikovať ich na váš inventár, keď ich dostanete.",
|
||||
"bill_of_materials": "Faktúra za materiály",
|
||||
"bill_of_materials_button": "Generovať kusovník",
|
||||
"bill_of_materials_sub": "Vygeneruje súbor CSV (Comma Separated Values), ktorý možno importovať do tabuľkového procesora. Toto je súhrn vášho inventára so základnými informáciami o položkách a cenách."
|
||||
},
|
||||
"reports_sub": "Generujte rôzne prehľady pre svoj inventár."
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user