This commit is contained in:
chamikaJ
2025-04-17 18:28:54 +05:30
parent f583291d8a
commit 8825b0410a
2837 changed files with 241385 additions and 127578 deletions

View File

@@ -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

View 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

View File

@@ -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": {}
}
]
}

View File

@@ -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

View File

@@ -1,2 +0,0 @@
engine-strict=true
fund=false # Don't print the trailing funding message

View 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
}
}
]
}

View File

@@ -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"]

View File

@@ -1,37 +1,77 @@
# Worklenz
# Worklenz - React Application
[![Build](https://github.com/ceydigital/worklenz-frontend/actions/workflows/workflow.yml/badge.svg)](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/).
[![Quality Gate Status](https://sonar.ceydigitalworld.com/api/project_badges/measure?project=Worklenz-Frontend&metric=alert_status&token=d1849c9f29e1d72dac962b76cfa9cb11b9fe28e6)](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [![Bugs](https://sonar.ceydigitalworld.com/api/project_badges/measure?project=Worklenz-Frontend&metric=bugs&token=d1849c9f29e1d72dac962b76cfa9cb11b9fe28e6)](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [![Code Smells](https://sonar.ceydigitalworld.com/api/project_badges/measure?project=Worklenz-Frontend&metric=code_smells&token=d1849c9f29e1d72dac962b76cfa9cb11b9fe28e6)](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [![Duplicated Lines (%)](https://sonar.ceydigitalworld.com/api/project_badges/measure?project=Worklenz-Frontend&metric=duplicated_lines_density&token=d1849c9f29e1d72dac962b76cfa9cb11b9fe28e6)](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [![Lines of Code](https://sonar.ceydigitalworld.com/api/project_badges/measure?project=Worklenz-Frontend&metric=ncloc&token=d1849c9f29e1d72dac962b76cfa9cb11b9fe28e6)](https://sonar.ceydigitalworld.com/dashboard?id=Worklenz-Frontend) [![Maintainability Rating](https://sonar.ceydigitalworld.com/api/project_badges/measure?project=Worklenz-Frontend&metric=sqale_rating&token=d1849c9f29e1d72dac962b76cfa9cb11b9fe28e6)](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/).

View File

@@ -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"
]
}
}

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View 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>

View 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',
},
};

View File

@@ -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
});
};

View File

@@ -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)"
]
}
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -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"
]
}
}

View 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;

View 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;

View File

@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

View 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);
}

View File

@@ -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"
}
}

View File

@@ -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"
}
}

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -0,0 +1,4 @@
{
"doesNotExistText": "Sorry, the page you visited does not exist.",
"backHomeButton": "Back Home"
}

View 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)"
}

View File

@@ -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}}"
}

View File

@@ -0,0 +1,8 @@
{
"overview": "Overview",
"name": "Organization Name",
"owner": "Organization Owner",
"admins": "Organization Admins",
"contactNumber": "Add Contact Number",
"edit": "Edit"
}

View File

@@ -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"
}

View File

@@ -0,0 +1,8 @@
{
"overview": "Overview",
"users": "Users",
"teams": "Teams",
"billing": "Billing",
"projects": "Projects",
"adminCenter": "Admin Center"
}

View 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"
}

View File

@@ -0,0 +1,9 @@
{
"title": "Users",
"subTitle": "users",
"placeholder": "Search by name",
"user": "User",
"email": "Email",
"lastActivity": "Last Activity",
"refresh": "Refresh users"
}

View 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"
}

View File

@@ -0,0 +1,5 @@
{
"loggingOut": "Logging out...",
"authenticating": "Authenticating...",
"gettingThingsReady": "Getting things ready for you..."
}

View File

@@ -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."
}

View 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": "Dont 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"
}
}

View 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."
}

View File

@@ -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"
}

View 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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View 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"
}
}

View File

@@ -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"
}

View 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"
}

View File

@@ -0,0 +1,6 @@
{
"title": "Your Worklenz trial has expired!",
"subtitle": "Please upgrade now.",
"button": "Upgrade now",
"checking": "Checking subscription status..."
}

View 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"
}
}

View File

@@ -0,0 +1,5 @@
{
"nameYourOrganization": "Name your organization.",
"worklenzAccountTitle": "Pick a name for your Worklenz account.",
"continue": "Continue"
}

View File

@@ -0,0 +1,7 @@
{
"configurePhases": "Configure Phases",
"phaseLabel": "Phase Label",
"enterPhaseName": "Enter a name for phase label",
"addOption": "Add Option",
"phaseOptions": "Phase Options:"
}

View 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"
}

View 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."
}

View File

@@ -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"
}
}

View File

@@ -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."
}

View File

@@ -0,0 +1,6 @@
{
"inputPlaceholder": "Add a comment..",
"addButton": "Add",
"cancelButton": "Cancel",
"deleteButton": "Delete"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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."
}

View File

@@ -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"
}

View File

@@ -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"
}

View 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"
}

View File

@@ -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"
}

View 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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View 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"
}

View File

@@ -0,0 +1,8 @@
{
"overview": "Overview",
"projects": "Projects",
"members": "Members",
"timeReports": "Time Reports",
"estimateVsActual": "Estimate Vs Actual",
"currentOrganizationTooltip": "Current organization"
}

View 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"
}

View 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"
}

View File

@@ -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"
}

View 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!"
}

View 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!"
}

View 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"
}

View File

@@ -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"
}

View File

@@ -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."
}

View 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"
}

View File

@@ -0,0 +1,8 @@
{
"nameColumn": "Name",
"editToolTip": "Edit",
"deleteToolTip": "Delete",
"confirmText": "Are you sure?",
"okText": "Yes",
"cancelText": "Cancel"
}

View 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"
}

View File

@@ -0,0 +1,9 @@
{
"nameColumn": "Name",
"createdColumn": "Created",
"editToolTip": "Edit",
"deleteToolTip": "Delete",
"confirmText": "Are you sure?",
"okText": "Yes",
"cancelText": "Cancel"
}

View File

@@ -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..."
}

View File

@@ -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"
}
}

View File

@@ -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"
}
}

Some files were not shown because too many files have changed in this diff Show More