init
@@ -1,16 +0,0 @@
|
||||
# Editor configuration, see https://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.ts]
|
||||
quote_type = single
|
||||
|
||||
[*.md]
|
||||
max_line_length = off
|
||||
trim_trailing_whitespace = false
|
||||
17
worklenz-frontend/.env.development
Normal file
@@ -0,0 +1,17 @@
|
||||
VITE_API_URL=http://localhost:3000
|
||||
VITE_SOCKET_URL=ws://localhost:3000
|
||||
|
||||
VITE_APP_TITLE=Worklenz
|
||||
VITE_APP_ENV=development
|
||||
|
||||
# Mixpanel
|
||||
VITE_MIXPANEL_TOKEN=bb330b6bd25db4a6c988da89046f4b80
|
||||
|
||||
# Recaptcha
|
||||
VITE_RECAPTCHA_SITE_KEY=6LeUWjYqAAAAAFhi9Z8KPeiix3RRjxoZtJhLJZXb
|
||||
|
||||
# Session ID
|
||||
VITE_WORKLENZ_SESSION_ID=worklenz.sid
|
||||
|
||||
# Google Login
|
||||
VITE_ENABLE_GOOGLE_LOGIN=true
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"root": true,
|
||||
"ignorePatterns": [
|
||||
"projects/**/*"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"files": [
|
||||
"*.ts"
|
||||
],
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:@angular-eslint/recommended",
|
||||
"plugin:@angular-eslint/template/process-inline-templates"
|
||||
],
|
||||
"rules": {
|
||||
"@angular-eslint/directive-selector": [
|
||||
"error",
|
||||
{
|
||||
"type": "attribute",
|
||||
"prefix": "worklenz",
|
||||
"style": "camelCase"
|
||||
}
|
||||
],
|
||||
"@angular-eslint/component-selector": [
|
||||
"error",
|
||||
{
|
||||
"type": "element",
|
||||
"prefix": "worklenz",
|
||||
"style": "kebab-case"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.html"
|
||||
],
|
||||
"extends": [
|
||||
"plugin:@angular-eslint/template/recommended"
|
||||
],
|
||||
"rules": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
56
worklenz-frontend/.gitignore
vendored
@@ -1,44 +1,28 @@
|
||||
# compiled output
|
||||
/dist
|
||||
/tmp
|
||||
/out-tsc
|
||||
# Only exists if Bazel was run
|
||||
/bazel-out
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# profiling files
|
||||
chrome-profiler-events*.json
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# IDEs and editors
|
||||
/.idea
|
||||
.project
|
||||
.classpath
|
||||
.c9/
|
||||
*.launch
|
||||
.settings/
|
||||
*.sublime-workspace
|
||||
|
||||
# IDE - VSCode
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
.history/*
|
||||
# production
|
||||
/build
|
||||
/public/tinymce
|
||||
|
||||
# misc
|
||||
/.angular/cache
|
||||
/.sass-cache
|
||||
/connect.lock
|
||||
/coverage
|
||||
/libpeerconnection.log
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
testem.log
|
||||
/typings
|
||||
|
||||
# System Files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.production
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# IDE
|
||||
/.idea
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
engine-strict=true
|
||||
fund=false # Don't print the trailing funding message
|
||||
24
worklenz-frontend/.prettierrc
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"semi": true,
|
||||
"tabWidth": 2,
|
||||
"printWidth": 100,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "es5",
|
||||
"bracketSpacing": true,
|
||||
"jsxBracketSameLine": false,
|
||||
"arrowParens": "avoid",
|
||||
"endOfLine": "lf",
|
||||
"jsxSingleQuote": false,
|
||||
"proseWrap": "preserve",
|
||||
"quoteProps": "as-needed",
|
||||
"useTabs": false,
|
||||
"htmlWhitespaceSensitivity": "css",
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["*.less", "*.scss", "*.css"],
|
||||
"options": {
|
||||
"singleQuote": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,11 +1,20 @@
|
||||
FROM node:alpine
|
||||
FROM node:18-alpine AS build
|
||||
|
||||
WORKDIR /usr/src/app
|
||||
WORKDIR /app
|
||||
|
||||
COPY . /usr/src/app
|
||||
COPY package.json package-lock.json ./
|
||||
|
||||
RUN npm install -g @angular/cli
|
||||
RUN npm ci
|
||||
|
||||
RUN npm install
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
CMD ["npm", "run", "start-docker"]
|
||||
FROM node:18-alpine AS production
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN npm install -g serve
|
||||
|
||||
COPY --from=build /app/build /app/build
|
||||
EXPOSE 5000
|
||||
CMD ["serve", "-s", "build", "-l", "5000"]
|
||||
@@ -1,37 +1,77 @@
|
||||
# Worklenz
|
||||
# Worklenz - React Application
|
||||
|
||||
[](https://github.com/ceydigital/worklenz-frontend/actions/workflows/workflow.yml)
|
||||
Worklenz is a task management application built with React and bundled using [Vite](https://vitejs.dev/).
|
||||
|
||||
[](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend)
|
||||
## Table of Contents
|
||||
- [Getting Started](#getting-started)
|
||||
- [Available Scripts](#available-scripts)
|
||||
- [Project Structure](#project-structure)
|
||||
- [Contributing](#contributing)
|
||||
- [Learn More](#learn-more)
|
||||
|
||||
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.1.1.
|
||||
## Getting Started
|
||||
|
||||
## Development server
|
||||
To get started with the project, follow these steps:
|
||||
|
||||
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
|
||||
1. **Clone the repository**:
|
||||
```bash
|
||||
git clone https://github.com/Worklenz/worklenz-v2.git
|
||||
```
|
||||
2. **Navigate to the project directory**:
|
||||
```bash
|
||||
cd worklenz-v2
|
||||
```
|
||||
3. **Install dependencies**:
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
4. **Start the development server**:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
5. Open [http://localhost:3000](http://localhost:3000) in your browser to view the application.
|
||||
|
||||
## Code scaffolding
|
||||
## Available Scripts
|
||||
|
||||
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
|
||||
In the project directory, you can run:
|
||||
|
||||
## Build
|
||||
### `npm run dev`
|
||||
|
||||
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
|
||||
Runs the app in the development mode.\
|
||||
Open [http://localhost:5173](http://localhost:5173) to view it in the browser.
|
||||
|
||||
## Running unit tests
|
||||
The page will reload if you make edits.\
|
||||
You will also see any lint errors in the console.
|
||||
|
||||
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
||||
### `npm run build`
|
||||
|
||||
## Running end-to-end tests
|
||||
Builds the app for production to the `dist` folder.\
|
||||
It correctly bundles React in production mode and optimizes the build for the best performance.
|
||||
|
||||
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
|
||||
The build is minified and the filenames include the hashes.\
|
||||
Your app is ready to be deployed!
|
||||
|
||||
## Further help
|
||||
### `npm run preview`
|
||||
|
||||
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
||||
Serves the production build locally for testing.\
|
||||
Open [http://localhost:4173](http://localhost:4173) to preview the build.
|
||||
|
||||
## References
|
||||
- https://pro.ant.design/
|
||||
- https://ant.design/components/overview/
|
||||
- https://fontawesome.com/v5.15/icons?d=gallery&p=2&m=free
|
||||
- https://feathericons.com/
|
||||
## Project Structure
|
||||
|
||||
The project structure is organized as follows:
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! If you'd like to contribute, please follow these steps:
|
||||
|
||||
1. Fork the repository.
|
||||
2. Create a new branch (`git checkout -b feature/YourFeatureName`).
|
||||
3. Commit your changes (`git commit -m 'Add some feature'`).
|
||||
4. Push to the branch (`git push origin feature/YourFeatureName`).
|
||||
5. Open a pull request.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Vite, check out the [Vite documentation](https://vitejs.dev/guide/).
|
||||
|
||||
To learn React, check out the [React documentation](https://reactjs.org/).
|
||||
|
||||
@@ -1,157 +0,0 @@
|
||||
{
|
||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
||||
"version": 1,
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"worklenz": {
|
||||
"projectType": "application",
|
||||
"schematics": {
|
||||
"@schematics/angular:component": {
|
||||
"style": "scss"
|
||||
},
|
||||
"@schematics/angular:application": {
|
||||
"strict": true
|
||||
}
|
||||
},
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
"prefix": "worklenz",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"options": {
|
||||
"outputPath": "dist/worklenz",
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"polyfills": [
|
||||
"zone.js"
|
||||
],
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"inlineStyleLanguage": "scss",
|
||||
"assets": [
|
||||
"src/favicon.ico",
|
||||
"src/assets",
|
||||
"src/manifest.webmanifest",
|
||||
{
|
||||
"glob": "**/*",
|
||||
"input": "./node_modules/@ant-design/icons-angular/src/inline-svg/",
|
||||
"output": "/assets/"
|
||||
},
|
||||
{
|
||||
"glob": "**/*",
|
||||
"input": "node_modules/tinymce",
|
||||
"output": "/tinymce/"
|
||||
}
|
||||
],
|
||||
"styles": [
|
||||
"src/theme.less",
|
||||
"src/styles.scss"
|
||||
],
|
||||
"scripts": [
|
||||
"node_modules/tinymce/tinymce.min.js"
|
||||
],
|
||||
"serviceWorker": true,
|
||||
"ngswConfigPath": "ngsw-config.json",
|
||||
"allowedCommonJsDependencies": [
|
||||
"jquery",
|
||||
"moment",
|
||||
"canvg",
|
||||
"core-js",
|
||||
"file-saver",
|
||||
"raf",
|
||||
"rgbcolor"
|
||||
]
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"budgets": [
|
||||
{
|
||||
"type": "initial",
|
||||
"maximumWarning": "500kb",
|
||||
"maximumError": "5.7mb"
|
||||
},
|
||||
{
|
||||
"type": "anyComponentStyle",
|
||||
"maximumWarning": "2kb",
|
||||
"maximumError": "5kb"
|
||||
}
|
||||
],
|
||||
"fileReplacements": [
|
||||
{
|
||||
"replace": "src/environments/environment.ts",
|
||||
"with": "src/environments/environment.prod.ts"
|
||||
}
|
||||
],
|
||||
"outputHashing": "all"
|
||||
},
|
||||
"development": {
|
||||
"buildOptimizer": false,
|
||||
"optimization": false,
|
||||
"vendorChunk": true,
|
||||
"extractLicenses": false,
|
||||
"sourceMap": true,
|
||||
"namedChunks": true
|
||||
}
|
||||
},
|
||||
"defaultConfiguration": "production"
|
||||
},
|
||||
"serve": {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"configurations": {
|
||||
"production": {
|
||||
"browserTarget": "worklenz:build:production"
|
||||
},
|
||||
"development": {
|
||||
"browserTarget": "worklenz:build:development"
|
||||
}
|
||||
},
|
||||
"defaultConfiguration": "development"
|
||||
},
|
||||
"extract-i18n": {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": {
|
||||
"browserTarget": "worklenz:build"
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
"builder": "@angular-devkit/build-angular:karma",
|
||||
"options": {
|
||||
"main": "src/test.ts",
|
||||
"polyfills": [
|
||||
"zone.js",
|
||||
"zone.js/testing"
|
||||
],
|
||||
"tsConfig": "tsconfig.spec.json",
|
||||
"karmaConfig": "karma.conf.js",
|
||||
"inlineStyleLanguage": "scss",
|
||||
"assets": [
|
||||
"src/favicon.ico",
|
||||
"src/assets",
|
||||
"src/manifest.webmanifest"
|
||||
],
|
||||
"styles": [
|
||||
"src/styles.scss",
|
||||
"./node_modules/@syncfusion/ej2-material-theme/styles/material.css"
|
||||
],
|
||||
"scripts": []
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-eslint/builder:lint",
|
||||
"options": {
|
||||
"lintFilePatterns": [
|
||||
"src/**/*.ts",
|
||||
"src/**/*.html"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"cli": {
|
||||
"analytics": false,
|
||||
"schematicCollections": [
|
||||
"@angular-eslint/schematics"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
22
worklenz-frontend/index.html
Normal file
@@ -0,0 +1,22 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="./favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#2b2b2b" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<title>Worklenz</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="./src/index.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
7
worklenz-frontend/jest.config.js
Normal file
@@ -0,0 +1,7 @@
|
||||
module.exports = {
|
||||
setupFilesAfterEnv: ['<rootDir>/src/setupTests.ts'],
|
||||
moduleNameMapper: {
|
||||
'^@/(.*)$': '<rootDir>/src/$1',
|
||||
'\\.(jpg|jpeg|png|gif|webp|svg)$': '<rootDir>/__mocks__/fileMock.js',
|
||||
},
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
||||
|
||||
module.exports = function (config) {
|
||||
config.set({
|
||||
basePath: '',
|
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
||||
plugins: [
|
||||
require('karma-jasmine'),
|
||||
require('karma-chrome-launcher'),
|
||||
require('karma-jasmine-html-reporter'),
|
||||
require('karma-coverage'),
|
||||
require('@angular-devkit/build-angular/plugins/karma')
|
||||
],
|
||||
client: {
|
||||
jasmine: {
|
||||
// you can add configuration options for Jasmine here
|
||||
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
|
||||
// for example, you can disable the random execution with `random: false`
|
||||
// or set a specific seed with `seed: 4321`
|
||||
},
|
||||
clearContext: false // leave Jasmine Spec Runner output visible in browser
|
||||
},
|
||||
jasmineHtmlReporter: {
|
||||
suppressAll: true // removes the duplicated traces
|
||||
},
|
||||
coverageReporter: {
|
||||
dir: require('path').join(__dirname, './coverage/worklenz'),
|
||||
subdir: '.',
|
||||
reporters: [
|
||||
{ type: 'html' },
|
||||
{ type: 'text-summary' }
|
||||
]
|
||||
},
|
||||
reporters: ['progress', 'kjhtml'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
logLevel: config.LOG_INFO,
|
||||
autoWatch: true,
|
||||
browsers: ['Chrome'],
|
||||
singleRun: false,
|
||||
restartOnFileChange: true
|
||||
});
|
||||
};
|
||||
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
|
||||
"index": "/",
|
||||
"assetGroups": [
|
||||
{
|
||||
"name": "app",
|
||||
"installMode": "prefetch",
|
||||
"resources": {
|
||||
"files": [
|
||||
"/favicon.ico",
|
||||
"/",
|
||||
"/manifest.webmanifest",
|
||||
"/*.css",
|
||||
"/*.js"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "assets",
|
||||
"installMode": "lazy",
|
||||
"updateMode": "prefetch",
|
||||
"resources": {
|
||||
"files": [
|
||||
"/assets/**",
|
||||
"/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
18756
worklenz-frontend/package-lock.json
generated
@@ -1,77 +1,98 @@
|
||||
{
|
||||
"name": "worklenz",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve --proxy-config proxy.config.json --disable-host-check",
|
||||
"start-docker": "ng serve --proxy-config proxy-docker.config.json --disable-host-check --host 0.0.0.0",
|
||||
"build": "ng build --extract-licenses --common-chunk --delete-output-path --output-hashing=all",
|
||||
"watch": "ng build --watch --configuration development",
|
||||
"test": "ng test",
|
||||
"lint": "ng lint"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.13.0",
|
||||
"npm": ">= 8.5.5",
|
||||
"yarn": "WARNING: Please use npm package manager instead of yarn"
|
||||
},
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "vite",
|
||||
"prebuild": "node scripts/copy-tinymce.js",
|
||||
"build": "node --max-old-space-size=4096 node_modules/.bin/vite build",
|
||||
"dev-build": "vite build",
|
||||
"serve": "vite preview",
|
||||
"format": "prettier --write ."
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/animations": "^16.2.0",
|
||||
"@angular/cdk": "^16.2.0",
|
||||
"@angular/common": "^16.2.0",
|
||||
"@angular/compiler": "^16.2.0",
|
||||
"@angular/core": "^16.2.0",
|
||||
"@angular/forms": "^16.2.0",
|
||||
"@angular/platform-browser": "^16.2.0",
|
||||
"@angular/platform-browser-dynamic": "^16.2.0",
|
||||
"@angular/router": "^16.2.0",
|
||||
"@angular/service-worker": "^16.2.0",
|
||||
"@rx-angular/cdk": "^16.0.0",
|
||||
"@rx-angular/template": "^16.0.2",
|
||||
"@tinymce/tinymce-angular": "^7.0.0",
|
||||
"antd": "^5.8.2",
|
||||
"bootstrap": "^5.3.1",
|
||||
"chart.js": "^4.3.3",
|
||||
"@ant-design/colors": "^7.1.0",
|
||||
"@ant-design/compatible": "^5.1.4",
|
||||
"@ant-design/icons": "^5.4.0",
|
||||
"@ant-design/pro-components": "^2.7.19",
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
"@dnd-kit/modifiers": "^9.0.0",
|
||||
"@dnd-kit/sortable": "^10.0.0",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"@emotion/react": "^11.14.0",
|
||||
"@paddle/paddle-js": "^1.3.3",
|
||||
"@reduxjs/toolkit": "^2.2.7",
|
||||
"@tanstack/react-table": "^8.20.6",
|
||||
"@tanstack/react-virtual": "^3.11.2",
|
||||
"@tinymce/tinymce-react": "^5.1.1",
|
||||
"antd": "^5.24.1",
|
||||
"axios": "^1.7.9",
|
||||
"chart.js": "^4.4.7",
|
||||
"chartjs-plugin-datalabels": "^2.2.0",
|
||||
"chartjs-to-image": "^1.2.2",
|
||||
"date-fns": "^4.1.0",
|
||||
"dompurify": "^3.2.4",
|
||||
"gantt-task-react": "^0.3.9",
|
||||
"html2canvas": "^1.4.1",
|
||||
"jquery": "^3.7.0",
|
||||
"jspdf": "^2.5.1",
|
||||
"moment": "^2.29.4",
|
||||
"moment-timezone": "^0.5.43",
|
||||
"ng-zorro-antd": "^16.1.0",
|
||||
"ng2-charts": "^5.0.3",
|
||||
"ngx-doc-viewer": "^15.0.1",
|
||||
"ngx-socket-io": "^4.5.1",
|
||||
"rxjs": "~7.4.0",
|
||||
"tinymce": "^6.8.3",
|
||||
"tslib": "^2.6.1",
|
||||
"zone.js": "^0.13.1"
|
||||
"i18next": "^23.16.8",
|
||||
"i18next-browser-languagedetector": "^8.0.3",
|
||||
"i18next-http-backend": "^2.7.3",
|
||||
"jspdf": "^3.0.0",
|
||||
"mixpanel-browser": "^2.56.0",
|
||||
"primereact": "^10.8.4",
|
||||
"re-resizable": "^6.10.3",
|
||||
"react": "^18.3.1",
|
||||
"react-chartjs-2": "^5.2.0",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-i18next": "^15.0.1",
|
||||
"react-perfect-scrollbar": "^1.5.8",
|
||||
"react-redux": "^9.2.0",
|
||||
"react-responsive": "^10.0.0",
|
||||
"react-router-dom": "^6.28.1",
|
||||
"react-timer-hook": "^3.0.8",
|
||||
"react-window": "^1.8.11",
|
||||
"socket.io-client": "^4.8.1",
|
||||
"tinymce": "^7.7.2",
|
||||
"web-vitals": "^4.2.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^16.2.0",
|
||||
"@angular-eslint/builder": "^16.1.0",
|
||||
"@angular-eslint/eslint-plugin": "^16.0.3",
|
||||
"@angular-eslint/eslint-plugin-template": "^16.0.3",
|
||||
"@angular-eslint/schematics": "^16.1.0",
|
||||
"@angular-eslint/template-parser": "^16.1.0",
|
||||
"@angular/cli": "^16.2.0",
|
||||
"@angular/compiler-cli": "^16.2.0",
|
||||
"@types/file-saver": "^2.0.5",
|
||||
"@types/jasmine": "~3.10.0",
|
||||
"@types/jquery": "^3.5.16",
|
||||
"@types/node": "^12.20.55",
|
||||
"@types/quill": "^2.0.10",
|
||||
"@typescript-eslint/eslint-plugin": "5.48.2",
|
||||
"@typescript-eslint/parser": "5.48.2",
|
||||
"eslint": "^8.46.0",
|
||||
"jasmine-core": "~3.10.0",
|
||||
"karma": "~6.3.0",
|
||||
"karma-chrome-launcher": "~3.1.0",
|
||||
"karma-coverage": "~2.1.0",
|
||||
"karma-jasmine": "~4.0.0",
|
||||
"karma-jasmine-html-reporter": "~1.7.0",
|
||||
"typescript": "~5.0.4"
|
||||
"@testing-library/jest-dom": "^6.6.3",
|
||||
"@testing-library/react": "^16.3.0",
|
||||
"@testing-library/user-event": "^14.6.1",
|
||||
"@types/chart.js": "^2.9.41",
|
||||
"@types/dompurify": "^3.0.5",
|
||||
"@types/jest": "^27.5.2",
|
||||
"@types/lodash": "^4.17.15",
|
||||
"@types/mixpanel-browser": "^2.50.2",
|
||||
"@types/node": "^20.8.4",
|
||||
"@types/react": "19.0.0",
|
||||
"@types/react-dom": "19.0.0",
|
||||
"@vitejs/plugin-react": "^4.3.4",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"postcss": "^8.5.2",
|
||||
"prettier-plugin-tailwindcss": "^0.6.8",
|
||||
"tailwindcss": "^3.4.17",
|
||||
"terser": "^5.39.0",
|
||||
"typescript": "^5.7.3",
|
||||
"vite": "^6.2.5",
|
||||
"vite-tsconfig-paths": "^5.1.4",
|
||||
"vitest": "^3.0.5"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
49
worklenz-frontend/path/to/members-reports-drawer.tsx
Normal file
@@ -0,0 +1,49 @@
|
||||
import MembersReportsTimeLogsTab from './members-reports-time-logs-tab';
|
||||
|
||||
type MembersReportsDrawerProps = {
|
||||
memberId: string | null;
|
||||
exportTimeLogs: () => void;
|
||||
};
|
||||
|
||||
const MembersReportsDrawer = ({ memberId, exportTimeLogs }: MembersReportsDrawerProps) => {
|
||||
return (
|
||||
<Drawer
|
||||
open={isDrawerOpen}
|
||||
onClose={handleClose}
|
||||
width={900}
|
||||
destroyOnClose
|
||||
title={
|
||||
selectedMember && (
|
||||
<Flex align="center" justify="space-between">
|
||||
<Flex gap={8} align="center" style={{ fontWeight: 500 }}>
|
||||
<Typography.Text>{selectedMember.name}</Typography.Text>
|
||||
</Flex>
|
||||
|
||||
<Space>
|
||||
<TimeWiseFilter />
|
||||
<Dropdown
|
||||
menu={{
|
||||
items: [
|
||||
{ key: '1', label: t('timeLogsButton'), onClick: exportTimeLogs },
|
||||
{ key: '2', label: t('activityLogsButton') },
|
||||
{ key: '3', label: t('tasksButton') },
|
||||
],
|
||||
}}
|
||||
>
|
||||
<Button type="primary" icon={<DownOutlined />} iconPosition="end">
|
||||
{t('exportButton')}
|
||||
</Button>
|
||||
</Dropdown>
|
||||
</Space>
|
||||
</Flex>
|
||||
)
|
||||
}
|
||||
>
|
||||
{selectedMember && <MembersReportsDrawerTabs memberId={selectedMember.id} />}
|
||||
{selectedMember && <MembersOverviewTasksStatsDrawer memberId={selectedMember.id} />}
|
||||
{selectedMember && <MembersOverviewProjectsStatsDrawer memberId={selectedMember.id} />}
|
||||
</Drawer>
|
||||
);
|
||||
};
|
||||
|
||||
export default MembersReportsDrawer;
|
||||
41
worklenz-frontend/path/to/members-reports-time-logs-tab.tsx
Normal file
@@ -0,0 +1,41 @@
|
||||
import React, { useState } from 'react';
|
||||
import { Flex, Skeleton } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useTimeLogs } from '../contexts/TimeLogsContext';
|
||||
import { BillableFilter } from './BillableFilter';
|
||||
import { TimeLogCard } from './TimeLogCard';
|
||||
import { EmptyListPlaceholder } from './EmptyListPlaceholder';
|
||||
import { TaskDrawer } from './TaskDrawer';
|
||||
import MembersReportsDrawer from './members-reports-drawer';
|
||||
|
||||
const MembersReportsTimeLogsTab: React.FC = () => {
|
||||
const { t } = useTranslation();
|
||||
const { timeLogsData, billable, setBillable, exportTimeLogs, exporting } = useTimeLogs();
|
||||
|
||||
return (
|
||||
<Flex vertical gap={24}>
|
||||
<BillableFilter billable={billable} onBillableChange={setBillable} />
|
||||
|
||||
<button onClick={exportTimeLogs} disabled={exporting}>
|
||||
{exporting ? t('exporting') : t('exportTimeLogs')}
|
||||
</button>
|
||||
|
||||
<Skeleton active loading={exporting} paragraph={{ rows: 10 }}>
|
||||
{timeLogsData.length > 0 ? (
|
||||
<Flex vertical gap={24}>
|
||||
{timeLogsData.map((logs, index) => (
|
||||
<TimeLogCard key={index} data={logs} />
|
||||
))}
|
||||
</Flex>
|
||||
) : (
|
||||
<EmptyListPlaceholder text={t('timeLogsEmptyPlaceholder')} />
|
||||
)}
|
||||
</Skeleton>
|
||||
|
||||
{createPortal(<TaskDrawer />, document.body)}
|
||||
<MembersReportsDrawer memberId={/* pass the memberId here */} exportTimeLogs={exportTimeLogs} />
|
||||
</Flex>
|
||||
);
|
||||
};
|
||||
|
||||
export default MembersReportsTimeLogsTab;
|
||||
6
worklenz-frontend/postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
};
|
||||
17
worklenz-frontend/project-report-table.css
Normal file
@@ -0,0 +1,17 @@
|
||||
/* Update or add these styles */
|
||||
.sticky-column {
|
||||
position: sticky;
|
||||
left: 0;
|
||||
z-index: 2;
|
||||
background-color: var(--background-default);
|
||||
}
|
||||
|
||||
/* Specific style for odd rows */
|
||||
.table-body-row:nth-child(odd) .sticky-column {
|
||||
background-color: var(--background-alternate); /* or your specific odd row background color */
|
||||
}
|
||||
|
||||
/* Maintain hover state */
|
||||
.table-body-row:hover .sticky-column {
|
||||
background-color: var(--background-hover);
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"/api": {
|
||||
"target": "http://backend:3000/",
|
||||
"headers": {
|
||||
"language": "en",
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json; charset=utf-8"
|
||||
},
|
||||
"secure": false,
|
||||
"changeOrigin": true,
|
||||
"logLevel": "debug"
|
||||
},
|
||||
"/secure": {
|
||||
"target": "http://backend:3000/",
|
||||
"headers": {
|
||||
"language": "en",
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json; charset=utf-8"
|
||||
},
|
||||
"secure": false,
|
||||
"changeOrigin": true,
|
||||
"logLevel": "debug"
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"/api": {
|
||||
"target": "http://127.0.0.1:3000/",
|
||||
"headers": {
|
||||
"language": "en",
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json; charset=utf-8"
|
||||
},
|
||||
"secure": false,
|
||||
"changeOrigin": true,
|
||||
"logLevel": "debug"
|
||||
},
|
||||
"/secure": {
|
||||
"target": "http://127.0.0.1:3000/",
|
||||
"headers": {
|
||||
"language": "en",
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json; charset=utf-8"
|
||||
},
|
||||
"secure": false,
|
||||
"changeOrigin": true,
|
||||
"logLevel": "debug"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
4
worklenz-frontend/public/locales/en/404-page.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"doesNotExistText": "Sorry, the page you visited does not exist.",
|
||||
"backHomeButton": "Back Home"
|
||||
}
|
||||
31
worklenz-frontend/public/locales/en/account-setup.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"continue": "Continue",
|
||||
|
||||
"setupYourAccount": "Setup Your Worklenz Account.",
|
||||
"organizationStepTitle": "Name Your Organization",
|
||||
"organizationStepLabel": "Pick a name for your Worklenz account.",
|
||||
|
||||
"projectStepTitle": "Create your first project",
|
||||
"projectStepLabel": "What project are you working on right now?",
|
||||
"projectStepPlaceholder": "e.g. Marketing Plan",
|
||||
|
||||
"tasksStepTitle": "Create your first tasks",
|
||||
"tasksStepLabel": "Type a few tasks that you are going to do in",
|
||||
"tasksStepAddAnother": "Add another",
|
||||
|
||||
"emailPlaceholder": "Email address",
|
||||
"invalidEmail": "Please enter a valid email address",
|
||||
"or": "or",
|
||||
"templateButton": "Import from template",
|
||||
"goBack": "Go Back",
|
||||
"cancel": "Cancel",
|
||||
"create": "Create",
|
||||
"templateDrawerTitle": "Select from templates",
|
||||
"step3InputLabel": "Invite with email",
|
||||
"addAnother": "Add another",
|
||||
"skipForNow": "Skip for now",
|
||||
"formTitle": "Create your first task.",
|
||||
"step3Title": "Invite your team to work with",
|
||||
"maxMembers": " (You can invite up to 5 members)",
|
||||
"maxTasks": " (You can create up to 5 tasks)"
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"title": "Billings",
|
||||
"currentBill": "Current Bill",
|
||||
"configuration": "Configuration",
|
||||
"currentPlanDetails": "Current Plan Details",
|
||||
"upgradePlan": "Upgrade Plan",
|
||||
"cardBodyText01": "Free trial",
|
||||
"cardBodyText02": "(Your trial plan expires in 1 month 19 days)",
|
||||
"redeemCode": "Redeem Code",
|
||||
"accountStorage": "Account Storage",
|
||||
"used": "Used:",
|
||||
"remaining": "Remaining:",
|
||||
"charges": "Charges",
|
||||
"tooltip": "Charges for the current billing cycle",
|
||||
"description": "Description",
|
||||
"billingPeriod": "Billing Period",
|
||||
"billStatus": "Bill Status",
|
||||
"perUserValue": "Per User Value",
|
||||
"users": "Users",
|
||||
|
||||
"amount": "Amount",
|
||||
"invoices": "Invoices",
|
||||
"transactionId": "Transaction ID",
|
||||
"transactionDate": "Transaction Date",
|
||||
"paymentMethod": "Payment Method",
|
||||
"status": "Status",
|
||||
"ltdUsers": "You can add up to {{ltd_users}} users.",
|
||||
|
||||
"totalSeats": "Total seats",
|
||||
"availableSeats": "Available seats",
|
||||
"addMoreSeats": "Add more seats",
|
||||
|
||||
"drawerTitle": "Redeem Code",
|
||||
"label": "Redeem Code",
|
||||
"drawerPlaceholder": "Enter your redeem code",
|
||||
"redeemSubmit": "Submit",
|
||||
|
||||
"modalTitle": "Select the best plan for your team",
|
||||
"seatLabel": "No of seats",
|
||||
"freePlan": "Free Plan",
|
||||
"startup": "Startup",
|
||||
"business": "Business",
|
||||
"tag": "Most Popular",
|
||||
"enterprise": "Enterprise",
|
||||
|
||||
"freeSubtitle": "free forever",
|
||||
"freeUsers": "Best for personal use",
|
||||
"freeText01": "100MB storage",
|
||||
"freeText02": "3 projects",
|
||||
"freeText03": "5 team members",
|
||||
|
||||
"startupSubtitle": "FLAT RATE / month",
|
||||
"startupUsers": "Upto 15 users",
|
||||
"startupText01": "25GB storage",
|
||||
"startupText02": "Unlimited active projects",
|
||||
"startupText03": "Schedule",
|
||||
"startupText04": "Reporting",
|
||||
"startupText05": "Subscribe to projects",
|
||||
|
||||
"businessSubtitle": "user / month",
|
||||
"businessUsers": "16 - 200 users",
|
||||
|
||||
"enterpriseUsers": "200 - 500+ users",
|
||||
|
||||
"footerTitle": "Please provide us with a contact number we can use to reach you.",
|
||||
"footerLabel": "Contact Number",
|
||||
"footerButton": "Contact us",
|
||||
|
||||
"redeemCodePlaceHolder": "Enter your redeem code",
|
||||
"submit": "Submit",
|
||||
|
||||
"trialPlan": "Free Trial",
|
||||
"trialExpireDate": "Valid until {{trial_expire_date}}",
|
||||
"trialExpired": "Your free trial expired {{trial_expire_string}}",
|
||||
"trialInProgress": "Your free trial expires {{trial_expire_string}}",
|
||||
|
||||
"required": "This field is required",
|
||||
"invalidCode": "Invalid code",
|
||||
|
||||
"selectPlan": "Select the best plan for your team",
|
||||
"changeSubscriptionPlan": "Change your subscription plan",
|
||||
"noOfSeats": "Number of seats",
|
||||
"annualPlan": "Pro - Annual",
|
||||
"monthlyPlan": "Pro - Monthly",
|
||||
"freeForever": "Free Forever",
|
||||
"bestForPersonalUse": "Best for personal use",
|
||||
"storage": "Storage",
|
||||
"projects": "Projects",
|
||||
"teamMembers": "Team Members",
|
||||
"unlimitedTeamMembers": "Unlimited Team Members",
|
||||
"unlimitedActiveProjects": "Unlimited active projects",
|
||||
"schedule": "Schedule",
|
||||
"reporting": "Reporting",
|
||||
"subscribeToProjects": "Subscribe to projects",
|
||||
"billedAnnually": "Billed Annually",
|
||||
"billedMonthly": "Billed Monthly",
|
||||
|
||||
"pausePlan": "Pause Plan",
|
||||
"resumePlan": "Resume Plan",
|
||||
"changePlan": "Change Plan",
|
||||
"cancelPlan": "Cancel Plan",
|
||||
|
||||
"perMonthPerUser": "per user/month",
|
||||
"viewInvoice": "View Invoice",
|
||||
"switchToFreePlan": "Switch to Free Plan",
|
||||
|
||||
"expirestoday": "today",
|
||||
"expirestomorrow": "tomorrow",
|
||||
"expiredDaysAgo": "{{days}} days ago",
|
||||
|
||||
"continueWith": "Continue with {{plan}}",
|
||||
"changeToPlan": "Change to {{plan}}"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"overview": "Overview",
|
||||
"name": "Organization Name",
|
||||
"owner": "Organization Owner",
|
||||
"admins": "Organization Admins",
|
||||
"contactNumber": "Add Contact Number",
|
||||
"edit": "Edit"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"membersCount": "Members Count",
|
||||
"createdAt": "Created at",
|
||||
"projectName": "Project Name",
|
||||
"teamName": "Team Name",
|
||||
"refreshProjects": "Refresh projects",
|
||||
"searchPlaceholder": "Search by project name",
|
||||
"deleteProject": "Are you sure you want to delete this project?",
|
||||
"confirm": "Confirm",
|
||||
"cancel": "Cancel",
|
||||
"delete": "Delete Project"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"overview": "Overview",
|
||||
"users": "Users",
|
||||
"teams": "Teams",
|
||||
"billing": "Billing",
|
||||
"projects": "Projects",
|
||||
"adminCenter": "Admin Center"
|
||||
}
|
||||
33
worklenz-frontend/public/locales/en/admin-center/teams.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"title": "Teams",
|
||||
"subtitle": "teams",
|
||||
"tooltip": "Refresh teams",
|
||||
"placeholder": "Search by name",
|
||||
"addTeam": "Add Team",
|
||||
"team": "Team",
|
||||
"membersCount": "Members Count",
|
||||
"members": "Members",
|
||||
"drawerTitle": "Create New Team",
|
||||
"label": "Team Name",
|
||||
"drawerPlaceholder": "Name",
|
||||
"create": "Create",
|
||||
"delete": "Delete",
|
||||
"settings": "Settings",
|
||||
"popTitle": "Are you sure?",
|
||||
"message": "Please enter a Name",
|
||||
"teamSettings": "Team Settings",
|
||||
"teamName": "Team Name",
|
||||
"teamDescription": "Team Description",
|
||||
"teamMembers": "Team Members",
|
||||
"teamMembersCount": "Team Members Count",
|
||||
"teamMembersPlaceholder": "Search by name",
|
||||
"addMember": "Add Member",
|
||||
"add": "Add",
|
||||
"update": "Update",
|
||||
"teamNamePlaceholder": "Name of the team",
|
||||
"user": "User",
|
||||
"role": "Role",
|
||||
"owner": "Owner",
|
||||
"admin": "Admin",
|
||||
"member": "Member"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"title": "Users",
|
||||
"subTitle": "users",
|
||||
"placeholder": "Search by name",
|
||||
"user": "User",
|
||||
"email": "Email",
|
||||
"lastActivity": "Last Activity",
|
||||
"refresh": "Refresh users"
|
||||
}
|
||||
23
worklenz-frontend/public/locales/en/all-project-list.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "Name",
|
||||
"client": "Client",
|
||||
"category": "Category",
|
||||
"status": "Status",
|
||||
"tasksProgress": "Tasks Progress",
|
||||
"updated_at": "Last Updated",
|
||||
"members": "Members",
|
||||
"setting": "Settings",
|
||||
"projects": "Projects",
|
||||
"refreshProjects": "Refresh projects",
|
||||
"all": "All",
|
||||
"favorites": "Favorites",
|
||||
"archived": "Archived",
|
||||
"placeholder": "Search by name",
|
||||
"archive": "Archive",
|
||||
"unarchive": "Unarchive",
|
||||
"archiveConfirm": "Are you sure you want to archive this project?",
|
||||
"unarchiveConfirm": "Are you sure you want to unarchive this project?",
|
||||
"clickToFilter": "Click to filter by",
|
||||
"noProjects": "No projects found",
|
||||
"addToFavourites": "Add to favourites"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"loggingOut": "Logging out...",
|
||||
"authenticating": "Authenticating...",
|
||||
"gettingThingsReady": "Getting things ready for you..."
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"headerDescription": "Reset your password",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "Enter your email",
|
||||
"emailRequired": "Please enter your Email!",
|
||||
"resetPasswordButton": "Reset Password",
|
||||
"returnToLoginButton": "Return to Login",
|
||||
"passwordResetSuccessMessage": "A password reset link has been sent to your email.",
|
||||
"orText": "OR",
|
||||
"successTitle": "Reset instruction sent!",
|
||||
"successMessage": "Reset information has been sent to your email. Please check your email."
|
||||
}
|
||||
27
worklenz-frontend/public/locales/en/auth/login.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"headerDescription": "Login to your account",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "Enter your email",
|
||||
"emailRequired": "Please enter your Email!",
|
||||
"passwordLabel": "Password",
|
||||
"passwordPlaceholder": "Enter your password",
|
||||
"passwordRequired": "Please enter your Password!",
|
||||
"rememberMe": "Remember me",
|
||||
"loginButton": "Log in",
|
||||
"signupButton": "Sign up",
|
||||
"forgotPasswordButton": "Forgot password?",
|
||||
"signInWithGoogleButton": "Sign in with Google",
|
||||
"dontHaveAccountText": "Don’t have an account?",
|
||||
"orText": "OR",
|
||||
"successMessage": "You have successfully logged in!",
|
||||
"loginError": "Login failed",
|
||||
"googleLoginError": "Google login failed",
|
||||
"validationMessages": {
|
||||
"email": "Please enter a valid email address",
|
||||
"password": "Password must be at least 8 characters long"
|
||||
},
|
||||
"errorMessages": {
|
||||
"loginErrorTitle": "Login failed",
|
||||
"loginErrorMessage": "Please check your email and password and try again"
|
||||
}
|
||||
}
|
||||
29
worklenz-frontend/public/locales/en/auth/signup.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"headerDescription": "Sign up to get started",
|
||||
"nameLabel": "Full Name",
|
||||
"namePlaceholder": "Enter your full name",
|
||||
"nameRequired": "Please enter your full name!",
|
||||
"nameMinCharacterRequired": "Full name must be at least 4 characters!",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "Enter your email",
|
||||
"emailRequired": "Please enter your Email!",
|
||||
"passwordLabel": "Password",
|
||||
"passwordPlaceholder": "Enter your password",
|
||||
"passwordRequired": "Please enter your Password!",
|
||||
"passwordMinCharacterRequired": "Password must be at least 8 characters!",
|
||||
"passwordPatternRequired": "Password does not meet the requirements!",
|
||||
"strongPasswordPlaceholder": "Enter a stronger password",
|
||||
"passwordValidationAltText": "Password must include at least 8 characters with upper and lower case letters, a number, and a symbol.",
|
||||
"signupSuccessMessage": "You have successfully signed up!",
|
||||
"privacyPolicyLink": "Privacy Policy",
|
||||
"termsOfUseLink": "Terms of Use",
|
||||
"bySigningUpText": "By signing up, you agree to our",
|
||||
"andText": "and",
|
||||
"signupButton": "Sign up",
|
||||
"signInWithGoogleButton": "Sign in with Google",
|
||||
"alreadyHaveAccountText": "Already have an account?",
|
||||
"loginButton": "Login",
|
||||
"orText": "OR",
|
||||
"reCAPTCHAVerificationError": "reCAPTCHA Verification Error",
|
||||
"reCAPTCHAVerificationErrorMessage": "We were unable to verify your reCAPTCHA. Please try again."
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"title": "Verify Reset Email",
|
||||
"description": "Enter your new password",
|
||||
"placeholder": "Enter your new password",
|
||||
"confirmPasswordPlaceholder": "Confirm your new password",
|
||||
"passwordHint": "Minimum of 8 characters, with upper and lowercase and a number and a symbol.",
|
||||
"resetPasswordButton": "Reset password",
|
||||
"orText": "Or",
|
||||
"resendResetEmail": "Resend reset email",
|
||||
"passwordRequired": "Please enter your new password",
|
||||
"returnToLoginButton": "Return to Login",
|
||||
"confirmPasswordRequired": "Please confirm your new password",
|
||||
"passwordMismatch": "The two passwords do not match"
|
||||
}
|
||||
9
worklenz-frontend/public/locales/en/common.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"login-success": "Login successful!",
|
||||
"login-failed": "Login failed. Please check your credentials and try again.",
|
||||
"signup-success": "Signup successful! Welcome aboard.",
|
||||
"signup-failed": "Signup failed. Please ensure all required fields are filled and try again.",
|
||||
"reconnecting": "Disconnected from server.",
|
||||
"connection-lost": "Failed to connect to server. Please check your internet connection.",
|
||||
"connection-restored": "Connected to server successfully"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"formTitle": "Create your first project",
|
||||
"inputLabel": "What project are you working on right now?",
|
||||
"or": "or",
|
||||
"templateButton": "Import from template",
|
||||
"createFromTemplate": "Create from template",
|
||||
"goBack": "Go Back",
|
||||
"continue": "Continue",
|
||||
"cancel": "Cancel",
|
||||
"create": "Create",
|
||||
"templateDrawerTitle": "Select from templates",
|
||||
"createProject": "Create Project"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"formTitle": "Create your first task.",
|
||||
"inputLable": "Type a few tasks that you are going to do in",
|
||||
"addAnother": "Add another",
|
||||
"goBack": "Go back",
|
||||
"continue": "Continue"
|
||||
}
|
||||
46
worklenz-frontend/public/locales/en/home.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"todoList": {
|
||||
"title": "To do list",
|
||||
"refreshTasks": "Refresh tasks",
|
||||
"addTask": "+ Add Task",
|
||||
"noTasks": "No tasks",
|
||||
"pressEnter": "Press",
|
||||
"toCreate": "to create.",
|
||||
"markAsDone": "Mark as done"
|
||||
},
|
||||
"projects": {
|
||||
"title": "Projects",
|
||||
"refreshProjects": "Refresh projects",
|
||||
"noRecentProjects": "You are currently not assigned to any project.",
|
||||
"noFavouriteProjects": "No projects have been marked as favorites.",
|
||||
"recent": "Recent",
|
||||
"favourites": "Favourites"
|
||||
},
|
||||
"tasks": {
|
||||
"assignedToMe": "Assigned to me",
|
||||
"assignedByMe": "Assigned by me",
|
||||
"all": "All",
|
||||
"today": "Today",
|
||||
"upcoming": "Upcoming",
|
||||
"overdue": "Overdue",
|
||||
"noDueDate": "No due date",
|
||||
"noTasks": "No tasks to show.",
|
||||
"addTask": "+ Add task",
|
||||
"name": "Name",
|
||||
"project": "Project",
|
||||
"status": "Status",
|
||||
"dueDate": "Due Date",
|
||||
"dueDatePlaceholder": "Set Due Date",
|
||||
"tomorrow": "Tomorrow",
|
||||
"nextWeek": "Next Week",
|
||||
"nextMonth": "Next Month",
|
||||
"projectRequired": "Please select a project",
|
||||
"pressTabToSelectDueDateAndProject": "Press Tab to select a due date and a project",
|
||||
"dueOn": "Tasks due on",
|
||||
"taskRequired": "Please add a task",
|
||||
"list": "List",
|
||||
"calendar": "Calendar",
|
||||
"tasks": "Tasks",
|
||||
"refresh": "Refresh"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"formTitle": "Invite your team to work with",
|
||||
"inputLable": "Invite with email",
|
||||
"addAnother": "Add another",
|
||||
"goBack": "Go back",
|
||||
"continue": "Continue",
|
||||
"skipForNow": "Skip for now"
|
||||
}
|
||||
23
worklenz-frontend/public/locales/en/kanban-board.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"rename": "Rename",
|
||||
"delete": "Delete",
|
||||
"addTask": "Add Task",
|
||||
"addSectionButton": "Add Section",
|
||||
"changeCategory": "Change category",
|
||||
|
||||
"deleteTooltip": "Delete",
|
||||
"deleteConfirmationTitle": "Are you sure?",
|
||||
"deleteConfirmationOk": "Yes",
|
||||
"deleteConfirmationCancel": "Cancel",
|
||||
|
||||
"dueDate": "Due date",
|
||||
"cancel": "Cancel",
|
||||
|
||||
"today": "Today",
|
||||
"tomorrow": "Tomorrow",
|
||||
"assignToMe": "Assign to me",
|
||||
"archive": "Archive",
|
||||
|
||||
"newTaskNamePlaceholder": "Write a task Name",
|
||||
"newSubtaskNamePlaceholder": "Write a subtask Name"
|
||||
}
|
||||
6
worklenz-frontend/public/locales/en/license-expired.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"title": "Your Worklenz trial has expired!",
|
||||
"subtitle": "Please upgrade now.",
|
||||
"button": "Upgrade now",
|
||||
"checking": "Checking subscription status..."
|
||||
}
|
||||
31
worklenz-frontend/public/locales/en/navbar.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"logoAlt": "Worklenz Logo",
|
||||
"home": "Home",
|
||||
"projects": "Projects",
|
||||
"schedule": "Schedule",
|
||||
"reporting": "Reporting",
|
||||
"clients": "Clients",
|
||||
"teams": "Teams",
|
||||
"labels": "Labels",
|
||||
"jobTitles": "Job Titles",
|
||||
"upgradePlan": "Upgrade Plan",
|
||||
"upgradePlanTooltip": "Upgrade Plan",
|
||||
"invite": "Invite",
|
||||
"inviteTooltip": "Invite team members to join",
|
||||
"switchTeamTooltip": "Switch team",
|
||||
"help": "Help",
|
||||
"notificationTooltip": "View notifications",
|
||||
"profileTooltip": "View profile",
|
||||
"adminCenter": "Admin Center",
|
||||
"settings": "Settings",
|
||||
"logOut": "Log Out",
|
||||
"notificationsDrawer": {
|
||||
"read": "Read notifications",
|
||||
"unread": "Unread notifications",
|
||||
"markAsRead": "Mark as read",
|
||||
"readAndJoin": "Read & Join",
|
||||
"accept": "Accept",
|
||||
"acceptAndJoin": "Accept & Join",
|
||||
"noNotifications": "No notifications"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"nameYourOrganization": "Name your organization.",
|
||||
"worklenzAccountTitle": "Pick a name for your Worklenz account.",
|
||||
"continue": "Continue"
|
||||
}
|
||||
7
worklenz-frontend/public/locales/en/phases-drawer.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"configurePhases": "Configure Phases",
|
||||
"phaseLabel": "Phase Label",
|
||||
"enterPhaseName": "Enter a name for phase label",
|
||||
"addOption": "Add Option",
|
||||
"phaseOptions": "Phase Options:"
|
||||
}
|
||||
42
worklenz-frontend/public/locales/en/project-drawer.json
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"createProject": "Create Project",
|
||||
"editProject": "Edit Project",
|
||||
"enterCategoryName": "Enter a name for the category",
|
||||
"hitEnterToCreate": "Hit enter to create!",
|
||||
"enterNotes": "Notes",
|
||||
"youCanManageClientsUnderSettings": "You can manage clients under Settings",
|
||||
"addCategory": "Add a category to the project",
|
||||
"newCategory": "New Category",
|
||||
"notes": "Notes",
|
||||
"startDate": "Start Date",
|
||||
"endDate": "End Date",
|
||||
"estimateWorkingDays": "Estimate working days",
|
||||
"estimateManDays": "Estimate man days",
|
||||
"hoursPerDay": "Hours per day",
|
||||
"create": "Create",
|
||||
"update": "Update",
|
||||
"delete": "Delete",
|
||||
"typeToSearchClients": "Type to search clients",
|
||||
"projectColor": "Project Color",
|
||||
"pleaseEnterAName": "Please enter a name",
|
||||
"enterProjectName": "Enter project name",
|
||||
"name": "Name",
|
||||
"status": "Status",
|
||||
"health": "Health",
|
||||
"category": "Category",
|
||||
"projectManager": "Project Manager",
|
||||
"client": "Client",
|
||||
"deleteConfirmation": "Are you sure you want to delete?",
|
||||
"deleteConfirmationDescription": "This will remove all associated data and cannot be undone.",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"createdAt": "Created",
|
||||
"updatedAt": "Updated",
|
||||
"by": "by",
|
||||
"add": "Add",
|
||||
"asClient": "as client",
|
||||
"createClient": "Create client",
|
||||
"searchInputPlaceholder": "Search by name or email",
|
||||
"hoursPerDayValidationMessage": "Hours per day must be a number between 1 and 24",
|
||||
"noPermission": "No permission"
|
||||
}
|
||||
14
worklenz-frontend/public/locales/en/project-view-files.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"nameColumn": "Name",
|
||||
"attachedTaskColumn": "Attached Task",
|
||||
"sizeColumn": "Size",
|
||||
"uploadedByColumn": "Uploaded By",
|
||||
"uploadedAtColumn": "Uploaded At",
|
||||
"fileIconAlt": "File icon",
|
||||
"titleDescriptionText": "All attachments to tasks in this project will appear here.",
|
||||
"deleteConfirmationTitle": "Are you sure?",
|
||||
"deleteConfirmationOk": "Yes",
|
||||
"deleteConfirmationCancel": "Cancel",
|
||||
"segmentedTooltip": "Coming soon! Switch between list view and thumbnail view.",
|
||||
"emptyText": "There are no attachments in the project."
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"overview": {
|
||||
"title": "Overview",
|
||||
"statusOverview": "Status Overview",
|
||||
"priorityOverview": "Priority Overview",
|
||||
"lastUpdatedTasks": "Last Updated Tasks"
|
||||
},
|
||||
"members": {
|
||||
"title": "Members",
|
||||
"tooltip": "Members",
|
||||
"tasksByMembers": "Tasks by members",
|
||||
"tasksByMembersTooltip": "Tasks by members",
|
||||
"name": "Name",
|
||||
"taskCount": "Task Count",
|
||||
"contribution": "Contribution",
|
||||
"completed": "Completed",
|
||||
"incomplete": "Incomplete",
|
||||
"overdue": "Overdue",
|
||||
"progress": "Progress"
|
||||
},
|
||||
"tasks": {
|
||||
"overdueTasks": "Overdue Tasks",
|
||||
"overLoggedTasks": "Over logged Tasks",
|
||||
"tasksCompletedEarly": "Tasks completed early",
|
||||
"tasksCompletedLate": "Tasks completed late",
|
||||
"overLoggedTasksTooltip": "Tasks that has time logged past their estimated time",
|
||||
"overdueTasksTooltip": "Tasks that are past their due date"
|
||||
},
|
||||
"common": {
|
||||
"seeAll": "See all",
|
||||
"totalLoggedHours": "Total logged hours",
|
||||
"totalEstimation": "Total estimation",
|
||||
"completedTasks": "Completed tasks",
|
||||
"incompleteTasks": "Incomplete tasks",
|
||||
"overdueTasks": "Overdue tasks",
|
||||
"overdueTasksTooltip": "Tasks that are past their due date",
|
||||
"totalLoggedHoursTooltip": "Task estimation and logged time for tasks.",
|
||||
"includeArchivedTasks": "Include Archived Tasks",
|
||||
"export": "Export"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"nameColumn": "Name",
|
||||
"jobTitleColumn": "Job Title",
|
||||
"emailColumn": "Email",
|
||||
"tasksColumn": "Tasks",
|
||||
"taskProgressColumn": "Task Progress",
|
||||
"accessColumn": "Access",
|
||||
"fileIconAlt": "File icon",
|
||||
"deleteConfirmationTitle": "Are you sure?",
|
||||
"deleteConfirmationOk": "Yes",
|
||||
"deleteConfirmationCancel": "Cancel",
|
||||
"refreshButtonTooltip": "Refresh members",
|
||||
"deleteButtonTooltip": "Remove from project",
|
||||
"memberCount": "Member",
|
||||
"membersCountPlural": "Members",
|
||||
"emptyText": "There are no attachments in the project."
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"inputPlaceholder": "Add a comment..",
|
||||
"addButton": "Add",
|
||||
"cancelButton": "Cancel",
|
||||
"deleteButton": "Delete"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"importTaskTemplate": "Import Task Template",
|
||||
"templateName": "Template Name",
|
||||
"templateDescription": "Template Description",
|
||||
"selectedTasks": "Selected Tasks",
|
||||
"tasks": "Tasks",
|
||||
"templates": "Templates",
|
||||
"remove": "Remove",
|
||||
"cancel": "Cancel",
|
||||
"import": "Import"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"title": "Project Members",
|
||||
"searchLabel": "Add members by adding their name or email",
|
||||
"searchPlaceholder": "Type name or email",
|
||||
"inviteAsAMember": "Invite as a member",
|
||||
"inviteNewMemberByEmail": "Invite new member by email"
|
||||
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"importTasks": "Import tasks",
|
||||
"createTask": "Create task",
|
||||
"settings": "Settings",
|
||||
"subscribe": "Subscribe",
|
||||
"unsubscribe": "Unsubscribe",
|
||||
"deleteProject": "Delete project",
|
||||
"startDate": "Start date",
|
||||
"endDate": "End date",
|
||||
"projectSettings": "Project settings",
|
||||
"projectSummary": "Project summary",
|
||||
"receiveProjectSummary": "Receive a project summary every evening."
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"title": "Save as Template",
|
||||
"templateName": "Template Name",
|
||||
"includes": "What should be included in the template from the project ?",
|
||||
"includesOptions": {
|
||||
"statuses": "Statuses",
|
||||
"phases": "Phases",
|
||||
"labels": "Labels"
|
||||
},
|
||||
"taskIncludes": "What should be included in the template from the tasks ?",
|
||||
"taskIncludesOptions": {
|
||||
"statuses": "Statuses",
|
||||
"phases": "Phases",
|
||||
"labels": "Labels",
|
||||
"name": "Name",
|
||||
"priority": "Priority",
|
||||
"status": "Status",
|
||||
"phase": "Phase",
|
||||
"label": "Label",
|
||||
"timeEstimate": "Time Estimate",
|
||||
"description": "Description",
|
||||
"subTasks": "Sub Tasks"
|
||||
},
|
||||
"cancel": "Cancel",
|
||||
"save": "Save",
|
||||
"templateNamePlaceholder": "Enter template name"
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"exportButton": "Export",
|
||||
"timeLogsButton": "TimeLogs",
|
||||
"activityLogsButton": "Activity Logs",
|
||||
"tasksButton": "Tasks",
|
||||
"searchByNameInputPlaceholder": "Search by name",
|
||||
|
||||
"overviewTab": "Overview",
|
||||
"timeLogsTab": "Time Logs",
|
||||
"activityLogsTab": "Activity Logs",
|
||||
"tasksTab": "Tasks",
|
||||
|
||||
"projectsText": "Projects",
|
||||
"totalTasksText": "Total Tasks",
|
||||
"assignedTasksText": "Assigned Tasks",
|
||||
"completedTasksText": "Completed Tasks",
|
||||
"ongoingTasksText": "Ongoing Tasks",
|
||||
"overdueTasksText": "Overdue Tasks",
|
||||
"loggedHoursText": "Logged Hours",
|
||||
|
||||
"tasksText": "Tasks",
|
||||
"allText": "All",
|
||||
|
||||
"tasksByProjectsText": "Tasks By Projects",
|
||||
"tasksByStatusText": "Tasks By Status",
|
||||
"tasksByPriorityText": "Tasks By Priority",
|
||||
|
||||
"todoText": "To Do",
|
||||
"doingText": "Doing",
|
||||
"doneText": "Done",
|
||||
"lowText": "Low",
|
||||
"mediumText": "Medium",
|
||||
"highText": "High",
|
||||
|
||||
"billableButton": "Billable",
|
||||
"billableText": "Billable",
|
||||
"nonBillableText": "Non Billable",
|
||||
|
||||
"timeLogsEmptyPlaceholder": "No time logs to show",
|
||||
"loggedText": "Logged",
|
||||
"forText": "for",
|
||||
"inText": "in",
|
||||
"updatedText": "Updated",
|
||||
"fromText": "From",
|
||||
"toText": "to",
|
||||
"withinText": "within",
|
||||
|
||||
"activityLogsEmptyPlaceholder": "No activity logs to show",
|
||||
|
||||
"filterByText": "Filter by:",
|
||||
"selectProjectPlaceholder": "Select Project",
|
||||
|
||||
"taskColumn": "Task",
|
||||
"nameColumn": "Name",
|
||||
"projectColumn": "Project",
|
||||
"statusColumn": "Status",
|
||||
"priorityColumn": "Priority",
|
||||
"dueDateColumn": "Due Date",
|
||||
"completedDateColumn": "Completed Date",
|
||||
"estimatedTimeColumn": "Estimated Time",
|
||||
"loggedTimeColumn": "Logged Time",
|
||||
"overloggedTimeColumn": "Overlogged Time",
|
||||
"daysLeftColumn": "Days Left/Overdue",
|
||||
"startDateColumn": "Start Date",
|
||||
"endDateColumn": "End Date",
|
||||
"actualTimeColumn": "Actual Time",
|
||||
"projectHealthColumn": "Project Health",
|
||||
"categoryColumn": "Category",
|
||||
"projectManagerColumn": "Project Manager",
|
||||
|
||||
"tasksStatsOverviewDrawerTitle": "'s Tasks",
|
||||
"projectsStatsOverviewDrawerTitle": "'s Projects",
|
||||
|
||||
"cancelledText": "Cancelled",
|
||||
"blockedText": "Blocked",
|
||||
"onHoldText": "On Hold",
|
||||
"proposedText": "Proposed",
|
||||
"inPlanningText": "In Planning",
|
||||
"inProgressText": "In Progress",
|
||||
"completedText": "Completed",
|
||||
"continuousText": "Continuous",
|
||||
|
||||
"daysLeftText": "days left",
|
||||
"daysOverdueText": "days overdue",
|
||||
|
||||
"notSetText": "NotSet",
|
||||
"needsAttentionText": "Needs Attention",
|
||||
"atRiskText": "At Risk",
|
||||
"goodText": "Good"
|
||||
}
|
||||
35
worklenz-frontend/public/locales/en/reporting-members.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"yesterdayText": "Yesterday",
|
||||
"lastSevenDaysText": "Last 7 Days",
|
||||
"lastWeekText": "Last Week",
|
||||
"lastThirtyDaysText": "Last 30 Days",
|
||||
"lastMonthText": "Last Month",
|
||||
"lastThreeMonthsText": "Last 3 Months",
|
||||
"allTimeText": "All Time",
|
||||
"customRangeText": "Custom range",
|
||||
"startDateInputPlaceholder": "Start date",
|
||||
"EndDateInputPlaceholder": "End date",
|
||||
"filterButton": "Filter",
|
||||
|
||||
"membersTitle": "Members",
|
||||
"includeArchivedButton": "Include Archived Projects",
|
||||
"exportButton": "Export",
|
||||
"excelButton": "Excel",
|
||||
"searchByNameInputPlaceholder": "Search by name",
|
||||
|
||||
"memberColumn": "Member",
|
||||
"tasksProgressColumn": "Tasks Progress",
|
||||
"tasksAssignedColumn": "Tasks Assigned",
|
||||
"completedTasksColumn": "Completed Tasks",
|
||||
"overdueTasksColumn": "Overdue Tasks",
|
||||
"ongoingTasksColumn": "Ongoing Tasks",
|
||||
|
||||
"tasksAssignedColumnTooltip": "Tasks assigned on selected date range",
|
||||
"overdueTasksColumnTooltip": "Tasks overdue for end of the selected date range",
|
||||
"completedTasksColumnTooltip": "Tasks completed on selected date range",
|
||||
"ongoingTasksColumnTooltip": "Started tasks not completed yet",
|
||||
|
||||
"todoText": "To Do",
|
||||
"doingText": "Doing",
|
||||
"doneText": "Done"
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"exportButton": "Export",
|
||||
"projectsButton": "Projects",
|
||||
"membersButton": "Members",
|
||||
"searchByNameInputPlaceholder": "Search by name",
|
||||
|
||||
"overviewTab": "Overview",
|
||||
"projectsTab": "Projects",
|
||||
"membersTab": "Members",
|
||||
|
||||
"projectsByStatusText": "Projects By Status",
|
||||
"projectsByCategoryText": "Projects By Category",
|
||||
"projectsByHealthText": "Projects By Health",
|
||||
|
||||
"projectsText": "Projects",
|
||||
"allText": "All",
|
||||
|
||||
"cancelledText": "Cancelled",
|
||||
"blockedText": "Blocked",
|
||||
"onHoldText": "On Hold",
|
||||
"proposedText": "Proposed",
|
||||
"inPlanningText": "In Planning",
|
||||
"inProgressText": "In Progress",
|
||||
"completedText": "Completed",
|
||||
"continuousText": "Continuous",
|
||||
|
||||
"notSetText": "Not Set",
|
||||
"needsAttentionText": "Needs Attention",
|
||||
"atRiskText": "At Risk",
|
||||
"goodText": "Good",
|
||||
|
||||
"nameColumn": "Name",
|
||||
"emailColumn": "Email",
|
||||
"projectsColumn": "Projects",
|
||||
"tasksColumn": "Tasks",
|
||||
"overdueTasksColumn": "Overdue Tasks",
|
||||
"completedTasksColumn": "Completed Tasks",
|
||||
"ongoingTasksColumn": "Ongoing Tasks"
|
||||
}
|
||||
25
worklenz-frontend/public/locales/en/reporting-overview.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"overviewTitle": "Overview",
|
||||
"includeArchivedButton": "Include Archived Projects",
|
||||
|
||||
"teamCount": "Team",
|
||||
"teamCountPlural": "Teams",
|
||||
"projectCount": "Project",
|
||||
"projectCountPlural": "Projects",
|
||||
"memberCount": "Member",
|
||||
"memberCountPlural": "Members",
|
||||
"activeProjectCount": "Active Project",
|
||||
"activeProjectCountPlural": "Active Projects",
|
||||
"overdueProjectCount": "Overdue Project",
|
||||
"overdueProjectCountPlural": "Overdue Projects",
|
||||
"unassignedMemberCount": "Unassigned Member",
|
||||
"unassignedMemberCountPlural": "Unassigned Members",
|
||||
"memberWithOverdueTaskCount": "Member With Overdue Task",
|
||||
"memberWithOverdueTaskCountPlural": "Member With Overdue Tasks",
|
||||
|
||||
"teamsText": "Teams",
|
||||
|
||||
"nameColumn": "Name",
|
||||
"projectsColumn": "Projects",
|
||||
"membersColumn": "Members"
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"exportButton": "Export",
|
||||
"membersButton": "Members",
|
||||
"tasksButton": "Tasks",
|
||||
"searchByNameInputPlaceholder": "Search by name",
|
||||
|
||||
"overviewTab": "Overview",
|
||||
"membersTab": "Members",
|
||||
"tasksTab": "Tasks",
|
||||
|
||||
"completedTasksText": "Completed Tasks",
|
||||
"incompleteTasksText": "Incomplete Tasks",
|
||||
"overdueTasksText": "Overdue Tasks",
|
||||
"allocatedHoursText": "Allocated Hours",
|
||||
"loggedHoursText": "Logged Hours",
|
||||
|
||||
"tasksText": "Tasks",
|
||||
"allText": "All",
|
||||
|
||||
"tasksByStatusText": "Tasks By Status",
|
||||
"tasksByPriorityText": "Tasks By Priority",
|
||||
"tasksByDueDateText": "Tasks By Due Date",
|
||||
|
||||
"todoText": "To Do",
|
||||
"doingText": "Doing",
|
||||
"doneText": "Done",
|
||||
"lowText": "Low",
|
||||
"mediumText": "Medium",
|
||||
"highText": "High",
|
||||
"completedText": "Completed",
|
||||
"upcomingText": "Upcoming",
|
||||
"overdueText": "Overdue",
|
||||
"noDueDateText": "No Due Date",
|
||||
|
||||
"nameColumn": "Name",
|
||||
"tasksCountColumn": "Tasks Count",
|
||||
"completedTasksColumn": "Completed Tasks",
|
||||
"incompleteTasksColumn": "Incomplete Tasks",
|
||||
"overdueTasksColumn": "Overdue Tasks",
|
||||
"contributionColumn": "Contribution",
|
||||
"progressColumn": "Progress",
|
||||
"loggedTimeColumn": "Logged Time",
|
||||
"taskColumn": "Task",
|
||||
"projectColumn": "Project",
|
||||
"statusColumn": "Status",
|
||||
"priorityColumn": "Priority",
|
||||
"phaseColumn": "Phase",
|
||||
"dueDateColumn": "Due Date",
|
||||
"completedDateColumn": "Completed Date",
|
||||
"estimatedTimeColumn": "Estimated Time",
|
||||
"overloggedTimeColumn": "Overlogged Time",
|
||||
"completedOnColumn": "Completed On",
|
||||
"daysOverdueColumn": "Days overdue",
|
||||
|
||||
"groupByText": "Group By:",
|
||||
"statusText": "Status",
|
||||
"priorityText": "Priority",
|
||||
"phaseText": "Phase"
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"searchByNamePlaceholder": "Search by name",
|
||||
"searchByCategoryPlaceholder": "Search by category",
|
||||
|
||||
"statusText": "Status",
|
||||
"healthText": "Health",
|
||||
"categoryText": "Category",
|
||||
"projectManagerText": "Project Manager",
|
||||
"showFieldsText": "Show fields",
|
||||
|
||||
"cancelledText": "Cancelled",
|
||||
"blockedText": "Blocked",
|
||||
"onHoldText": "On Hold",
|
||||
"proposedText": "Proposed",
|
||||
"inPlanningText": "In Planning",
|
||||
"inProgressText": "In Progress",
|
||||
"completedText": "Completed",
|
||||
"continuousText": "Continuous",
|
||||
|
||||
"notSetText": "NotSet",
|
||||
"needsAttentionText": "Needs Attention",
|
||||
"atRiskText": "At Risk",
|
||||
"goodText": "Good",
|
||||
|
||||
"nameText": "Project",
|
||||
"estimatedVsActualText": "Estimated Vs Actual",
|
||||
"tasksProgressText": "Tasks Progress",
|
||||
"lastActivityText": "Last Activity",
|
||||
"datesText": "Start/End Dates",
|
||||
"daysLeftText": "Days Left/Overdue",
|
||||
"projectHealthText": "Project Health",
|
||||
"projectUpdateText": "Project Update",
|
||||
"clientText": "Client",
|
||||
"teamText": "Team"
|
||||
}
|
||||
52
worklenz-frontend/public/locales/en/reporting-projects.json
Normal file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"projectCount": "Project",
|
||||
"projectCountPlural": "Projects",
|
||||
"includeArchivedButton": "Include Archived Projects",
|
||||
"exportButton": "Export",
|
||||
"excelButton": "Excel",
|
||||
|
||||
"projectColumn": "Project",
|
||||
"estimatedVsActualColumn": "Estimated Vs Actual",
|
||||
"tasksProgressColumn": "Tasks Progress",
|
||||
"lastActivityColumn": "Last Activity",
|
||||
"statusColumn": "Status",
|
||||
"datesColumn": "Start/End Dates",
|
||||
"daysLeftColumn": "Days Left/Overdue",
|
||||
"projectHealthColumn": "Project Health",
|
||||
"categoryColumn": "Category",
|
||||
"projectUpdateColumn": "Project Update",
|
||||
"clientColumn": "Client",
|
||||
"teamColumn": "Team",
|
||||
"projectManagerColumn": "Project Manager",
|
||||
|
||||
"openButton": "Open",
|
||||
|
||||
"estimatedText": "Estimated",
|
||||
"actualText": "Actual",
|
||||
|
||||
"todoText": "To Do",
|
||||
"doingText": "Doing",
|
||||
"doneText": "Done",
|
||||
|
||||
"cancelledText": "Cancelled",
|
||||
"blockedText": "Blocked",
|
||||
"onHoldText": "On Hold",
|
||||
"proposedText": "Proposed",
|
||||
"inPlanningText": "In Planning",
|
||||
"inProgressText": "In Progress",
|
||||
"completedText": "Completed",
|
||||
"continuousText": "Continuous",
|
||||
|
||||
"daysLeftText": "days left",
|
||||
"dayLeftText": "day left",
|
||||
"daysOverdueText": "days overdue",
|
||||
|
||||
"notSetText": "Not Set",
|
||||
"needsAttentionText": "Needs Attention",
|
||||
"atRiskText": "At Risk",
|
||||
"goodText": "Good",
|
||||
|
||||
"setCategoryText": "Set Category",
|
||||
"searchByNameInputPlaceholder": "Search by name",
|
||||
"todayText": "Today"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"overview": "Overview",
|
||||
"projects": "Projects",
|
||||
"members": "Members",
|
||||
"timeReports": "Time Reports",
|
||||
"estimateVsActual": "Estimate Vs Actual",
|
||||
"currentOrganizationTooltip": "Current organization"
|
||||
}
|
||||
39
worklenz-frontend/public/locales/en/schedule.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"today": "Today",
|
||||
"week": "Week",
|
||||
"month": "Month",
|
||||
|
||||
"settings": "Settings",
|
||||
"workingDays": "Working days",
|
||||
"monday": "Monday",
|
||||
"tuesday": "Tuesday",
|
||||
"wednesday": "Wednesday",
|
||||
"thursday": "Thursday",
|
||||
"friday": "Friday",
|
||||
"saturday": "Saturday",
|
||||
"sunday": "Sunday",
|
||||
"workingHours": "Working hours",
|
||||
"hours": "hours",
|
||||
"saveButton": "Save",
|
||||
|
||||
"totalAllocation": "Total Allocation",
|
||||
"timeLogged": "Time Logged",
|
||||
"remainingTime": "Remaining Time",
|
||||
"total": "Total",
|
||||
"perDay": "Per Day",
|
||||
"tasks": "tasks",
|
||||
"startDate": "Start Date",
|
||||
"endDate": "End Date",
|
||||
|
||||
"hoursPerDay": "Hours Per Day",
|
||||
"totalHours": "Total Hours",
|
||||
"deleteButton": "Delete",
|
||||
"cancelButton": "Cancel",
|
||||
|
||||
"tabTitle": "Task without Start & End dates",
|
||||
|
||||
"allocatedTime": "Allocated time",
|
||||
"totalLogged": "Total Logged",
|
||||
"loggedBillable": "Logged Billable",
|
||||
"loggedNonBillable": "Logged Non Billable"
|
||||
}
|
||||
10
worklenz-frontend/public/locales/en/settings/categories.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"categoryColumn": "Category",
|
||||
"deleteConfirmationTitle": "Are you sure?",
|
||||
"deleteConfirmationOk": "Yes",
|
||||
"deleteConfirmationCancel": "Cancel",
|
||||
"associatedTaskColumn": "Associated Projects",
|
||||
"searchPlaceholder": "Search by name",
|
||||
"emptyText": "Categories can be created while updating or creating projects.",
|
||||
"colorChangeTooltip": "Click to change color"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"title": "Change Password",
|
||||
"currentPassword": "Current Password",
|
||||
"newPassword": "New Password",
|
||||
"confirmPassword": "Confirm Password",
|
||||
"currentPasswordPlaceholder": "Enter your current password",
|
||||
"newPasswordPlaceholder": "New Password",
|
||||
"confirmPasswordPlaceholder": "Confirm Password",
|
||||
"currentPasswordRequired": "Please input your current password!",
|
||||
"newPasswordRequired": "Please input your new password!",
|
||||
"passwordValidationError": "Password must be at least 8 characters with an uppercase letter, a number, and a symbol.",
|
||||
"passwordMismatch": "Passwords do not match!",
|
||||
"passwordRequirements": "New password should be a minimum of 8 characters, with an uppercase letter, a number, and a symbol.",
|
||||
"updateButton": "Update Password"
|
||||
}
|
||||
22
worklenz-frontend/public/locales/en/settings/clients.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"nameColumn": "Name",
|
||||
"projectColumn": "Project",
|
||||
"noProjectsAvailable": "No projects available",
|
||||
"deleteConfirmationTitle": "Are you sure?",
|
||||
"deleteConfirmationOk": "Yes",
|
||||
"deleteConfirmationCancel": "Cancel",
|
||||
"searchPlaceholder": "Search by name",
|
||||
"createClient": "Create Client",
|
||||
"pinTooltip": "Click to pin this into the main menu",
|
||||
"createClientDrawerTitle": "Create Client",
|
||||
"updateClientDrawerTitle": "Update Client",
|
||||
"nameLabel": "Name",
|
||||
"namePlaceholder": "Name",
|
||||
"nameRequiredError": "Please enter a Name",
|
||||
"createButton": "Create",
|
||||
"updateButton": "Update",
|
||||
"createClientSuccessMessage": "Create client success!",
|
||||
"createClientErrorMessage": "Create client failed!",
|
||||
"updateClientSuccessMessage": "Update client success!",
|
||||
"updateClientErrorMessage": "Update client failed!"
|
||||
}
|
||||
20
worklenz-frontend/public/locales/en/settings/job-titles.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"nameColumn": "Name",
|
||||
"deleteConfirmationTitle": "Are you sure?",
|
||||
"deleteConfirmationOk": "Yes",
|
||||
"deleteConfirmationCancel": "Cancel",
|
||||
"searchPlaceholder": "Search by name",
|
||||
"createJobTitleButton": "Create Job Title",
|
||||
"pinTooltip": "Click to pin this into the main menu",
|
||||
"createJobTitleDrawerTitle": "Create Job Title",
|
||||
"updateJobTitleDrawerTitle": "Update Job Title",
|
||||
"nameLabel": "Name",
|
||||
"namePlaceholder": "Name",
|
||||
"nameRequiredError": "Please enter a Name",
|
||||
"createButton": "Create",
|
||||
"updateButton": "Update",
|
||||
"createJobTitleSuccessMessage": "Create job title success!",
|
||||
"createJobTitleErrorMessage": "Create job title failed!",
|
||||
"updateJobTitleSuccessMessage": "Update job title success!",
|
||||
"updateJobTitleErrorMessage": "Update job title failed!"
|
||||
}
|
||||
11
worklenz-frontend/public/locales/en/settings/labels.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"labelColumn": "Label",
|
||||
"deleteConfirmationTitle": "Are you sure?",
|
||||
"deleteConfirmationOk": "Yes",
|
||||
"deleteConfirmationCancel": "Cancel",
|
||||
"associatedTaskColumn": "Associated Task Count",
|
||||
"searchPlaceholder": "Search by name",
|
||||
"emptyText": "Labels can be created while updating or creating tasks.",
|
||||
"pinTooltip": "Click to pin this into the main menu",
|
||||
"colorChangeTooltip": "Click to change color"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"language": "Language",
|
||||
"language_required": "Language is required",
|
||||
"time_zone": "Time zone",
|
||||
"time_zone_required": "Time zone is required",
|
||||
"save_changes": "Save Changes"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"title": "Notifications Settings",
|
||||
"emailTitle": "Send me email notifications",
|
||||
"emailDescription": "This includes new task assignments",
|
||||
"dailyDigestTitle": "Send me a daily digest",
|
||||
"dailyDigestDescription": "Every evening, you will receive a summary of recent activity in tasks.",
|
||||
"popupTitle": "Pop up notifications on my computer when Worklenz is open",
|
||||
"popupDescription": "Pop up notifications can be disabled by your browser. Change your browser settings to allow them.",
|
||||
"unreadItemsTitle": "Show the number of unread items",
|
||||
"unreadItemsDescription": "You'll see counts for each notification."
|
||||
}
|
||||
13
worklenz-frontend/public/locales/en/settings/profile.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"uploadError": "You can only upload JPG/PNG file!",
|
||||
"uploadSizeError": "Image must be smaller than 2MB!",
|
||||
"upload": "Upload",
|
||||
"nameLabel": "Name",
|
||||
"nameRequiredError": "Name is required",
|
||||
"emailLabel": "Email",
|
||||
"emailRequiredError": "Email is required",
|
||||
"saveChanges": "Save Changes",
|
||||
"profileJoinedText": "Joined a month ago",
|
||||
"profileLastUpdatedText": "Last updated a month ago",
|
||||
"avatarTooltip": "Click to upload an avatar"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"nameColumn": "Name",
|
||||
"editToolTip": "Edit",
|
||||
"deleteToolTip": "Delete",
|
||||
"confirmText": "Are you sure?",
|
||||
"okText": "Yes",
|
||||
"cancelText": "Cancel"
|
||||
}
|
||||
14
worklenz-frontend/public/locales/en/settings/sidebar.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"profile": "Profile",
|
||||
"notifications": "Notifications",
|
||||
"clients": "Clients",
|
||||
"job-titles": "Job Titles",
|
||||
"labels": "Labels",
|
||||
"categories": "Categories",
|
||||
"project-templates": "Project Templates",
|
||||
"task-templates": "Task Templates",
|
||||
"team-members": "Team Members",
|
||||
"teams": "Teams",
|
||||
"change-password": "Change Password",
|
||||
"language-and-region": "Language and Region"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"nameColumn": "Name",
|
||||
"createdColumn": "Created",
|
||||
"editToolTip": "Edit",
|
||||
"deleteToolTip": "Delete",
|
||||
"confirmText": "Are you sure?",
|
||||
"okText": "Yes",
|
||||
"cancelText": "Cancel"
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"nameColumn": "Name",
|
||||
"projectsColumn": "Projects",
|
||||
"emailColumn": "Email",
|
||||
"teamAccessColumn": "Team Access",
|
||||
"memberCount": "Member",
|
||||
"membersCountPlural": "Members",
|
||||
"searchPlaceholder": "Search members by name",
|
||||
"pinTooltip": "Refresh member list",
|
||||
"addMemberButton": "Add New Member",
|
||||
"editTooltip": "Edit member",
|
||||
"deactivateTooltip": "Deactivate member",
|
||||
"activateTooltip": "Activate member",
|
||||
"deleteTooltip": "Delete member",
|
||||
"confirmDeleteTitle": "Are you sure you want to delete this member?",
|
||||
"confirmActivateTitle": "Are you sure you want to change this member's status?",
|
||||
"okText": "Yes, proceed",
|
||||
"cancelText": "No, cancel",
|
||||
"deactivatedText": "(Currently deactivated)",
|
||||
"pendingInvitationText": "(Invitation pending)",
|
||||
"addMemberDrawerTitle": "Add New Team Member",
|
||||
"updateMemberDrawerTitle": "Update Team Member",
|
||||
"addMemberEmailHint": "Members will be added to the team regardless of invitation acceptance status",
|
||||
"memberEmailLabel": "Email(s)",
|
||||
"memberEmailPlaceholder": "Enter team member email address",
|
||||
"memberEmailRequiredError": "Please enter a valid email address",
|
||||
"jobTitleLabel": "Job Title",
|
||||
"jobTitlePlaceholder": "Select or search job title (Optional)",
|
||||
"memberAccessLabel": "Access Level",
|
||||
"addToTeamButton": "Add Member to Team",
|
||||
"updateButton": "Save Changes",
|
||||
"resendInvitationButton": "Resend Invitation Email",
|
||||
"invitationSentSuccessMessage": "Team invitation sent successfully!",
|
||||
"createMemberSuccessMessage": "New team member added successfully!",
|
||||
"createMemberErrorMessage": "Failed to add team member. Please try again.",
|
||||
"updateMemberSuccessMessage": "Team member updated successfully!",
|
||||
"updateMemberErrorMessage": "Failed to update team member. Please try again.",
|
||||
"memberText": "Member",
|
||||
"adminText": "Admin",
|
||||
"ownerText": "Team Owner",
|
||||
"addedText": "Added",
|
||||
"updatedText": "Updated",
|
||||
"noResultFound": "Type an email address and hit enter..."
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"details": {
|
||||
"task-key": "Task Key",
|
||||
"phase": "Phase",
|
||||
"assignees": "Assignees",
|
||||
"due-date": "Due Date",
|
||||
"time-estimation": "Time Estimation",
|
||||
"priority": "Priority",
|
||||
"labels": "Labels",
|
||||
"billable": "Billable",
|
||||
"notify": "Notify",
|
||||
"when-done-notify": "When done, notify",
|
||||
"start-date": "Start Date",
|
||||
"end-date": "End Date",
|
||||
"hide-start-date": "Hide Start Date",
|
||||
"show-start-date": "Show Start Date",
|
||||
"hours": "Hours",
|
||||
"minutes": "Minutes"
|
||||
},
|
||||
"description": {
|
||||
"title": "Description",
|
||||
"placeholder": "Add a more detailed description..."
|
||||
},
|
||||
"subTasks": {
|
||||
"title": "Sub Tasks",
|
||||
"add-sub-task": "+ Add Sub Task",
|
||||
"refresh-sub-tasks": "Refresh Sub Tasks"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
{
|
||||
"taskHeader": {
|
||||
"taskNamePlaceholder": "Type your Task",
|
||||
"deleteTask": "Delete Task"
|
||||
},
|
||||
"taskInfoTab": {
|
||||
"title": "Info",
|
||||
"details": {
|
||||
"title": "Details",
|
||||
"task-key": "Task Key",
|
||||
"phase": "Phase",
|
||||
"assignees": "Assignees",
|
||||
"due-date": "Due Date",
|
||||
"time-estimation": "Time Estimation",
|
||||
"priority": "Priority",
|
||||
"labels": "Labels",
|
||||
"billable": "Billable",
|
||||
"notify": "Notify",
|
||||
"when-done-notify": "When done, notify",
|
||||
"start-date": "Start Date",
|
||||
"end-date": "End Date",
|
||||
"hide-start-date": "Hide Start Date",
|
||||
"show-start-date": "Show Start Date",
|
||||
"hours": "Hours",
|
||||
"minutes": "Minutes"
|
||||
},
|
||||
"labels": {
|
||||
"labelInputPlaceholder": "Search or create",
|
||||
"labelsSelectorInputTip": "Hit Enter to create"
|
||||
},
|
||||
"description": {
|
||||
"title": "Description",
|
||||
"placeholder": "Add a more detailed description..."
|
||||
},
|
||||
"subTasks": {
|
||||
"title": "Sub Tasks",
|
||||
"addSubTask": "+ Add Sub Task",
|
||||
"addSubTaskInputPlaceholder": "Type your task and hit enter",
|
||||
"refreshSubTasks": "Refresh Sub Tasks",
|
||||
"edit": "Edit",
|
||||
"delete": "Delete",
|
||||
"confirmDeleteSubTask": "Are you sure you want to delete this subtask?",
|
||||
"deleteSubTask": "Delete Sub Task"
|
||||
},
|
||||
"dependencies": {
|
||||
"title": "Dependencies",
|
||||
"addDependency": "+ Add new dependency",
|
||||
"blockedBy": "Blocked By",
|
||||
"searchTask": "Type to search task",
|
||||
"noTasksFound": "No tasks found",
|
||||
"confirmDeleteDependency": "Are you sure you want to delete?"
|
||||
},
|
||||
"attachments": {
|
||||
"title": "Attachments",
|
||||
"chooseOrDropFileToUpload": "Choose or drop file to upload",
|
||||
"uploading": "Uploading..."
|
||||
},
|
||||
"comments": {
|
||||
"title": "Comments",
|
||||
"addComment": "+ Add new comment",
|
||||
"noComments": "No comments yet. Be the first to comment!",
|
||||
"delete": "Delete",
|
||||
"confirmDeleteComment": "Are you sure you want to delete this comment?"
|
||||
},
|
||||
"searchInputPlaceholder": "Search by name",
|
||||
"pendingInvitation": "Pending Invitation"
|
||||
},
|
||||
"taskTimeLogTab": {
|
||||
"title": "Time Log",
|
||||
"addTimeLog": "Add new time log",
|
||||
"totalLogged": "Total Logged",
|
||||
"exportToExcel": "Export to Excel",
|
||||
"noTimeLogsFound": "No time logs found"
|
||||
},
|
||||
"taskActivityLogTab": {
|
||||
"title": "Activity Log"
|
||||
}
|
||||
}
|
||||