diff --git a/.cspell.json b/.cspell.json index 0316bd79a..02ba90f82 100644 --- a/.cspell.json +++ b/.cspell.json @@ -8,6 +8,8 @@ "Accordian", "adipiscing", "aliqua", + "tblr", + "conver", "amet", "Andross", "animatable", @@ -333,7 +335,17 @@ "Northflank", "prebuild", "dataToDisplay", - "GlobalSkeleton" + "GlobalSkeleton", + "dailyplan", + "tomorow", + "comparization", + "plan", + "setwork", + "Clik", + "Relationnal", + "authjs", + "MICROSOFTENTRAID", + "Entra" ], "useGitignore": true, "ignorePaths": [ @@ -372,7 +384,6 @@ "Chatwoot", "CHATWOOT", "apps/web/messages/*.json", - "apps/web/public/locales/**", "apps/web/lib/i18n/*.ts", "apps/web/lib/settings/timezones.js", "apps/mobile/app/screens/DemoShowroomScreen/demos/**", diff --git a/.deploy/k8s/k8s-manifest-api.prod.yaml b/.deploy/k8s/k8s-manifest-api.prod.yaml index 11332f9d2..3a82c54ae 100644 --- a/.deploy/k8s/k8s-manifest-api.prod.yaml +++ b/.deploy/k8s/k8s-manifest-api.prod.yaml @@ -26,7 +26,7 @@ apiVersion: apps/v1 metadata: name: ever-teams-prod-api spec: - replicas: 6 + replicas: 3 selector: matchLabels: app: ever-teams-prod-api diff --git a/.deploy/k8s/k8s-manifest-api.stage.yaml b/.deploy/k8s/k8s-manifest-api.stage.yaml index cb08088fc..5bf790040 100644 --- a/.deploy/k8s/k8s-manifest-api.stage.yaml +++ b/.deploy/k8s/k8s-manifest-api.stage.yaml @@ -26,7 +26,7 @@ apiVersion: apps/v1 metadata: name: ever-teams-stage-api spec: - replicas: 3 + replicas: 2 selector: matchLabels: app: ever-teams-stage-api diff --git a/.deploy/k8s/k8s-manifest.prod.yaml b/.deploy/k8s/k8s-manifest.prod.yaml index 37275c528..86e05a9a7 100644 --- a/.deploy/k8s/k8s-manifest.prod.yaml +++ b/.deploy/k8s/k8s-manifest.prod.yaml @@ -27,7 +27,7 @@ apiVersion: apps/v1 metadata: name: ever-teams-prod-webapp spec: - replicas: 8 + replicas: 4 selector: matchLabels: app: ever-teams-prod-webapp diff --git a/.github/workflows/deploy-api-do-stage.yml b/.github/workflows/deploy-api-do-stage.yml index a4f863303..85210f5f4 100644 --- a/.github/workflows/deploy-api-do-stage.yml +++ b/.github/workflows/deploy-api-do-stage.yml @@ -12,7 +12,7 @@ jobs: deploy-api-stage: runs-on: buildjet-4vcpu-ubuntu-2204 - environment: prod + environment: stage steps: - name: Checkout diff --git a/.github/workflows/server-api.apps.yml b/.github/workflows/server-api.apps.yml new file mode 100644 index 000000000..ae29737c7 --- /dev/null +++ b/.github/workflows/server-api.apps.yml @@ -0,0 +1,253 @@ +name: Server API Build Apps + +on: + workflow_run: + workflows: ['Release Apps'] + branches: [apps] + types: + - completed + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + release-linux: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [buildjet-8vcpu-ubuntu-2204] + + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + with: + repository: 'ever-co/ever-gauzy' + ref: master + + - name: Install Node.js, NPM and Yarn + uses: buildjet/setup-node@v3 + with: + node-version: '20.11.1' + cache: 'yarn' + + - name: Change permissions + run: 'sudo chown -R $(whoami) ./*' + + - name: Install system dependencies + run: 'sudo apt-get update && sudo apt install -y curl gnupg git libappindicator3-1 ca-certificates binutils icnsutils graphicsmagick' + + - name: Fix node-gyp and Python + run: python3 -m pip install packaging setuptools + + - name: Install latest version of NPM + run: 'sudo npm install -g npm@9' + + - name: Install latest node-gyp package + run: 'sudo npm install --quiet -g node-gyp@9.3.1' + + - name: Install Yarn dependencies + run: 'yarn install --network-timeout 1000000 --frozen-lockfile' + + - name: Bootstrap Yarn + run: 'yarn bootstrap' + + - name: Bump version + uses: actions/github-script@v6 + with: + script: | + const script = require('./.scripts/bump-version-electron.js') + script.serverapi(true).then(console.log) + env: + PROJECT_REPO: 'https://github.com/ever-co/ever-teams.git' + DESKTOP_API_SERVER_APP_NAME: 'ever-teams-api-server' + COMPANY_SITE_LINK: 'https://ever.team' + DESKTOP_API_SERVER_APP_DESCRIPTION: 'Ever Teams API Server' + DESKTOP_API_SERVER_APP_ID: 'com.ever.everteamsapiserver' + + - name: Build API Server App + run: 'yarn build:gauzy-api-server:linux:release:gh' + env: + USE_HARD_LINKS: false + GH_TOKEN: ${{ secrets.GH_TOKEN }} + EP_GH_IGNORE_TIME: true + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENTRY_TRACES_SAMPLE_RATE: '${{ secrets.SENTRY_TRACES_SAMPLE_RATE }}' + SENTRY_HTTP_TRACING_ENABLED: '${{ secrets.SENTRY_HTTP_TRACING_ENABLED }}' + SENTRY_POSTGRES_TRACKING_ENABLED: '${{ secrets.SENTRY_POSTGRES_TRACKING_ENABLED }}' + DO_KEY_ID: ${{ secrets.DO_KEY_ID }} + DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }} + NX_NO_CLOUD: true + COMPANY_SITE: 'Ever Teams' + COMPANY_SITE_LINK: 'https://ever.team' + COMPANY_FACEBOOK_LINK: 'https://www.facebook.com/everteamshq' + COMPANY_TWITTER_LINK: 'https://twitter.com/ever_teams' + COMPANY_LINKEDIN_LINK: 'https://www.linkedin.com/company/ever-co' + PROJECT_REPO: 'https://github.com/ever-co/ever-teams.git' + DESKTOP_API_SERVER_APP_NAME: 'ever-teams-api-server' + DESKTOP_API_SERVER_APP_DESCRIPTION: 'Ever Teams API Server' + DESKTOP_API_SERVER_APP_ID: 'com.ever.everteamsapiserver' + DESKTOP_API_SERVER_APP_REPO_NAME: 'ever-teams-api-server' + DESKTOP_API_SERVER_APP_REPO_OWNER: 'ever-co' + DESKTOP_API_SERVER_APP_WELCOME_TITLE: 'Welcome to Ever Teams' + DESKTOP_API_SERVER_APP_WELCOME_CONTENT: 'Ever Teams is a productivity tool that helps you to stay focused on your work and manage your team work better.' + I18N_FILES_URL: 'https://raw.githubusercontent.com/ever-co/ever-teams/develop/apps/server-api/i18n' + PLATFORM_LOGO: 'https://app.ever.team/assets/ever-teams.png' + GAUZY_DESKTOP_LOGO_512X512: 'https://raw.githubusercontent.com/ever-co/ever-gauzy/develop/apps/desktop-timer/src/assets/icons/icon_512x512.png' + + release-mac: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [macos-12] + + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + with: + repository: 'ever-co/ever-gauzy' + ref: master + + - name: Install Node.js, NPM and Yarn + uses: actions/setup-node@v3 + with: + node-version: '20.11.1' + cache: 'yarn' + + - name: Fix node-gyp and Python + run: python3 -m pip install packaging setuptools + + - name: Install latest version of NPM + run: 'sudo npm install -g npm@9' + + - name: Install latest node-gyp package + run: 'sudo npm install --quiet -g node-gyp@9.3.1' + + - name: Install Yarn dependencies + run: 'yarn install --network-timeout 1000000 --frozen-lockfile' + + - name: Bootstrap Yarn + run: 'yarn bootstrap' + + - name: Bump version + uses: actions/github-script@v6 + with: + script: | + const script = require('./.scripts/bump-version-electron.js') + script.serverapi(true).then(console.log) + env: + PROJECT_REPO: 'https://github.com/ever-co/ever-teams.git' + DESKTOP_API_SERVER_APP_NAME: 'ever-teams-api-server' + COMPANY_SITE_LINK: 'https://ever.team' + DESKTOP_API_SERVER_APP_DESCRIPTION: 'Ever Teams API Server' + DESKTOP_API_SERVER_APP_ID: 'com.ever.everteamsapiserver' + + - name: Build API Server App + run: 'yarn build:gauzy-api-server:mac:release' + env: + USE_HARD_LINKS: false + GH_TOKEN: ${{ secrets.GH_TOKEN }} + EP_GH_IGNORE_TIME: true + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENTRY_TRACES_SAMPLE_RATE: '${{ secrets.SENTRY_TRACES_SAMPLE_RATE }}' + SENTRY_HTTP_TRACING_ENABLED: '${{ secrets.SENTRY_HTTP_TRACING_ENABLED }}' + SENTRY_POSTGRES_TRACKING_ENABLED: '${{ secrets.SENTRY_POSTGRES_TRACKING_ENABLED }}' + DO_KEY_ID: ${{ secrets.DO_KEY_ID }} + DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }} + NX_NO_CLOUD: true + COMPANY_SITE: 'Ever Teams' + COMPANY_SITE_LINK: 'https://ever.team' + COMPANY_FACEBOOK_LINK: 'https://www.facebook.com/everteamshq' + COMPANY_TWITTER_LINK: 'https://twitter.com/ever_teams' + COMPANY_LINKEDIN_LINK: 'https://www.linkedin.com/company/ever-co' + PROJECT_REPO: 'https://github.com/ever-co/ever-teams.git' + DESKTOP_API_SERVER_APP_NAME: 'ever-teams-api-server' + DESKTOP_API_SERVER_APP_DESCRIPTION: 'Ever Teams API Server' + DESKTOP_API_SERVER_APP_ID: 'com.ever.everteamsapiserver' + DESKTOP_API_SERVER_APP_REPO_NAME: 'ever-teams-api-server' + DESKTOP_API_SERVER_APP_REPO_OWNER: 'ever-co' + DESKTOP_API_SERVER_APP_WELCOME_TITLE: 'Welcome to Ever Teams' + DESKTOP_API_SERVER_APP_WELCOME_CONTENT: 'Ever Teams is a productivity tool that helps you to stay focused on your work and manage your team work better.' + I18N_FILES_URL: 'https://raw.githubusercontent.com/ever-co/ever-teams/develop/apps/server-api/i18n' + PLATFORM_LOGO: 'https://app.ever.team/assets/ever-teams.png' + GAUZY_DESKTOP_LOGO_512X512: 'https://raw.githubusercontent.com/ever-co/ever-gauzy/develop/apps/desktop-timer/src/assets/icons/icon_512x512.png' + + release-windows: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [windows-latest] + + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + with: + repository: 'ever-co/ever-gauzy' + ref: master + + - name: Install Node.js, NPM and Yarn + uses: actions/setup-node@v3 + with: + node-version: '20.11.1' + cache: 'yarn' + + - name: Fix node-gyp and Python + run: python3 -m pip install packaging setuptools + + - name: Install latest version of NPM + run: 'npm install -g npm@9' + + - name: Install latest node-gyp package + run: 'npm install --quiet -g node-gyp@9.3.1' + + - name: Install Yarn dependencies + run: 'yarn install --network-timeout 1000000 --frozen-lockfile' + + - name: Bootstrap Yarn + run: 'yarn bootstrap' + + - name: Bump version + uses: actions/github-script@v6 + with: + script: | + const script = require('./.scripts/bump-version-electron.js') + script.serverapi(true).then(console.log) + env: + PROJECT_REPO: 'https://github.com/ever-co/ever-teams.git' + DESKTOP_API_SERVER_APP_NAME: 'ever-teams-api-server' + COMPANY_SITE_LINK: 'https://ever.team' + DESKTOP_API_SERVER_APP_DESCRIPTION: 'Ever Teams API Server' + DESKTOP_API_SERVER_APP_ID: 'com.ever.everteamsapiserver' + + - name: Build API Server App + run: 'yarn build:gauzy-api-server:windows:release:gh' + env: + USE_HARD_LINKS: false + GH_TOKEN: ${{ secrets.GH_TOKEN }} + EP_GH_IGNORE_TIME: true + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENTRY_TRACES_SAMPLE_RATE: '${{ secrets.SENTRY_TRACES_SAMPLE_RATE }}' + SENTRY_HTTP_TRACING_ENABLED: '${{ secrets.SENTRY_HTTP_TRACING_ENABLED }}' + SENTRY_POSTGRES_TRACKING_ENABLED: '${{ secrets.SENTRY_POSTGRES_TRACKING_ENABLED }}' + DO_KEY_ID: ${{ secrets.DO_KEY_ID }} + DO_SECRET_KEY: ${{ secrets.DO_SECRET_KEY }} + NX_NO_CLOUD: true + COMPANY_SITE: 'Ever Teams' + COMPANY_SITE_LINK: 'https://ever.team' + COMPANY_FACEBOOK_LINK: 'https://www.facebook.com/everteamshq' + COMPANY_TWITTER_LINK: 'https://twitter.com/ever_teams' + COMPANY_LINKEDIN_LINK: 'https://www.linkedin.com/company/ever-co' + PROJECT_REPO: 'https://github.com/ever-co/ever-teams.git' + DESKTOP_API_SERVER_APP_NAME: 'ever-teams-api-server' + DESKTOP_API_SERVER_APP_DESCRIPTION: 'Ever Teams API Server' + DESKTOP_API_SERVER_APP_ID: 'com.ever.everteamsapiserver' + DESKTOP_API_SERVER_APP_REPO_NAME: 'ever-teams-api-server' + DESKTOP_API_SERVER_APP_REPO_OWNER: 'ever-co' + DESKTOP_API_SERVER_APP_WELCOME_TITLE: 'Welcome to Ever Teams' + DESKTOP_API_SERVER_APP_WELCOME_CONTENT: 'Ever Teams is a productivity tool that helps you to stay focused on your work and manage your team work better.' + I18N_FILES_URL: 'https://raw.githubusercontent.com/ever-co/ever-teams/develop/apps/server-api/i18n' + PLATFORM_LOGO: 'https://app.ever.team/assets/ever-teams.png' + GAUZY_DESKTOP_LOGO_512X512: 'https://raw.githubusercontent.com/ever-co/ever-gauzy/develop/apps/desktop-timer/src/assets/icons/icon_512x512.png' diff --git a/.husky/pre-commit b/.husky/pre-commit index ec2e9a469..ec2f90e94 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -4,4 +4,3 @@ cd "apps/web" yarn lint - diff --git a/.vscode/settings.json b/.vscode/settings.json index ba689581a..5561567ae 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -27,15 +27,17 @@ "**/.git": true, "**/.DS_Store": true, "**/node_modules": false, - "**/public/**/*.png": true, - "**/public/**/*.jpg": true, + "**/public/**/*.png": false, + "**/public/**/*.jpg": false, "**/public/**/*.pdf": true }, "search.exclude": { "**/node_modules": true, - "**/bower_components": true, - "**/*.code-search": true, - "**/web/components/**": true + "**/.idea": true, + "**/.idea/**/*.{xml,iml}": true, + "**/.iml": true, + "**/.yarn": true, + "**/yarn.lock": true }, "docwriter.style": "Auto-detect" } diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..0ad25db4b --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index ee7c33461..000000000 --- a/LICENSE.md +++ /dev/null @@ -1,96 +0,0 @@ -# License - -Copyright © 2022-present, Ever Co. LTD. All rights reserved. - -This document represent official information about our licensing, make sure you read and understand it before start using software and source code. - -- Check more detailed information about licensing in our [Wiki](https://github.com/ever-co/ever-teams/wiki/Licensing). -- You can also ask any questions in the [Issue](https://github.com/ever-co/ever-teams/issues/TODO) or [Contact Us](https://github.com/ever-co/ever-teams#contact-us). - -This software is available under "Community Edition" license constructed from AGPL v3 license with “Commons Clause” License Condition v1.0, see corresponding section below. - -Alternatively, commercial versions of the software must be used in accordance with the terms and conditions of separate written license agreement between you and Ever Co. LTD. With commercial license, your source code (including your changes) is kept proprietary and you can get rights to sell Ever Teams software. You can purchase a commercial licenses at . - -In addition, Ever Co. LTD holds copyright and/or sufficient licenses to all components of the Ever Teams Platform, and therefore can grant, at its sole discretion, the ability for companies, individuals, or organizations to create proprietary modules which may be dynamically linked at runtime with the portions of Ever Teams Platform which fall under our copyright/license umbrella. - -We support the open-source community. If you're building awesome non-profit/open-source projects, we're happy to help and will provide (subject to [acceptance criteria](https://github.com/ever-co/ever-gauzy/wiki/Free-license-and-hosting-for-Non-profit-and-Open-Source-projects)) Ever Teams Enterprise edition license and free hosting option! Feel free to contact us at to make a request. More details explained in our [Wiki](https://github.com/ever-co/ever-gauzy/wiki/Free-license-and-hosting-for-Non-profit-and-Open-Source-projects). - -**The default Ever Teams™ Platform license, without a valid Ever Teams™ Platform Small Business or Ever Teams™ Platform Enterprise License agreement, is the Ever Teams™ Platform Community Edition License.** - -### _Ever Teams Platform Community Edition_ License - -``` -“Commons Clause” License Condition v1.0 - -The Software is provided to you by the Licensor under the License, -as defined below, subject to the following condition. - -Without limiting other conditions in the License, the grant of rights under -the License will not include, and the License does not grant to you, -the right to Sell the Software. - -For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to -you under the License to provide to third parties, for a fee or other consideration -(including without limitation fees for hosting or consulting/ support services related -to the Software), a product or service whose value derives, entirely or substantially, -from the functionality of the Software. Any license notice or attribution required by the License -must also include this Commons Clause License Condition notice. - -Software: Ever Teams - -License: GNU AFFERO GENERAL PUBLIC LICENSE v3.0 - -Licensor: Ever Co. LTD -``` - -All third party components incorporated into the Ever Teams are licensed under -the original license provided by the owner of the applicable component. - -See more information about “Commons Clause” at . - -WARNING: You are not allowed to use this code to host your own SaaS version of Ever Teams! - -You should have received a copy of the relevant GNU Licenses along with this program. If not, see . - -We suggest to check a great overview about different licenses at . -For example, for AGPL v3 (strongest copyleft license) conditions can be summarized as following: - -- making available complete source code of licensed works and modifications, which include larger works using a licensed work, under the same license. -- Copyright and license notices must be preserved -- Contributors provide an express grant of patent rights. -- When a modified version is used to provide a service over a network, the complete source code of the modified version must be made available. - -Feel free to [Contact Us](https://github.com/ever-co/ever-teams#contact-us) for an additional information about used open-source licenses and “Commons Clause”! - -### _Ever Teams Platform Small Business_ License - -Ever Teams™ Platform Small Business License can be purchased by small businesses with annual revenues do not exceed $1 million USD and used for single owned Company. For more information, please see or contact us at . - -### _Ever Teams Platform Enterprise_ License - -Ever Teams™ Platform Enterprise License can be purchased by businesses with more than $1 million USD in annual revenue and used for unlimited amount of owned companies. For more information, please see or contact us at . - -## Credits - -Please see [CREDITS.md](CREDITS.md) files for a list of libraries and software included in this program and information about licenses. - -## Trademarks - -**Ever**® is a registered trademark of [Ever Co. LTD](https://ever.co). -**Gauzy**™, **Ever Teams**™ are trademarks of [Ever Co. LTD](https://ever.co). - -The trademarks and logos may only be used with the written permission of Ever Co. LTD. and may not be used to promote or otherwise market competitive products or services. If you wish to use these trademarks and logos you should contact our licensing department at to determine the necessary steps you must take. - -All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. - -If you have any questions regarding our licensing policy, please contact us: (via email). - -**Ever**® is a registered trademark of [Ever Co. LTD](https://ever.co). -**Gauzy**™ is a trademark of [Ever Co. LTD](https://ever.co). -**Ever Teams**™ is a trademark of [Ever Co. LTD](https://ever.co). - -The trademarks and logos may only be used with the written permission of Ever Co. LTD. and may not be used to promote or otherwise market competitive products or services. If you wish to use these trademarks and logos you should contact our licensing department at to determine the necessary steps you must take. - -All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. - -If you have any questions regarding our licensing policy, please contact us: (via email) diff --git a/LICENSES.md b/LICENSES.md new file mode 100644 index 000000000..81a46f681 --- /dev/null +++ b/LICENSES.md @@ -0,0 +1,67 @@ +# License + +Copyright © 2022-present, Ever Co. LTD. All rights reserved. + +This document represents official information about our licensing, make sure you read and understand it before starting to use software and source code. + +- Check more detailed information about licensing in our [Wiki](https://github.com/ever-co/ever-teams/wiki/Licensing). +- You can also ask any questions in the [Issue](https://github.com/ever-co/ever-teams/issues/TODO) or [Contact Us](https://github.com/ever-co/ever-teams#contact-us). + +This software is available under an Open Source License ("Community Edition"). It is suitable if your business can comply with the requirements of corresponding open-source licenses, see more information below (e.g. requirements to release your modifications under the same open-source licenses for the benefit of our community). + +Alternatively, commercial versions of the Ever Teams software must be used in accordance with the terms and conditions of the separate written license agreement between you and Ever Co. LTD. With a commercial license, your source code (including your changes) is kept proprietary. You can purchase a commercial license at . + +In addition, Ever Co. LTD holds copyright and/or sufficient licenses to all components of the Ever Teams Platform, and therefore can grant, at its sole discretion, the ability for companies, individuals, or organizations to create proprietary modules that may be dynamically linked at runtime with the portions of Ever Teams Platform which fall under our copyright/license umbrella. + +We support the open-source community. If you're building awesome non-profit/open-source projects, we're happy to help and will provide (subject to [acceptance criteria](https://github.com/ever-co/ever-gauzy/wiki/Free-license-and-hosting-for-Non-profit-and-Open-Source-projects)) Ever Teams Enterprise edition license and free hosting option! Feel free to contact us at to make a request. More details are explained in our [Wiki](https://github.com/ever-co/ever-gauzy/wiki/Free-license-and-hosting-for-Non-profit-and-Open-Source-projects). + +**The default Ever Teams™ Platform license, without a valid Ever Teams™ Platform Small Business or Ever Teams™ Platform Enterprise License agreement, is the Ever Teams™ Platform Community Edition License.** + +### _Ever Teams Platform Community Edition_ License + +Ever Teams™ Platform Community Edition available at https://github.com/ever-co/ever-teams released under [GNU Affero General Public License v3.0](https://www.gnu.org/licenses/agpl-3.0.txt). + +If you decide to choose the Ever Teams™ Platform Community Edition License, you must comply with the following terms: + +This program is free software: you can redistribute it and/or modify it under the terms of the corresponding licenses described in the LICENSE / LICENSE.md files located in software sub-folders and under the terms of licenses described in individual files. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +You should have received a copy of the relevant GNU Licenses along with this program. If not, see . + +We suggest checking out a great overview of different open-source licenses at . +For example, for AGPL v3 (the strongest copyleft license we use) conditions can be summarized as follows: + +- making available complete source code of licensed works and modifications, which include larger works using a licensed work, under the same license. +- Copyright and license notices must be preserved +- Contributors provide an express grant of patent rights. +- When a modified version is used to provide a service over a network, the complete source code of the modified version must be made available. + +Feel free to [Contact Us](https://github.com/ever-co/ever-teams#contact-us) for additional information about used open-source licenses! + +### _Ever Teams Platform Small Business_ License + +Ever Teams™ Platform Small Business License can be purchased by small businesses with annual revenues that do not exceed \$1 million and used for single owned Company. +For more information, please see https://ever.team/pricing or contact us at . + +### _Ever Teams Platform Enterprise_ License + +Ever Teams™ Platform Enterprise License can be purchased by businesses with more than \$1 million in annual revenue and used for an unlimited amount of owned companies. +For more information, please see https://ever.team/pricing or contact us at . + +## Credits + +Please see [CREDITS.md](CREDITS.md) files for a list of libraries and software included in this program and information about licenses. + +## Trademarks + +**Ever**® is a registered trademark of [Ever Co. LTD](https://ever.co). +**Ever Teams**™ is a trademark of [Ever Co. LTD](https://ever.co). +**Gauzy**™ is a trademark of [Ever Co. LTD](https://ever.co). +**Ever® Demand Platform™**, **Ever® Demand Platform Community™**, **Ever® Demand Platform Small Business™** and **Ever® Demand Platform Enterprise™** are all trademarks of [Ever Co. LTD](https://ever.co). + +The trademarks and logos may only be used with the written permission of Ever Co. LTD. and may not be used to promote or otherwise market competitive products or services. If you wish to use these trademarks and logos you should contact our licensing department at to determine the necessary steps you must take. + +All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. + +If you have any questions regarding our licensing policy, please contact us: (via email). diff --git a/README.md b/README.md index 7d7104fcd..b0be0651f 100644 --- a/README.md +++ b/README.md @@ -107,14 +107,14 @@ Notes: 1. Download and run the Ever Gauzy Server setup () or run the server manually (see ). You can also run only Ever Gauzy APIs (manually), see . For getting starting instructions, it's best to check the Ever Gauzy [README](https://github.com/ever-co/ever-gauzy/blob/develop/README.md) file. 2. Clone this repo -3. After you get the API or Server running, make sure you set the environment variables `GAUZY_API_SERVER_URL` and `NEXT_PUBLIC_GAUZY_API_SERVER_URL` in Ever Teams .env file (see ). For example, you can set those env vars to if Gauzy API running on that host & port. +3. After you get the API or Server running, make sure you set the environment variables `GAUZY_API_SERVER_URL` and `NEXT_PUBLIC_GAUZY_API_SERVER_URL` in Ever Teams .env file (see ). For example, you can set those env vars to if Gauzy API is running on that host & port. 4. Run `yarn install` 5. Run `yarn build:web && yarn start:web` OR `yarn start:web:dev` 6. Open in in your Browser #### Notes -Note: Ever® Teams™ requires access to Ever® Gauzy™ Platform APIs, provided by another project - Ever® Gauzy™ Platform, see (and also ). Specifically, you might be interested in the `apps/api` and `apps/server` folders of the mono-repo for the code of Gauzy API & Gauzy Server. +Note: Ever® Teams™ requires access to Ever® Gauzy™ Platform APIs, provided by another project - Ever® Gauzy™ Platform, see (and also ). Specifically, you might be interested in the `apps/api` and `apps/server` folders of the mono-repo for the Gauzy API & Gauzy Server code. ### Run in Gitpod @@ -173,7 +173,7 @@ WIP - `/apps/desktop` - Electron-based Desktop Application (customized build from [Ever Gauzy Desktop Timer App](https://github.com/ever-co/ever-gauzy/tree/develop/apps/desktop-timer)) - `/apps/extensions` - Browser Extensions (powered by ) - `/apps/server-api` - Ever Teams API Server (customized build from [Ever Gauzy API Server](https://github.com/ever-co/ever-gauzy/tree/develop/apps/server-api)) -- `/apps/server-web` - Electron-based Ever Teams Web Server that serve Ever Teams NextJs frontend (wraps `apps/web` folder) +- `/apps/server-web` - Electron-based Ever Teams Web Server that serves Ever Teams NextJs frontend (wraps `apps/web` folder) ## 💌 Contact Us @@ -192,25 +192,25 @@ WIP **Ever Teams Platform** follows good security practices, but 100% security cannot be guaranteed in any software! **Ever Teams Platform** is provided AS IS without any warranty. Use at your own risk! -See more details in the [LICENSE.md](LICENSE.md). +See more details in the [LICENSES.md](LICENSES.md). In a production setup, all client-side to server-side (backend, APIs) communications should be encrypted using HTTPS/WSS/SSL (REST APIs, GraphQL endpoint, Socket.io WebSockets, etc.). -If you discover any issue regarding security, please disclose the information responsibly by sending an email to or on [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev) and not by creating a GitHub issue. +If you discover any issue regarding security, please disclose the information responsibly by emailing and not by creating a GitHub issue. ## 🛡️ License This software is available under the following licenses: -- [Ever® Teams™ Platform Community Edition](https://github.com/ever-co/ever-teams/blob/master/LICENSE.md##ever-teams-platform-community-edition-license) -- [Ever® Teams™ Platform Small Business](https://github.com/ever-co/ever-teams/blob/master/LICENSE.md#ever-teams-platform-small-business-license) -- [Ever® Teams™ Platform Enterprise](https://github.com/ever-co/ever-teams/blob/master/LICENSE.md#ever-teams-platform-enterprise-license) +- [Ever® Teams™ Platform Community Edition](https://github.com/ever-co/ever-teams/blob/master/LICENSES.md#ever-teams-platform-community-edition-license) +- [Ever® Teams™ Platform Small Business](https://github.com/ever-co/ever-teams/blob/master/LICENSES.md#ever-teams-platform-small-business-license) +- [Ever® Teams™ Platform Enterprise](https://github.com/ever-co/ever-teams/blob/master/LICENSES.md#ever-teams-platform-enterprise-license) #### The default Ever® Teams™ Platform license, without a valid Ever® Teams™ Platform Enterprise or Ever® Teams™ Platform Small Business License agreement, is the Ever® Teams™ Platform Community Edition License -We support the open-source community. If you're building awesome non-profit/open-source projects, we're happy to help and will provide (subject to [acceptance criteria](https://github.com/ever-co/ever-gauzy/wiki/Free-license-and-hosting-for-Non-profit-and-Open-Source-projects)) Ever Teams Enterprise edition license and free hosting option! Feel free to contact us at to make a request. More details are explained in our [Wiki](https://github.com/ever-co/ever-gauzy/wiki/Free-license-and-hosting-for-Non-profit-and-Open-Source-projects). +We support the open-source community. If you're building awesome non-profit/open-source projects, we're happy to help and will provide (subject to [acceptance criteria](https://github.com/ever-co/ever-teams/wiki/Free-license-and-hosting-for-Non-profit-and-Open-Source-projects)) Ever Teams Enterprise edition license and free hosting option! Feel free to contact us at to make a request. More details are explained in our [Wiki](https://github.com/ever-co/ever-teams/wiki/Free-license-and-hosting-for-Non-profit-and-Open-Source-projects). -#### Please see [LICENSE](LICENSE.md) for more information on licenses +#### Please see [LICENSES](LICENSES.md) for more information on licenses [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fever-co%2Fever-teams.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fever-co%2Fever-teams?ref=badge_large) @@ -261,7 +261,6 @@ You can also view a full list of our [contributors tracked by Github](https://gi --- ![visitors](https://visitor-badge.laobi.icu/badge?page_id=ever-co.ever-teams-platform) -[![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev) [![Circle CI](https://circleci.com/gh/ever-co/ever-teams.svg?style=svg)](https://circleci.com/gh/ever-co/ever-teams) [![codecov](https://codecov.io/gh/ever-co/ever-teams/branch/master/graph/badge.svg)](https://codecov.io/gh/ever-co/ever-teams) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/8c46f9eb9df64aa9859dea4d572059ac)](https://www.codacy.com/gh/ever-co/ever-teams/dashboard?utm_source=github.com&utm_medium=referral&utm_content=ever-co/ever-teams&utm_campaign=Badge_Grade) diff --git a/apps/mobile/app/navigators/AppNavigator.tsx b/apps/mobile/app/navigators/AppNavigator.tsx index 1ea89942d..de631ff28 100644 --- a/apps/mobile/app/navigators/AppNavigator.tsx +++ b/apps/mobile/app/navigators/AppNavigator.tsx @@ -13,7 +13,7 @@ import { StackScreenProps } from '@react-navigation/stack'; import { observer } from 'mobx-react-lite'; import React, { useEffect } from 'react'; import Config from '../config'; -import { QueryClient, QueryClientProvider } from 'react-query'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { useStores } from '../models'; // @demo remove-current-line import { LoginScreen // @demo remove-current-line diff --git a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/AssignTaskSection.tsx b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/AssignTaskSection.tsx index 21619a8e9..b7f75904f 100644 --- a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/AssignTaskSection.tsx +++ b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/AssignTaskSection.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" +import React, { FC, useState } from 'react'; import { View, Text, @@ -12,129 +12,119 @@ import { Dimensions, TouchableOpacity, KeyboardAvoidingView, - Platform, -} from "react-native" -import { typography, useAppTheme } from "../../../../theme" -import { ActivityIndicator } from "react-native-paper" -import { QueryClient } from "react-query" -import TaskPriorities from "../../../../components/TaskPriority" -import TaskSize from "../../../../components/TaskSize" -import TaskLabels from "../../../../components/TaskLabels" -import EstimateTime from "../../TimerScreen/components/EstimateTime" -import { translate } from "../../../../i18n" -import { ICreateTask, ITeamTask } from "../../../../services/interfaces/ITask" -import TaskStatus from "../../../../components/TaskStatus" -import { BlurView } from "expo-blur" -import TaskVersion from "../../../../components/TaskVersion" + Platform +} from 'react-native'; +import { typography, useAppTheme } from '../../../../theme'; +import { ActivityIndicator } from 'react-native-paper'; +import { QueryClient } from '@tanstack/react-query'; +import TaskPriorities from '../../../../components/TaskPriority'; +import TaskSize from '../../../../components/TaskSize'; +import TaskLabels from '../../../../components/TaskLabels'; +import EstimateTime from '../../TimerScreen/components/EstimateTime'; +import { translate } from '../../../../i18n'; +import { ICreateTask, ITeamTask } from '../../../../services/interfaces/ITask'; +import TaskStatus from '../../../../components/TaskStatus'; +import { BlurView } from 'expo-blur'; +import TaskVersion from '../../../../components/TaskVersion'; export interface Props { - visible: boolean - isAuthUser: boolean - createNewTask: (task: ICreateTask) => Promise<{ data: ITeamTask; response: Response }> - onDismiss: () => unknown + visible: boolean; + isAuthUser: boolean; + createNewTask: (task: ICreateTask) => Promise<{ data: ITeamTask; response: Response }>; + onDismiss: () => unknown; } -const { width, height } = Dimensions.get("window") +const { width, height } = Dimensions.get('window'); const ModalPopUp = ({ visible, children }) => { - const [showModal, setShowModal] = React.useState(visible) - const scaleValue = React.useRef(new Animated.Value(0)).current + const [showModal, setShowModal] = React.useState(visible); + const scaleValue = React.useRef(new Animated.Value(0)).current; React.useEffect(() => { - toggleModal() - }, [visible]) + toggleModal(); + }, [visible]); const toggleModal = () => { if (visible) { - setShowModal(true) + setShowModal(true); Animated.spring(scaleValue, { toValue: 1, - useNativeDriver: true, - }).start() + useNativeDriver: true + }).start(); } else { - setTimeout(() => setShowModal(false), 200) + setTimeout(() => setShowModal(false), 200); Animated.timing(scaleValue, { toValue: 0, duration: 300, - useNativeDriver: true, - }).start() + useNativeDriver: true + }).start(); } - } + }; return ( - - - {children} - + + {children} - ) -} + ); +}; -const AssignTaskFormModal: FC = function AssignTaskFormModal({ - visible, - onDismiss, - createNewTask, - isAuthUser, -}) { - const queryClient = new QueryClient() - const [taskInputText, setTaskInputText] = useState("") - const [isLoading, setIsLoading] = useState(false) - const [newTask, setNewTask] = useState(null) +const AssignTaskFormModal: FC = function AssignTaskFormModal({ visible, onDismiss, createNewTask, isAuthUser }) { + const queryClient = new QueryClient(); + const [taskInputText, setTaskInputText] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [newTask, setNewTask] = useState(null); - const { colors } = useAppTheme() + const { colors } = useAppTheme(); const onCreateNewTask = async () => { if (taskInputText.trim().length >= 3) { - setIsLoading(true) + setIsLoading(true); await createNewTask({ ...newTask, title: taskInputText, estimate: newTask?.estimate || 0, - status: newTask?.status || "open", - }).then(() => queryClient.cancelQueries("tasks")) - setIsLoading(false) - setNewTask(null) - setTaskInputText("") - onDismiss() + status: newTask?.status || 'open' + }).then(() => queryClient.cancelQueries({ queryKey: ['tasks'] })); + setIsLoading(false); + setNewTask(null); + setTaskInputText(''); + onDismiss(); } - } + }; const handleChangeText = (value: string) => { - setTaskInputText(value) - } + setTaskInputText(value); + }; return ( - + {isAuthUser - ? translate("tasksScreen.createTaskButton") - : translate("tasksScreen.assignTaskButton")} + ? translate('tasksScreen.createTaskButton') + : translate('tasksScreen.assignTaskButton')} - + = function AssignTaskFormModal({ placeholderTextColor={colors.tertiary} style={[ styles.textInput, - { color: colors.primary, backgroundColor: colors.background }, + { color: colors.primary, backgroundColor: colors.background } ]} autoCorrect={false} - autoCapitalize={"none"} - placeholder={translate("myWorkScreen.taskFieldPlaceholder")} + autoCapitalize={'none'} + placeholder={translate('myWorkScreen.taskFieldPlaceholder')} value={taskInputText} onChangeText={(newText) => handleChangeText(newText)} /> - {isLoading ? ( - - ) : null} + {isLoading ? : null} - {translate("myWorkScreen.estimateLabel")}:{" "} + {translate('myWorkScreen.estimateLabel')}:{' '} setNewTask({ ...newTask, - estimate: e, + estimate: e }) } currentTask={undefined} @@ -195,21 +183,21 @@ const AssignTaskFormModal: FC = function AssignTaskFormModal({ setStatus={(e) => setNewTask({ ...newTask, - status: e, + status: e }) } containerStyle={{ width: width / 2.1, - height: 32, + height: 32 }} /> = function AssignTaskFormModal({ setSize={(e) => setNewTask({ ...newTask, - size: e, + size: e }) } containerStyle={{ width: width / 3.3 }} @@ -227,7 +215,7 @@ const AssignTaskFormModal: FC = function AssignTaskFormModal({ setPriority={(e) => setNewTask({ ...newTask, - priority: e, + priority: e }) } containerStyle={{ width: width / 3.3 }} @@ -238,25 +226,25 @@ const AssignTaskFormModal: FC = function AssignTaskFormModal({ setVersion={(e) => setNewTask({ ...newTask, - version: e, + version: e }) } /> - + setNewTask({ ...newTask, - tags: e, + tags: e }) } containerStyle={{ ...styles.labelsContainer, - width: newTask?.tags.length ? "100%" : width / 3.3, + width: newTask?.tags.length ? '100%' : width / 3.3, borderColor: colors.border, - marginVertical: 20, + marginVertical: 20 }} /> @@ -265,111 +253,106 @@ const AssignTaskFormModal: FC = function AssignTaskFormModal({ { - setNewTask(null) - onDismiss() + setNewTask(null); + onDismiss(); }} - style={[styles.button, { backgroundColor: "#E6E6E9" }]} + style={[styles.button, { backgroundColor: '#E6E6E9' }]} > - - {translate("common.cancel")} - + {translate('common.cancel')} onCreateNewTask()} > {isAuthUser - ? translate("tasksScreen.createButton") - : translate("tasksScreen.assignButton")} + ? translate('tasksScreen.createButton') + : translate('tasksScreen.assignButton')} - ) -} + ); +}; -export default AssignTaskFormModal +export default AssignTaskFormModal; const $modalBackGround: ViewStyle = { flex: 1, - justifyContent: "flex-end", -} + justifyContent: 'flex-end' +}; const styles = StyleSheet.create({ button: { - alignItems: "center", + alignItems: 'center', borderRadius: 11, height: height / 16, - justifyContent: "center", + justifyContent: 'center', padding: 10, - width: width / 2.5, + width: width / 2.5 }, buttonText: { - color: "#FFF", + color: '#FFF', fontFamily: typography.primary.semiBold, - fontSize: 18, + fontSize: 18 }, labelsContainer: { - alignItems: "center", - borderColor: "rgba(255, 255, 255, 0.13)", + alignItems: 'center', + borderColor: 'rgba(255, 255, 255, 0.13)', borderWidth: 1, height: 32, paddingHorizontal: 9, - width: width / 2.7, + width: width / 2.7 }, loading: { - position: "absolute", + position: 'absolute', right: 10, - top: 11, + top: 11 }, mainContainer: { - alignItems: "center", - backgroundColor: "#fff", - borderColor: "#1B005D0D", + alignItems: 'center', + backgroundColor: '#fff', + borderColor: '#1B005D0D', borderTopLeftRadius: 24, borderTopRightRadius: 24, borderWidth: 2, paddingHorizontal: 20, paddingVertical: 30, - shadowColor: "#1B005D0D", + shadowColor: '#1B005D0D', shadowOffset: { width: 10, height: 10 }, shadowRadius: 10, - width: "100%", + width: '100%' }, mainTitle: { fontFamily: typography.primary.semiBold, - fontSize: 24, + fontSize: 24 }, textInput: { - backgroundColor: "#fff", + backgroundColor: '#fff', borderRadius: 10, - color: "rgba(40, 32, 72, 0.4)", + color: 'rgba(40, 32, 72, 0.4)', fontFamily: typography.fonts.PlusJakartaSans.semiBold, fontSize: 12, height: 43, paddingHorizontal: 16, paddingVertical: 13, - width: "90%", + width: '90%' }, wrapButtons: { - flexDirection: "row", - justifyContent: "space-between", - marginVertical: 10, + flexDirection: 'row', + justifyContent: 'space-between', + marginVertical: 10 }, wrapInput: { - backgroundColor: "#fff", - borderColor: "rgba(0, 0, 0, 0.1)", + backgroundColor: '#fff', + borderColor: 'rgba(0, 0, 0, 0.1)', borderRadius: 10, borderWidth: 1, height: 45, paddingVertical: 2, - width: "100%", - }, -}) + width: '100%' + } +}); diff --git a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/UserProfileTasks.tsx b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/UserProfileTasks.tsx index ac2e127c0..e7d029532 100644 --- a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/UserProfileTasks.tsx +++ b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/UserProfileTasks.tsx @@ -41,7 +41,7 @@ const UserProfileTasks: FC = observer(({ profile, content }) > {content.tab === 'worked' && profile.activeUserTeamTask && - (profile.member?.timerStatus === 'running' || (profile.isAuthUser && timerStatus?.running)) ? ( + (profile.member?.employee?.isTrackingTime || (profile.isAuthUser && timerStatus?.running)) ? ( <> - useQuery(['invitations', IGetTeamInvitationParams], () => fetchAllTeamInvitations(IGetTeamInvitationParams), { + useQuery({ + queryKey: ['invitations'], + queryFn: () => fetchAllTeamInvitations(IGetTeamInvitationParams), refetchInterval: 10000 }); @@ -38,6 +40,8 @@ const fetchAllMyInvitations = async ({ tenantId, authToken }: IMyInvitationsPara }; export const useFetchMyInvitations = (IMyInvitationsParams) => - useQuery(['myInvitations', IMyInvitationsParams], () => fetchAllMyInvitations(IMyInvitationsParams), { + useQuery({ + queryKey: ['myInvitations'], + queryFn: () => fetchAllMyInvitations(IMyInvitationsParams), refetchInterval: 10000 }); diff --git a/apps/mobile/app/services/client/queries/language/index.ts b/apps/mobile/app/services/client/queries/language/index.ts index 0bfd2e3a1..f32b9cf19 100644 --- a/apps/mobile/app/services/client/queries/language/index.ts +++ b/apps/mobile/app/services/client/queries/language/index.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { getLanguageListRequest } from '../../requests/languages'; interface IGetAllLanguagesParams { @@ -19,5 +19,8 @@ const fetchAllLanguages = async (params: IGetAllLanguagesParams) => { }; const useFetchAllLanguages = (IGetAllLanguagesParams) => - useQuery(['Languages', IGetAllLanguagesParams], () => fetchAllLanguages(IGetAllLanguagesParams)); + useQuery({ + queryKey: ['Languages'], + queryFn: () => fetchAllLanguages(IGetAllLanguagesParams) + }); export default useFetchAllLanguages; diff --git a/apps/mobile/app/services/client/queries/organizationTeam/organization.ts b/apps/mobile/app/services/client/queries/organizationTeam/organization.ts index 2622d6886..efabdd708 100644 --- a/apps/mobile/app/services/client/queries/organizationTeam/organization.ts +++ b/apps/mobile/app/services/client/queries/organizationTeam/organization.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { ITeamsOut } from '../../../../models/team/Team'; import { IUserOrganization } from '../../../interfaces/IOrganization'; import { IOrganizationTeamList } from '../../../interfaces/IOrganizationTeam'; @@ -51,10 +51,11 @@ const fetchUserOrganization = async (params: IGetUserOrganizationParams) => { }; const useFetchUserOrganization = (IGetUserOrganizationParams) => - useQuery(['teams', IGetUserOrganizationParams], () => fetchUserOrganization(IGetUserOrganizationParams), { + useQuery({ + queryKey: ['teams'], + queryFn: () => fetchUserOrganization(IGetUserOrganizationParams), refetchInterval: 5000, refetchOnMount: true, - notifyOnChangeProps: ['data', 'isSuccess'], - notifyOnChangePropsExclusions: ['isFetching'] + notifyOnChangeProps: ['data', 'isSuccess'] }); export default useFetchUserOrganization; diff --git a/apps/mobile/app/services/client/queries/task/stats.ts b/apps/mobile/app/services/client/queries/task/stats.ts index 0e8d55c32..f0d21da16 100644 --- a/apps/mobile/app/services/client/queries/task/stats.ts +++ b/apps/mobile/app/services/client/queries/task/stats.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { tasksStatistics } from '../../api/timer/tasksStatistics'; interface IGetAllTasksParams { @@ -21,7 +21,10 @@ const fetchAllTasksStats = async (params: IGetAllTasksParams) => { }; export const useFetchAllTasksStats = (IGetAllTasksParams) => - useQuery(['tasks', IGetAllTasksParams], () => fetchAllTasksStats(IGetAllTasksParams), { + useQuery({ + queryKey: ['tasks'], + queryFn: () => fetchAllTasksStats(IGetAllTasksParams), refetchInterval: 5000, - notifyOnChangeProps: ['data'] // Re-render only when data changes + refetchOnMount: true, + notifyOnChangeProps: ['data'] }); diff --git a/apps/mobile/app/services/client/queries/task/task-issue.ts b/apps/mobile/app/services/client/queries/task/task-issue.ts index 8e9a3e1fb..d973dc4d7 100644 --- a/apps/mobile/app/services/client/queries/task/task-issue.ts +++ b/apps/mobile/app/services/client/queries/task/task-issue.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { getIssueTypesListRequest } from '../../requests/issue-type'; interface IGetTaskIssuesParams { @@ -21,7 +21,9 @@ const fetchAllIssues = async (params: IGetTaskIssuesParams) => { }; const useFetchAllIssues = (IGetTaskIssuesParams) => - useQuery(['issues', IGetTaskIssuesParams], () => fetchAllIssues(IGetTaskIssuesParams), { + useQuery({ + queryKey: ['issues'], + queryFn: () => fetchAllIssues(IGetTaskIssuesParams), refetchInterval: 62000 }); export default useFetchAllIssues; diff --git a/apps/mobile/app/services/client/queries/task/task-labels.ts b/apps/mobile/app/services/client/queries/task/task-labels.ts index 908e71f8b..65527d282 100644 --- a/apps/mobile/app/services/client/queries/task/task-labels.ts +++ b/apps/mobile/app/services/client/queries/task/task-labels.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { getAllTaskLabelsRequest } from '../../requests/task-label'; interface IGetTaskLabelParams { @@ -19,7 +19,9 @@ const fetchAllLabels = async (params: IGetTaskLabelParams) => { }; const useFetchAllLabels = (IGetTaskLabelParams) => - useQuery(['labels', IGetTaskLabelParams], () => fetchAllLabels(IGetTaskLabelParams), { + useQuery({ + queryKey: ['labels'], + queryFn: () => fetchAllLabels(IGetTaskLabelParams), refetchInterval: 62000 }); export default useFetchAllLabels; diff --git a/apps/mobile/app/services/client/queries/task/task-priority.ts b/apps/mobile/app/services/client/queries/task/task-priority.ts index 54785c996..1119dd200 100644 --- a/apps/mobile/app/services/client/queries/task/task-priority.ts +++ b/apps/mobile/app/services/client/queries/task/task-priority.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { getTaskAllPrioritiesRequest } from '../../requests/task-priority'; interface IGetTaskPrioritiesParams { @@ -21,7 +21,9 @@ const fetchAllPriorities = async (params: IGetTaskPrioritiesParams) => { }; const useFetchAllPriorities = (IGetTaskPrioritiesParams) => - useQuery(['priorities', IGetTaskPrioritiesParams], () => fetchAllPriorities(IGetTaskPrioritiesParams), { + useQuery({ + queryKey: ['priorities'], + queryFn: () => fetchAllPriorities(IGetTaskPrioritiesParams), refetchInterval: 62000 }); export default useFetchAllPriorities; diff --git a/apps/mobile/app/services/client/queries/task/task-sizes.ts b/apps/mobile/app/services/client/queries/task/task-sizes.ts index d37e56bbf..c49a34893 100644 --- a/apps/mobile/app/services/client/queries/task/task-sizes.ts +++ b/apps/mobile/app/services/client/queries/task/task-sizes.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { getAllTaskSizesRequest } from '../../requests/task-size'; interface IGetTaskSizeParams { @@ -21,7 +21,9 @@ const fetchAllSizes = async (params: IGetTaskSizeParams) => { }; const useFetchAllSizes = (IGetTaskSizeParams) => - useQuery(['sizes', IGetTaskSizeParams], () => fetchAllSizes(IGetTaskSizeParams), { + useQuery({ + queryKey: ['sizes'], + queryFn: () => fetchAllSizes(IGetTaskSizeParams), refetchInterval: 62000 }); export default useFetchAllSizes; diff --git a/apps/mobile/app/services/client/queries/task/task-status.ts b/apps/mobile/app/services/client/queries/task/task-status.ts index c13544b73..5f01b7d9e 100644 --- a/apps/mobile/app/services/client/queries/task/task-status.ts +++ b/apps/mobile/app/services/client/queries/task/task-status.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { getTaskStatusesRequest } from '../../requests/task-status'; interface IGetTaskStatusesParams { @@ -21,7 +21,9 @@ const fetchAllStatuses = async (params: IGetTaskStatusesParams) => { }; const useFetchAllStatuses = (IGetTaskStatusesParams) => - useQuery(['statuses', IGetTaskStatusesParams], () => fetchAllStatuses(IGetTaskStatusesParams), { + useQuery({ + queryKey: ['statuses'], + queryFn: () => fetchAllStatuses(IGetTaskStatusesParams), refetchInterval: 62000 }); export default useFetchAllStatuses; diff --git a/apps/mobile/app/services/client/queries/task/task-version.ts b/apps/mobile/app/services/client/queries/task/task-version.ts index 0dcc31537..5035a4ac0 100644 --- a/apps/mobile/app/services/client/queries/task/task-version.ts +++ b/apps/mobile/app/services/client/queries/task/task-version.ts @@ -1,27 +1,29 @@ -import { useQuery } from "react-query" -import { getTaskVersionListRequest } from "../../requests/task-version" +import { useQuery } from '@tanstack/react-query'; +import { getTaskVersionListRequest } from '../../requests/task-version'; interface IGetTaskVersionsParams { - authToken: string - tenantId: string - organizationId: string - activeTeamId: string + authToken: string; + tenantId: string; + organizationId: string; + activeTeamId: string; } const fetchAllVersions = async (params: IGetTaskVersionsParams) => { - const { organizationId, tenantId, activeTeamId, authToken } = params + const { organizationId, tenantId, activeTeamId, authToken } = params; const { data } = await getTaskVersionListRequest( { tenantId, organizationId, - activeTeamId, + activeTeamId }, - authToken, - ) - return data -} + authToken + ); + return data; +}; const useFetchAllVersions = (IGetTaskVersionsParams) => - useQuery(["versions", IGetTaskVersionsParams], () => fetchAllVersions(IGetTaskVersionsParams), { - refetchInterval: 62000, - }) -export default useFetchAllVersions + useQuery({ + queryKey: ['versions', IGetTaskVersionsParams], + queryFn: () => fetchAllVersions(IGetTaskVersionsParams), + refetchInterval: 62000 + }); +export default useFetchAllVersions; diff --git a/apps/mobile/app/services/client/queries/task/tasks.ts b/apps/mobile/app/services/client/queries/task/tasks.ts index 216dcf146..07d798356 100644 --- a/apps/mobile/app/services/client/queries/task/tasks.ts +++ b/apps/mobile/app/services/client/queries/task/tasks.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { getTeamTasksRequest } from '../../requests/tasks'; interface IGetAllTasksParams { @@ -23,7 +23,9 @@ const fetchAllTasks = async (params: IGetAllTasksParams) => { }; const useFetchAllTasks = (IGetAllTasksParams) => - useQuery(['tasks', IGetAllTasksParams], () => fetchAllTasks(IGetAllTasksParams), { + useQuery({ + queryKey: ['tasks'], + queryFn: () => fetchAllTasks(IGetAllTasksParams), refetchInterval: 5000, notifyOnChangeProps: ['data'] // Re-render only when data changes }); diff --git a/apps/mobile/app/services/client/queries/timer/timer.ts b/apps/mobile/app/services/client/queries/timer/timer.ts index 833e725f6..a89c3711b 100644 --- a/apps/mobile/app/services/client/queries/timer/timer.ts +++ b/apps/mobile/app/services/client/queries/timer/timer.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { getTimerStatusRequest, syncTimeSlotRequest } from '../../requests/timer'; import { ITimerTimeslotParams, TimerSource } from '../../../interfaces/ITimer'; @@ -31,13 +31,10 @@ const fetchTimerStatus = async ( }; const useFetchTimerStatus = (IGetTimerStatusParams, isTimerRunning: boolean, lastlogTimerSource: TimerSource) => - useQuery( - ['status-timer', IGetTimerStatusParams], - () => fetchTimerStatus(IGetTimerStatusParams, isTimerRunning, lastlogTimerSource), - { - refetchInterval: 5000, - notifyOnChangeProps: ['data'], // Re-render only when data changes - notifyOnChangePropsExclusions: ['isFetching'] - } - ); + useQuery({ + queryKey: ['status-timer'], + queryFn: () => fetchTimerStatus(IGetTimerStatusParams, isTimerRunning, lastlogTimerSource), + refetchInterval: 5000, + notifyOnChangeProps: ['data'] // Re-render only when data changes + }); export default useFetchTimerStatus; diff --git a/apps/mobile/app/services/client/queries/user/user.ts b/apps/mobile/app/services/client/queries/user/user.ts index 352024143..26ffd13e9 100644 --- a/apps/mobile/app/services/client/queries/user/user.ts +++ b/apps/mobile/app/services/client/queries/user/user.ts @@ -1,4 +1,4 @@ -import { useQuery } from 'react-query'; +import { useQuery } from '@tanstack/react-query'; import { currentAuthenticatedUserRequest } from '../../requests/auth'; import { getAllUsersRequest } from '../../requests/user'; @@ -14,7 +14,10 @@ const fetchCurrentUserData = async (params: IGetUserDataParams) => { }; export const useFetchCurrentUserData = (IGetUserDataParams) => - useQuery(['user', IGetUserDataParams], () => fetchCurrentUserData(IGetUserDataParams), {}); + useQuery({ + queryKey: ['user'], + queryFn: () => fetchCurrentUserData(IGetUserDataParams) + }); // removed refetchOnMount: 5000 interface IGetOrganizationUsers { authToken: string; @@ -32,7 +35,9 @@ const fetchOrganizationUsers = async (params: IGetOrganizationUsers) => { }; export const useFetchOrganizationUsers = (IGetOrganizationUsers) => - useQuery(['users', IGetOrganizationUsers], () => fetchOrganizationUsers(IGetOrganizationUsers), { + useQuery({ + queryKey: ['users', IGetOrganizationUsers], + queryFn: () => fetchOrganizationUsers(IGetOrganizationUsers), refetchInterval: 5000, refetchOnMount: true, notifyOnChangeProps: ['data'] // Re-render only when data changes diff --git a/apps/mobile/app/services/client/requests/auth.ts b/apps/mobile/app/services/client/requests/auth.ts index e4e267c88..9f3d4f1ff 100644 --- a/apps/mobile/app/services/client/requests/auth.ts +++ b/apps/mobile/app/services/client/requests/auth.ts @@ -54,20 +54,27 @@ type IUEmployeeParam = { relations?: string[]; }; -export const currentAuthenticatedUserRequest = ({ - bearer_token, - relations = ['employee', 'role', 'tenant'] -}: IUEmployeeParam) => { - const params = {} as { [x: string]: string }; - - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; +/** + * Fetches details of the currently authenticated user. + * + * @param {IUEmployeeParam} The employee parameters, including bearer token and optional relations. + * @returns A Promise resolving to the IUser object with the desired relations and employee details. + */ +export const currentAuthenticatedUserRequest = ({ bearer_token, relations = ['role', 'tenant'] }: IUEmployeeParam) => { + // Create a new instance of URLSearchParams for query string construction + const query = new URLSearchParams(); + + // Append each relation to the query string + relations.forEach((relation, index) => { + query.append(`relations[${index}]`, relation); }); - const query = new URLSearchParams(params); + // Append includeEmployee parameter set to true + query.append('includeEmployee', 'true'); + // Construct the fetch request with the query string return serverFetch({ - path: `/user/me?${query.toString()}`, + path: `/user/me?${query}`, method: 'GET', bearer_token }); @@ -94,9 +101,9 @@ export function sendAuthCodeRequest(email: string) { // auth/signin.email/confirm Gives response with tenantId's export function verifyAuthCodeRequest(email: string, code: string) { return serverFetch({ - path: '/auth/signin.email/confirm?includeTeams=true', + path: '/auth/signin.email/confirm', method: 'POST', - body: { email, code } + body: { email, code, includeTeams: true } }); } diff --git a/apps/mobile/app/services/client/requests/organization-team.ts b/apps/mobile/app/services/client/requests/organization-team.ts index fa36743ed..d7448975d 100644 --- a/apps/mobile/app/services/client/requests/organization-team.ts +++ b/apps/mobile/app/services/client/requests/organization-team.ts @@ -36,6 +36,13 @@ export function updateOrganizationTeamRequest({ }); } +/** + * Fetches detailed information for a specific team within an organization. + * + * @param {TeamRequestParams & { teamId: string }} params Parameters including organizationId, tenantId, teamId, and optional relations. + * @param {string} bearer_token Authentication token for the request. + * @returns A Promise resolving to the detailed information of the organization team with member status. + */ export function getOrganizationTeamRequest( { organizationId, @@ -47,29 +54,28 @@ export function getOrganizationTeamRequest( 'members.employee', 'members.employee.user', 'createdBy', - 'createdBy.employee', 'projects' ] }: TeamRequestParams & { teamId: string }, bearer_token: string ) { - const params = { + // Define query parameters + const queryParameters = { organizationId, tenantId, - // source: "BROWSER", - withLaskWorkedTask: 'true', + withLastWorkedTask: 'true', // Corrected the typo here startDate: moment().startOf('day').toISOString(), endDate: moment().endOf('day').toISOString(), - includeOrganizationTeamId: 'false' - } as { [x: string]: string }; + includeOrganizationTeamId: 'false', + ...Object.fromEntries(relations.map((relation, index) => [`relations[${index}]`, relation])) + }; - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; - }); + // Construct the query string + const query = new URLSearchParams(queryParameters); - const queries = new URLSearchParams(params); + // Fetch and return the team data return serverFetch({ - path: `/organization-team/${teamId}?${queries.toString()}`, + path: `/organization-team/${teamId}?${query.toString()}`, method: 'GET', bearer_token, tenantId @@ -82,6 +88,13 @@ type TeamRequestParams = { relations?: string[]; }; +/** + * Fetches a list of all teams within an organization, including specified relation data. + * + * @param {TeamRequestParams} params Contains organizationId, tenantId, and optional relation specifications. + * @param {string} bearer_token Token for request authentication. + * @returns A Promise resolving to a paginated response of organization team lists. + */ export function getAllOrganizationTeamRequest( { organizationId, @@ -91,24 +104,21 @@ export function getAllOrganizationTeamRequest( 'members.role', 'members.employee', 'members.employee.user', - 'createdBy', - 'createdBy.employee' + 'createdBy' ] }: TeamRequestParams, bearer_token: string ) { - const params = { + // Define query parameters + const queryParameters = { 'where[organizationId]': organizationId, 'where[tenantId]': tenantId, source: 'BROWSER', - withLaskWorkedTask: 'true' - } as { [x: string]: string }; - - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; - }); + withLastWorkedTask: 'true', + ...Object.fromEntries(relations.map((relation, index) => [`relations[${index}]`, relation])) + }; - const query = new URLSearchParams(params); + const query = new URLSearchParams(queryParameters); return serverFetch>({ path: `/organization-team?${query.toString()}`, diff --git a/apps/mobile/app/services/client/requests/organization.ts b/apps/mobile/app/services/client/requests/organization.ts index f650bdc14..36d5e51c5 100644 --- a/apps/mobile/app/services/client/requests/organization.ts +++ b/apps/mobile/app/services/client/requests/organization.ts @@ -2,31 +2,50 @@ import { PaginationResponse } from '../../interfaces/IDataResponse'; import { IOrganization, IOrganizationCreate, IUserOrganization } from '../../interfaces/IOrganization'; import { serverFetch } from '../fetch'; -export function createOrganizationRequest(datas: IOrganizationCreate, bearer_token: string) { +export function createOrganizationRequest(datas: IOrganizationCreate, bearerToken: string) { return serverFetch({ path: '/organization', method: 'POST', body: datas, - bearer_token + bearer_token: bearerToken }); } +/** + * Constructs a request to fetch user organizations based on tenant and user ID. + * + * @param param0 - Object containing tenantId and userId. + * @param bearer_token - Bearer token for authorization. + * @returns A promise resolving to a pagination response of user organizations. + */ export function getUserOrganizationsRequest( { tenantId, userId }: { tenantId: string; userId: string }, - bearer_token: string + bearerToken: string ) { - const query = new URLSearchParams({ - relations: new URLSearchParams([]).toString(), - findInput: new URLSearchParams({ - userId, - tenantId - }).toString() + if (!tenantId || !userId || !bearerToken) { + throw new Error('Tenant ID, User ID, and Bearer token are required'); // Validate parameters + } + + // Create query string instance + const query = new URLSearchParams(); + + // Add tenant and user IDs to the query + query.append('where[userId]', userId); + query.append('where[tenantId]', tenantId); + + // Relations to be included in the query + const relations: string[] = []; // You can define relations based on context + + // Append each relation to the query string + relations.forEach((relation, index) => { + query.append(`relations[${index}]`, relation); }); + // Construct the request with the bearer token and additional parameters return serverFetch>({ - path: `/user-organization?data=${query.toString()}`, + path: `/user-organization?${query.toString()}`, // Use toString() for query method: 'GET', - bearer_token, - tenantId + bearer_token: bearerToken, // Include bearer token for authorization + tenantId // Additional context if needed }); } diff --git a/apps/mobile/app/services/hooks/features/useSettings.ts b/apps/mobile/app/services/hooks/features/useSettings.ts index 7d054ab7a..a2121f9e5 100644 --- a/apps/mobile/app/services/hooks/features/useSettings.ts +++ b/apps/mobile/app/services/hooks/features/useSettings.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useStores } from '../../../models'; -import { useQueryClient } from 'react-query'; +import { useQueryClient } from '@tanstack/react-query'; import useFetchAllLanguages from '../../client/queries/language'; import AsyncStorage from '@react-native-async-storage/async-storage'; @@ -36,7 +36,7 @@ export function useSettings() { }, authToken ); - queryClient.invalidateQueries('user'); + queryClient.invalidateQueries({ queryKey: ['user'] }); return data; }, []); @@ -58,7 +58,7 @@ export function useSettings() { }, authToken ); - queryClient.invalidateQueries('user'); + queryClient.invalidateQueries({ queryKey: ['user'] }); } }, []); diff --git a/apps/mobile/app/services/hooks/features/useTaskIssue.ts b/apps/mobile/app/services/hooks/features/useTaskIssue.ts index 21c82286c..df30dd551 100644 --- a/apps/mobile/app/services/hooks/features/useTaskIssue.ts +++ b/apps/mobile/app/services/hooks/features/useTaskIssue.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { useQueryClient } from 'react-query'; +import { useQueryClient } from '@tanstack/react-query'; import { useStores } from '../../../models'; import useFetchAllIssues from '../../client/queries/task/task-issue'; import { @@ -37,7 +37,7 @@ export const useTaskIssue = () => { tenantId, bearer_token: authToken }); - queryClient.invalidateQueries('issues'); + queryClient.invalidateQueries({ queryKey: ['issues'] }); }, []); // Update the issue @@ -49,7 +49,7 @@ export const useTaskIssue = () => { datas: data, bearer_token: authToken }); - queryClient.invalidateQueries('issues'); + queryClient.invalidateQueries({ queryKey: ['issues'] }); }, []); // Create the issue @@ -60,7 +60,7 @@ export const useTaskIssue = () => { tenantId, bearer_token: authToken }); - queryClient.invalidateQueries('issues'); + queryClient.invalidateQueries({ queryKey: ['issues'] }); }, []); useEffect(() => { diff --git a/apps/mobile/app/services/hooks/features/useTaskLabels.ts b/apps/mobile/app/services/hooks/features/useTaskLabels.ts index 909a70a9c..d023adbb0 100644 --- a/apps/mobile/app/services/hooks/features/useTaskLabels.ts +++ b/apps/mobile/app/services/hooks/features/useTaskLabels.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { useQueryClient } from 'react-query'; +import { useQueryClient } from '@tanstack/react-query'; import { useStores } from '../../../models'; import useFetchAllLabels from '../../client/queries/task/task-labels'; import { createLabelRequest, deleteTaskLabelRequest, updateTaskLabelsRequest } from '../../client/requests/task-label'; @@ -28,7 +28,7 @@ export function useTaskLabels() { tenantId, bearer_token: authToken }); - queryClient.invalidateQueries('labels'); + queryClient.invalidateQueries({ queryKey: ['labels'] }); }, []); // Update the label @@ -39,7 +39,7 @@ export function useTaskLabels() { datas: data, bearer_token: authToken }); - queryClient.invalidateQueries('labels'); + queryClient.invalidateQueries({ queryKey: ['labels'] }); }, []); // Create the label @@ -49,7 +49,7 @@ export function useTaskLabels() { datas: { ...data, organizationId, organizationTeamId: activeTeamId }, bearer_token: authToken }); - queryClient.invalidateQueries('labels'); + queryClient.invalidateQueries({ queryKey: ['labels'] }); }, []); useEffect(() => { diff --git a/apps/mobile/app/services/hooks/features/useTaskPriority.ts b/apps/mobile/app/services/hooks/features/useTaskPriority.ts index 2306855fe..8b9a94d27 100644 --- a/apps/mobile/app/services/hooks/features/useTaskPriority.ts +++ b/apps/mobile/app/services/hooks/features/useTaskPriority.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { useQueryClient } from 'react-query'; +import { useQueryClient } from '@tanstack/react-query'; import { useStores } from '../../../models'; import useFetchAllPriorities from '../../client/queries/task/task-priority'; import { @@ -37,7 +37,7 @@ export const useTaskPriority = () => { tenantId, bearer_token: authToken }); - queryClient.invalidateQueries('priorities'); + queryClient.invalidateQueries({ queryKey: ['priorities'] }); }, []); // Update the priority @@ -49,7 +49,7 @@ export const useTaskPriority = () => { datas: data, bearer_token: authToken }); - queryClient.invalidateQueries('priorities'); + queryClient.invalidateQueries({ queryKey: ['priorities'] }); }, []); // Create the priority @@ -60,7 +60,7 @@ export const useTaskPriority = () => { datas: { ...data, organizationId, organizationTeamId: activeTeamId }, bearer_token: authToken }); - queryClient.invalidateQueries('priorities'); + queryClient.invalidateQueries({ queryKey: ['priorities'] }); }, []); useEffect(() => { diff --git a/apps/mobile/app/services/hooks/features/useTaskSizes.ts b/apps/mobile/app/services/hooks/features/useTaskSizes.ts index 3bd30639c..1059bdb58 100644 --- a/apps/mobile/app/services/hooks/features/useTaskSizes.ts +++ b/apps/mobile/app/services/hooks/features/useTaskSizes.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { useQueryClient } from 'react-query'; +import { useQueryClient } from '@tanstack/react-query'; import { useStores } from '../../../models'; import useFetchAllSizes from '../../client/queries/task/task-sizes'; import { createSizeRequest, deleteTaskSizeRequest, updateTaskSizesRequest } from '../../client/requests/task-size'; @@ -26,7 +26,7 @@ export function useTaskSizes() { tenantId, bearer_token: authToken }); - queryClient.invalidateQueries('sizes'); + queryClient.invalidateQueries({ queryKey: ['sizes'] }); }, []); // Update the size @@ -38,7 +38,7 @@ export function useTaskSizes() { datas: data, bearer_token: authToken }); - queryClient.invalidateQueries('sizes'); + queryClient.invalidateQueries({ queryKey: ['sizes'] }); }, []); // Create the size @@ -49,7 +49,7 @@ export function useTaskSizes() { datas: { ...data, organizationId, organizationTeamId: activeTeamId }, bearer_token: authToken }); - queryClient.invalidateQueries('sizes'); + queryClient.invalidateQueries({ queryKey: ['sizes'] }); }, []); useEffect(() => { diff --git a/apps/mobile/app/services/hooks/features/useTaskStatus.ts b/apps/mobile/app/services/hooks/features/useTaskStatus.ts index aeece99a7..50674c936 100644 --- a/apps/mobile/app/services/hooks/features/useTaskStatus.ts +++ b/apps/mobile/app/services/hooks/features/useTaskStatus.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { useQueryClient } from 'react-query'; +import { useQueryClient } from '@tanstack/react-query'; import { useStores } from '../../../models'; import useFetchAllStatuses from '../../client/queries/task/task-status'; import { @@ -32,7 +32,7 @@ export function useTaskStatus() { tenantId, bearer_token: authToken }); - queryClient.invalidateQueries('statuses'); + queryClient.invalidateQueries({ queryKey: ['statuses'] }); }, []); // Update the status @@ -44,7 +44,7 @@ export function useTaskStatus() { datas: data, bearer_token: authToken }); - queryClient.invalidateQueries('statuses'); + queryClient.invalidateQueries({ queryKey: ['statuses'] }); }, []); // Create the status @@ -55,7 +55,7 @@ export function useTaskStatus() { datas: { ...data, organizationId, organizationTeamId: activeTeamId }, bearer_token: authToken }); - queryClient.invalidateQueries('statuses'); + queryClient.invalidateQueries({ queryKey: ['statuses'] }); }, []); useEffect(() => { diff --git a/apps/mobile/app/services/hooks/features/useTaskVersion.ts b/apps/mobile/app/services/hooks/features/useTaskVersion.ts index d3a53eb6d..f5492ecc6 100644 --- a/apps/mobile/app/services/hooks/features/useTaskVersion.ts +++ b/apps/mobile/app/services/hooks/features/useTaskVersion.ts @@ -1,50 +1,50 @@ -import { useQueryClient } from "react-query" +import { useQueryClient } from '@tanstack/react-query'; import { createVersionRequest, deleteTaskVersionRequest, - editTaskVersionRequest, -} from "../../client/requests/task-version" -import { ITaskVersionCreate, ITaskVersionItemList } from "../../interfaces/ITaskVersion" -import { useStores } from "../../../models" -import { useCallback, useEffect, useState } from "react" -import useFetchAllVersions from "../../client/queries/task/task-version" + editTaskVersionRequest +} from '../../client/requests/task-version'; +import { ITaskVersionCreate, ITaskVersionItemList } from '../../interfaces/ITaskVersion'; +import { useStores } from '../../../models'; +import { useCallback, useEffect, useState } from 'react'; +import useFetchAllVersions from '../../client/queries/task/task-version'; export function useTaskVersion() { - const queryClient = useQueryClient() + const queryClient = useQueryClient(); const { authenticationStore: { authToken, tenantId, organizationId }, - teamStore: { activeTeamId }, - } = useStores() + teamStore: { activeTeamId } + } = useStores(); - const [taskVersionList, setTaskVersionList] = useState([]) + const [taskVersionList, setTaskVersionList] = useState([]); const { data: versions, isLoading, isSuccess, - isRefetching, - } = useFetchAllVersions({ tenantId, organizationId, activeTeamId, authToken }) + isRefetching + } = useFetchAllVersions({ tenantId, organizationId, activeTeamId, authToken }); const createTaskVersion = useCallback( async (data: ITaskVersionCreate) => { await createVersionRequest( { ...data, organizationId, organizationTeamId: activeTeamId }, authToken, - tenantId, - ) - queryClient.invalidateQueries("versions") + tenantId + ); + queryClient.invalidateQueries({ queryKey: ['versions'] }); }, - [authToken, tenantId, queryClient], - ) + [authToken, tenantId, queryClient] + ); const deleteTaskVersion = useCallback( async (id: string) => { - await deleteTaskVersionRequest({ bearer_token: authToken, tenantId, id }) + await deleteTaskVersionRequest({ bearer_token: authToken, tenantId, id }); - queryClient.invalidateQueries("versions") + queryClient.invalidateQueries({ queryKey: ['versions'] }); }, - [authToken, tenantId, queryClient], - ) + [authToken, tenantId, queryClient] + ); const updateTaskVersion = useCallback( async (id: string, data: ITaskVersionCreate) => { @@ -52,21 +52,21 @@ export function useTaskVersion() { id, datas: { ...data, organizationId, organizationTeamId: activeTeamId }, bearer_token: authToken, - tenantId, - }) - queryClient.invalidateQueries("versions") + tenantId + }); + queryClient.invalidateQueries({ queryKey: ['versions'] }); }, - [authToken, tenantId, queryClient], - ) + [authToken, tenantId, queryClient] + ); useEffect(() => { if (isSuccess) { if (versions) { // @ts-ignore - setTaskVersionList(versions?.items || []) + setTaskVersionList(versions?.items || []); } } - }, [isLoading, isRefetching]) + }, [isLoading, isRefetching]); return { createTaskVersion, @@ -74,6 +74,6 @@ export function useTaskVersion() { updateTaskVersion, taskVersionList, versions, - isLoading, - } + isLoading + }; } diff --git a/apps/mobile/app/services/interfaces/IEmployee.ts b/apps/mobile/app/services/interfaces/IEmployee.ts index d8837ee12..e7dc258fd 100644 --- a/apps/mobile/app/services/interfaces/IEmployee.ts +++ b/apps/mobile/app/services/interfaces/IEmployee.ts @@ -14,6 +14,7 @@ export interface IEmployee { startedWorkOn: any; endWork: any; payPeriod: string; + isTrackingTime?: boolean; billRateValue: number; billRateCurrency: string; reWeeklyLimit: number; diff --git a/apps/mobile/app/services/interfaces/IOrganizationTeam.ts b/apps/mobile/app/services/interfaces/IOrganizationTeam.ts index 4bcc9e04e..ee8627666 100644 --- a/apps/mobile/app/services/interfaces/IOrganizationTeam.ts +++ b/apps/mobile/app/services/interfaces/IOrganizationTeam.ts @@ -11,6 +11,7 @@ export interface IOrganizationTeamCreate { tags?: any[]; organizationId: string; tenantId: string; + shareProfileView?: boolean; public?: boolean; imageId?: string | null; image?: IImageAssets | null; @@ -30,6 +31,7 @@ export interface IOrganizationTeam { members: any[]; tags: any[]; id: string; + shareProfileView?: boolean; createdAt: string; updatedAt: string; imageId?: string | null; @@ -48,6 +50,7 @@ export interface IOrganizationTeamList { members: OT_Member[]; managerIds?: string[]; memberIds?: string[]; + shareProfileView?: boolean; public?: boolean; createdById: string; createdBy: IUser; diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 4bff881a5..e69b39acd 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -54,6 +54,7 @@ "@react-navigation/native-stack": "^6.9.12", "@react-navigation/stack": "~6.3.16", "@sentry/react-native": "4.15.2", + "@tanstack/react-query": "^5.36.0", "@types/react-dom": "~18.0.10", "apisauce": "3.0.0", "axios": "^1.6.0", @@ -105,7 +106,6 @@ "react-native-tab-view": "^3.5.2", "react-native-vector-icons": "^9.2.0", "react-native-webview": "11.26.0", - "react-query": "^3.39.3", "reactotron-mst": "3.1.4", "reactotron-react-js": "^3.3.7", "reactotron-react-native": "5.0.3", diff --git a/apps/mobile/yarn.lock b/apps/mobile/yarn.lock index 3963b6634..f00ac6a71 100644 --- a/apps/mobile/yarn.lock +++ b/apps/mobile/yarn.lock @@ -1152,7 +1152,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.8.4": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.4.tgz#36fa1d2b36db873d25ec631dcc4923fdc1cf2e2e" integrity sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg== @@ -2669,6 +2669,18 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@tanstack/query-core@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.36.0.tgz#905bd05b6a73e58d70d95912d84e979ed865ab6a" + integrity sha512-B5BD3pg/mztDR36i77hGcyySKKeYrbM5mnogOROTBi1SUml5ByRK7PGUUl16vvubvQC+mSnqziFG/VIy/DE3FQ== + +"@tanstack/react-query@^5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.36.0.tgz#680cb1490d8b823ec7185e1a97065241cda2ea67" + integrity sha512-BATvtM0rohwg7pRHUnxgeDiwLWRGZ8OM/4y8LImHVpecQWoH6Uhytu3Z8YV6V7hQ1sMQBFcUrGE1/e4MxR6YiA== + dependencies: + "@tanstack/query-core" "5.36.0" + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -4014,11 +4026,11 @@ axios@^0.27.2: form-data "^4.0.0" axios@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + version "1.6.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -4266,7 +4278,7 @@ better-opn@~3.0.2: dependencies: open "^8.0.4" -big-integer@1.6.x, big-integer@^1.6.16: +big-integer@1.6.x: version "1.6.52" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== @@ -4410,20 +4422,6 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -broadcast-channel@^3.4.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" - integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== - dependencies: - "@babel/runtime" "^7.7.2" - detect-node "^2.1.0" - js-sha3 "0.8.0" - microseconds "0.2.0" - nano-time "1.0.0" - oblivious-set "1.0.0" - rimraf "3.0.2" - unload "2.2.0" - browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -5713,7 +5711,7 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -detect-node@^2.0.4, detect-node@^2.1.0: +detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== @@ -7162,7 +7160,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0, follow-redirects@^1.4.1: +follow-redirects@^1.0.0, follow-redirects@^1.14.9, follow-redirects@^1.15.6, follow-redirects@^1.4.1: version "1.15.6" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== @@ -9178,11 +9176,6 @@ js-queue@2.0.2: dependencies: easy-stack "^1.0.1" -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -9710,14 +9703,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -match-sorter@^6.0.2: - version "6.3.1" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" - integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== - dependencies: - "@babel/runtime" "^7.12.5" - remove-accents "0.4.2" - md5-file@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" @@ -10395,11 +10380,6 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -microseconds@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" - integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== - mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -10716,13 +10696,6 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== -nano-time@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" - integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== - dependencies: - big-integer "^1.6.16" - nanoid@3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" @@ -11110,11 +11083,6 @@ object.values@^1.1.6: define-properties "^1.2.0" es-abstract "^1.22.1" -oblivious-set@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" - integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== - obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -12575,15 +12543,6 @@ react-native@0.71.14: whatwg-fetch "^3.0.0" ws "^6.2.2" -react-query@^3.39.3: - version "3.39.3" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" - integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== - dependencies: - "@babel/runtime" "^7.5.5" - broadcast-channel "^3.4.1" - match-sorter "^6.0.2" - react-redux@^5.0.2: version "5.1.2" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.2.tgz#b19cf9e21d694422727bf798e934a916c4080f57" @@ -12885,11 +12844,6 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== -remove-accents@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" - integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== - remove-trailing-slash@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz#be2285a59f39c74d1bce4f825950061915e3780d" @@ -13082,13 +13036,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@3.0.2, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -13096,6 +13043,13 @@ rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -14810,14 +14764,6 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unload@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" - integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== - dependencies: - "@babel/runtime" "^7.6.2" - detect-node "^2.0.4" - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" diff --git a/apps/server-web/.editorconfig b/apps/server-web/.editorconfig new file mode 100644 index 000000000..4a7ea3036 --- /dev/null +++ b/apps/server-web/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/apps/server-web/.erb/configs/.eslintrc b/apps/server-web/.erb/configs/.eslintrc new file mode 100644 index 000000000..89d242ba7 --- /dev/null +++ b/apps/server-web/.erb/configs/.eslintrc @@ -0,0 +1,7 @@ +{ + "rules": { + "no-console": "off", + "global-require": "off", + "import/no-dynamic-require": "off" + } +} diff --git a/apps/server-web/.erb/configs/webpack.config.base.ts b/apps/server-web/.erb/configs/webpack.config.base.ts new file mode 100644 index 000000000..0ef00445a --- /dev/null +++ b/apps/server-web/.erb/configs/webpack.config.base.ts @@ -0,0 +1,59 @@ +/** + * Base webpack config used across other specific configs + */ + +import webpack from 'webpack'; +import TsconfigPathsPlugins from 'tsconfig-paths-webpack-plugin'; +import webpackPaths from './webpack.paths'; +import { dependencies as externals } from '../../release/app/package.json'; + +const configuration: webpack.Configuration = { + externals: [...Object.keys(externals || {})], + + stats: 'errors-only', + + module: { + rules: [ + { + test: /\.[jt]sx?$/, + exclude: /node_modules/, + use: { + loader: 'ts-loader', + options: { + // Remove this line to enable type checking in webpack builds + transpileOnly: true, + compilerOptions: { + module: 'esnext', + }, + }, + }, + }, + ], + }, + + output: { + path: webpackPaths.srcPath, + // https://github.com/webpack/webpack/issues/1114 + library: { + type: 'commonjs2', + }, + }, + + /** + * Determine the array of extensions that should be used to resolve modules. + */ + resolve: { + extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'], + modules: [webpackPaths.srcPath, 'node_modules'], + // There is no need to add aliases here, the paths in tsconfig get mirrored + plugins: [new TsconfigPathsPlugins()], + }, + + plugins: [ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + }), + ], +}; + +export default configuration; diff --git a/apps/server-web/.erb/configs/webpack.config.eslint.ts b/apps/server-web/.erb/configs/webpack.config.eslint.ts new file mode 100644 index 000000000..35a631b7c --- /dev/null +++ b/apps/server-web/.erb/configs/webpack.config.eslint.ts @@ -0,0 +1,3 @@ +/* eslint import/no-unresolved: off, import/no-self-import: off */ + +module.exports = require('./webpack.config.renderer.dev').default; diff --git a/apps/server-web/.erb/configs/webpack.config.main.prod.ts b/apps/server-web/.erb/configs/webpack.config.main.prod.ts new file mode 100644 index 000000000..472748219 --- /dev/null +++ b/apps/server-web/.erb/configs/webpack.config.main.prod.ts @@ -0,0 +1,83 @@ +/** + * Webpack config for production electron main process + */ + +import path from 'path'; +import webpack from 'webpack'; +import { merge } from 'webpack-merge'; +import TerserPlugin from 'terser-webpack-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; +import deleteSourceMaps from '../scripts/delete-source-maps'; + +checkNodeEnv('production'); +deleteSourceMaps(); + +const configuration: webpack.Configuration = { + devtool: 'source-map', + + mode: 'production', + + target: 'electron-main', + + entry: { + main: path.join(webpackPaths.srcMainPath, 'main.ts'), + preload: path.join(webpackPaths.srcMainPath, 'preload.ts'), + }, + + output: { + path: webpackPaths.distMainPath, + filename: '[name].js', + library: { + type: 'umd', + }, + }, + + optimization: { + minimizer: [ + new TerserPlugin({ + parallel: true, + }), + ], + }, + + plugins: [ + new BundleAnalyzerPlugin({ + analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', + analyzerPort: 8888, + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + DEBUG_PROD: false, + START_MINIMIZED: false, + }), + + new webpack.DefinePlugin({ + 'process.type': '"browser"', + }), + ], + + /** + * Disables webpack processing of __dirname and __filename. + * If you run the bundle in node.js it falls back to these values of node.js. + * https://github.com/webpack/webpack/issues/2010 + */ + node: { + __dirname: false, + __filename: false, + }, +}; + +export default merge(baseConfig, configuration); diff --git a/apps/server-web/.erb/configs/webpack.config.preload.dev.ts b/apps/server-web/.erb/configs/webpack.config.preload.dev.ts new file mode 100644 index 000000000..d6679e63e --- /dev/null +++ b/apps/server-web/.erb/configs/webpack.config.preload.dev.ts @@ -0,0 +1,71 @@ +import path from 'path'; +import webpack from 'webpack'; +import { merge } from 'webpack-merge'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; + +// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's +// at the dev webpack config is not accidentally run in a production environment +if (process.env.NODE_ENV === 'production') { + checkNodeEnv('development'); +} + +const configuration: webpack.Configuration = { + devtool: 'inline-source-map', + + mode: 'development', + + target: 'electron-preload', + + entry: path.join(webpackPaths.srcMainPath, 'preload.ts'), + + output: { + path: webpackPaths.dllPath, + filename: 'preload.js', + library: { + type: 'umd', + }, + }, + + plugins: [ + new BundleAnalyzerPlugin({ + analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + * + * By default, use 'development' as NODE_ENV. This can be overriden with + * 'staging', for example, by changing the ENV variables in the npm scripts + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + }), + ], + + /** + * Disables webpack processing of __dirname and __filename. + * If you run the bundle in node.js it falls back to these values of node.js. + * https://github.com/webpack/webpack/issues/2010 + */ + node: { + __dirname: false, + __filename: false, + }, + + watch: true, +}; + +export default merge(baseConfig, configuration); diff --git a/apps/server-web/.erb/configs/webpack.config.renderer.dev.dll.ts b/apps/server-web/.erb/configs/webpack.config.renderer.dev.dll.ts new file mode 100644 index 000000000..614b90f04 --- /dev/null +++ b/apps/server-web/.erb/configs/webpack.config.renderer.dev.dll.ts @@ -0,0 +1,77 @@ +/** + * Builds the DLL for development electron renderer process + */ + +import webpack from 'webpack'; +import path from 'path'; +import { merge } from 'webpack-merge'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import { dependencies } from '../../package.json'; +import checkNodeEnv from '../scripts/check-node-env'; + +checkNodeEnv('development'); + +const dist = webpackPaths.dllPath; + +const configuration: webpack.Configuration = { + context: webpackPaths.rootPath, + + devtool: 'eval', + + mode: 'development', + + target: 'electron-renderer', + + externals: ['fsevents', 'crypto-browserify'], + + /** + * Use `module` from `webpack.config.renderer.dev.js` + */ + module: require('./webpack.config.renderer.dev').default.module, + + entry: { + renderer: Object.keys(dependencies || {}), + }, + + output: { + path: dist, + filename: '[name].dev.dll.js', + library: { + name: 'renderer', + type: 'var', + }, + }, + + plugins: [ + new webpack.DllPlugin({ + path: path.join(dist, '[name].json'), + name: '[name]', + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + options: { + context: webpackPaths.srcPath, + output: { + path: webpackPaths.dllPath, + }, + }, + }), + ], +}; + +export default merge(baseConfig, configuration); diff --git a/apps/server-web/.erb/configs/webpack.config.renderer.dev.ts b/apps/server-web/.erb/configs/webpack.config.renderer.dev.ts new file mode 100644 index 000000000..a6ca87e90 --- /dev/null +++ b/apps/server-web/.erb/configs/webpack.config.renderer.dev.ts @@ -0,0 +1,213 @@ +import 'webpack-dev-server'; +import path from 'path'; +import fs from 'fs'; +import webpack from 'webpack'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import chalk from 'chalk'; +import { merge } from 'webpack-merge'; +import { execSync, spawn } from 'child_process'; +import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; + +// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's +// at the dev webpack config is not accidentally run in a production environment +if (process.env.NODE_ENV === 'production') { + checkNodeEnv('development'); +} + +const port = process.env.PORT || 1212; +const manifest = path.resolve(webpackPaths.dllPath, 'renderer.json'); +const skipDLLs = + module.parent?.filename.includes('webpack.config.renderer.dev.dll') || + module.parent?.filename.includes('webpack.config.eslint'); + +/** + * Warn if the DLL is not built + */ +if ( + !skipDLLs && + !(fs.existsSync(webpackPaths.dllPath) && fs.existsSync(manifest)) +) { + console.log( + chalk.black.bgYellow.bold( + 'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"', + ), + ); + execSync('npm run postinstall'); +} + +const configuration: webpack.Configuration = { + devtool: 'inline-source-map', + + mode: 'development', + + target: ['web', 'electron-renderer'], + + entry: [ + `webpack-dev-server/client?http://localhost:${port}/dist`, + 'webpack/hot/only-dev-server', + path.join(webpackPaths.srcRendererPath, 'index.tsx'), + ], + + output: { + path: webpackPaths.distRendererPath, + publicPath: '/', + filename: 'renderer.dev.js', + library: { + type: 'umd', + }, + }, + + module: { + rules: [ + { + test: /\.s?(c|a)ss$/, + use: [ + 'style-loader', + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + }, + }, + 'sass-loader', + ], + include: /\.module\.s?(c|a)ss$/, + }, + { + test: /\.s?css$/, + use: ['style-loader', 'css-loader', 'sass-loader'], + exclude: /\.module\.s?(c|a)ss$/, + }, + // Fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + }, + // Images + { + test: /\.(png|jpg|jpeg|gif)$/i, + type: 'asset/resource', + }, + // SVG + { + test: /\.svg$/, + use: [ + { + loader: '@svgr/webpack', + options: { + prettier: false, + svgo: false, + svgoConfig: { + plugins: [{ removeViewBox: false }], + }, + titleProp: true, + ref: true, + }, + }, + 'file-loader', + ], + }, + ], + }, + plugins: [ + ...(skipDLLs + ? [] + : [ + new webpack.DllReferencePlugin({ + context: webpackPaths.dllPath, + manifest: require(manifest), + sourceType: 'var', + }), + ]), + + new webpack.NoEmitOnErrorsPlugin(), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + * + * By default, use 'development' as NODE_ENV. This can be overriden with + * 'staging', for example, by changing the ENV variables in the npm scripts + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + }), + + new ReactRefreshWebpackPlugin(), + + new HtmlWebpackPlugin({ + filename: path.join('index.html'), + template: path.join(webpackPaths.srcRendererPath, 'index.ejs'), + minify: { + collapseWhitespace: true, + removeAttributeQuotes: true, + removeComments: true, + }, + isBrowser: false, + env: process.env.NODE_ENV, + isDevelopment: process.env.NODE_ENV !== 'production', + nodeModules: webpackPaths.appNodeModulesPath, + }), + ], + + node: { + __dirname: false, + __filename: false, + }, + + devServer: { + port, + compress: true, + hot: true, + headers: { 'Access-Control-Allow-Origin': '*' }, + static: { + publicPath: '/', + }, + historyApiFallback: { + verbose: true, + }, + setupMiddlewares(middlewares) { + console.log('Starting preload.js builder...'); + const preloadProcess = spawn('npm', ['run', 'start:preload'], { + shell: true, + stdio: 'inherit', + }) + .on('close', (code: number) => process.exit(code!)) + .on('error', (spawnError) => console.error(spawnError)); + + console.log('Starting Main Process...'); + let args = ['run', 'start:main']; + if (process.env.MAIN_ARGS) { + args = args.concat( + ['--', ...process.env.MAIN_ARGS.matchAll(/"[^"]+"|[^\s"]+/g)].flat(), + ); + } + spawn('npm', args, { + shell: true, + stdio: 'inherit', + }) + .on('close', (code: number) => { + preloadProcess.kill(); + process.exit(code!); + }) + .on('error', (spawnError) => console.error(spawnError)); + return middlewares; + }, + }, +}; + +export default merge(baseConfig, configuration); diff --git a/apps/server-web/.erb/configs/webpack.config.renderer.prod.ts b/apps/server-web/.erb/configs/webpack.config.renderer.prod.ts new file mode 100644 index 000000000..3cebf30d4 --- /dev/null +++ b/apps/server-web/.erb/configs/webpack.config.renderer.prod.ts @@ -0,0 +1,141 @@ +/** + * Build config for electron renderer process + */ + +import path from 'path'; +import webpack from 'webpack'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; +import { merge } from 'webpack-merge'; +import TerserPlugin from 'terser-webpack-plugin'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; +import deleteSourceMaps from '../scripts/delete-source-maps'; + +checkNodeEnv('production'); +deleteSourceMaps(); + +const configuration: webpack.Configuration = { + devtool: 'source-map', + + mode: 'production', + + target: ['web', 'electron-renderer'], + + entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')], + + output: { + path: webpackPaths.distRendererPath, + publicPath: './', + filename: 'renderer.js', + library: { + type: 'umd', + }, + }, + + module: { + rules: [ + { + test: /\.s?(a|c)ss$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + }, + }, + 'sass-loader', + ], + include: /\.module\.s?(c|a)ss$/, + }, + { + test: /\.s?(a|c)ss$/, + use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'], + exclude: /\.module\.s?(c|a)ss$/, + }, + // Fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + }, + // Images + { + test: /\.(png|jpg|jpeg|gif)$/i, + type: 'asset/resource', + }, + // SVG + { + test: /\.svg$/, + use: [ + { + loader: '@svgr/webpack', + options: { + prettier: false, + svgo: false, + svgoConfig: { + plugins: [{ removeViewBox: false }], + }, + titleProp: true, + ref: true, + }, + }, + 'file-loader', + ], + }, + ], + }, + + optimization: { + minimize: true, + minimizer: [new TerserPlugin(), new CssMinimizerPlugin()], + }, + + plugins: [ + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + DEBUG_PROD: false, + }), + + new MiniCssExtractPlugin({ + filename: 'style.css', + }), + + new BundleAnalyzerPlugin({ + analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', + analyzerPort: 8889, + }), + + new HtmlWebpackPlugin({ + filename: 'index.html', + template: path.join(webpackPaths.srcRendererPath, 'index.ejs'), + minify: { + collapseWhitespace: true, + removeAttributeQuotes: true, + removeComments: true, + }, + isBrowser: false, + isDevelopment: false, + }), + + new webpack.DefinePlugin({ + 'process.type': '"renderer"', + }), + ], +}; + +export default merge(baseConfig, configuration); diff --git a/apps/server-web/.erb/configs/webpack.paths.ts b/apps/server-web/.erb/configs/webpack.paths.ts new file mode 100644 index 000000000..e5ba57343 --- /dev/null +++ b/apps/server-web/.erb/configs/webpack.paths.ts @@ -0,0 +1,38 @@ +const path = require('path'); + +const rootPath = path.join(__dirname, '../..'); + +const dllPath = path.join(__dirname, '../dll'); + +const srcPath = path.join(rootPath, 'src'); +const srcMainPath = path.join(srcPath, 'main'); +const srcRendererPath = path.join(srcPath, 'renderer'); + +const releasePath = path.join(rootPath, 'release'); +const appPath = path.join(releasePath, 'app'); +const appPackagePath = path.join(appPath, 'package.json'); +const appNodeModulesPath = path.join(appPath, 'node_modules'); +const srcNodeModulesPath = path.join(srcPath, 'node_modules'); + +const distPath = path.join(appPath, 'dist'); +const distMainPath = path.join(distPath, 'main'); +const distRendererPath = path.join(distPath, 'renderer'); + +const buildPath = path.join(releasePath, 'build'); + +export default { + rootPath, + dllPath, + srcPath, + srcMainPath, + srcRendererPath, + releasePath, + appPath, + appPackagePath, + appNodeModulesPath, + srcNodeModulesPath, + distPath, + distMainPath, + distRendererPath, + buildPath, +}; diff --git a/apps/server-web/.erb/img/erb-banner.svg b/apps/server-web/.erb/img/erb-banner.svg new file mode 100644 index 000000000..f7ce67079 --- /dev/null +++ b/apps/server-web/.erb/img/erb-banner.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/server-web/.erb/img/erb-logo.png b/apps/server-web/.erb/img/erb-logo.png new file mode 100644 index 000000000..97a5661ae Binary files /dev/null and b/apps/server-web/.erb/img/erb-logo.png differ diff --git a/apps/server-web/.erb/img/palette-sponsor-banner.svg b/apps/server-web/.erb/img/palette-sponsor-banner.svg new file mode 100644 index 000000000..c1abcfd27 --- /dev/null +++ b/apps/server-web/.erb/img/palette-sponsor-banner.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/server-web/.erb/mocks/fileMock.js b/apps/server-web/.erb/mocks/fileMock.js new file mode 100644 index 000000000..602eb23ee --- /dev/null +++ b/apps/server-web/.erb/mocks/fileMock.js @@ -0,0 +1 @@ +export default 'test-file-stub'; diff --git a/apps/server-web/.erb/scripts/.eslintrc b/apps/server-web/.erb/scripts/.eslintrc new file mode 100644 index 000000000..35dc618d6 --- /dev/null +++ b/apps/server-web/.erb/scripts/.eslintrc @@ -0,0 +1,8 @@ +{ + "rules": { + "no-console": "off", + "global-require": "off", + "import/no-dynamic-require": "off", + "import/no-extraneous-dependencies": "off" + } +} diff --git a/apps/server-web/.erb/scripts/check-build-exists.ts b/apps/server-web/.erb/scripts/check-build-exists.ts new file mode 100644 index 000000000..649929572 --- /dev/null +++ b/apps/server-web/.erb/scripts/check-build-exists.ts @@ -0,0 +1,24 @@ +// Check if the renderer and main bundles are built +import path from 'path'; +import chalk from 'chalk'; +import fs from 'fs'; +import webpackPaths from '../configs/webpack.paths'; + +const mainPath = path.join(webpackPaths.distMainPath, 'main.js'); +const rendererPath = path.join(webpackPaths.distRendererPath, 'renderer.js'); + +if (!fs.existsSync(mainPath)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + 'The main process is not built yet. Build it by running "npm run build:main"', + ), + ); +} + +if (!fs.existsSync(rendererPath)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + 'The renderer process is not built yet. Build it by running "npm run build:renderer"', + ), + ); +} diff --git a/apps/server-web/.erb/scripts/check-native-dep.js b/apps/server-web/.erb/scripts/check-native-dep.js new file mode 100644 index 000000000..628698162 --- /dev/null +++ b/apps/server-web/.erb/scripts/check-native-dep.js @@ -0,0 +1,54 @@ +import fs from 'fs'; +import chalk from 'chalk'; +import { execSync } from 'child_process'; +import { dependencies } from '../../package.json'; + +if (dependencies) { + const dependenciesKeys = Object.keys(dependencies); + const nativeDeps = fs + .readdirSync('node_modules') + .filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`)); + if (nativeDeps.length === 0) { + process.exit(0); + } + try { + // Find the reason for why the dependency is installed. If it is installed + // because of a devDependency then that is okay. Warn when it is installed + // because of a dependency + const { dependencies: dependenciesObject } = JSON.parse( + execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString(), + ); + const rootDependencies = Object.keys(dependenciesObject); + const filteredRootDependencies = rootDependencies.filter((rootDependency) => + dependenciesKeys.includes(rootDependency), + ); + if (filteredRootDependencies.length > 0) { + const plural = filteredRootDependencies.length > 1; + console.log(` + ${chalk.whiteBright.bgYellow.bold( + 'Webpack does not work with native dependencies.', + )} +${chalk.bold(filteredRootDependencies.join(', '))} ${ + plural ? 'are native dependencies' : 'is a native dependency' + } and should be installed inside of the "./release/app" folder. + First, uninstall the packages from "./package.json": +${chalk.whiteBright.bgGreen.bold('npm uninstall your-package')} + ${chalk.bold( + 'Then, instead of installing the package to the root "./package.json":', + )} +${chalk.whiteBright.bgRed.bold('npm install your-package')} + ${chalk.bold('Install the package to "./release/app/package.json"')} +${chalk.whiteBright.bgGreen.bold( + 'cd ./release/app && npm install your-package', +)} + Read more about native dependencies at: +${chalk.bold( + 'https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure', +)} + `); + process.exit(1); + } + } catch (e) { + console.log('Native dependencies could not be checked'); + } +} diff --git a/apps/server-web/.erb/scripts/check-node-env.js b/apps/server-web/.erb/scripts/check-node-env.js new file mode 100644 index 000000000..6bf674baa --- /dev/null +++ b/apps/server-web/.erb/scripts/check-node-env.js @@ -0,0 +1,16 @@ +import chalk from 'chalk'; + +export default function checkNodeEnv(expectedEnv) { + if (!expectedEnv) { + throw new Error('"expectedEnv" not set'); + } + + if (process.env.NODE_ENV !== expectedEnv) { + console.log( + chalk.whiteBright.bgRed.bold( + `"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config`, + ), + ); + process.exit(2); + } +} diff --git a/apps/server-web/.erb/scripts/check-port-in-use.js b/apps/server-web/.erb/scripts/check-port-in-use.js new file mode 100644 index 000000000..398cbc179 --- /dev/null +++ b/apps/server-web/.erb/scripts/check-port-in-use.js @@ -0,0 +1,16 @@ +import chalk from 'chalk'; +import detectPort from 'detect-port'; + +const port = process.env.PORT || '1212'; + +detectPort(port, (_err, availablePort) => { + if (port !== String(availablePort)) { + throw new Error( + chalk.whiteBright.bgRed.bold( + `Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 npm start`, + ), + ); + } else { + process.exit(0); + } +}); diff --git a/apps/server-web/.erb/scripts/clean.js b/apps/server-web/.erb/scripts/clean.js new file mode 100644 index 000000000..2c7b3aeab --- /dev/null +++ b/apps/server-web/.erb/scripts/clean.js @@ -0,0 +1,13 @@ +import { rimrafSync } from 'rimraf'; +import fs from 'fs'; +import webpackPaths from '../configs/webpack.paths'; + +const foldersToRemove = [ + webpackPaths.distPath, + webpackPaths.buildPath, + webpackPaths.dllPath, +]; + +foldersToRemove.forEach((folder) => { + if (fs.existsSync(folder)) rimrafSync(folder); +}); diff --git a/apps/server-web/.erb/scripts/delete-source-maps.js b/apps/server-web/.erb/scripts/delete-source-maps.js new file mode 100644 index 000000000..d14519cd0 --- /dev/null +++ b/apps/server-web/.erb/scripts/delete-source-maps.js @@ -0,0 +1,15 @@ +import fs from 'fs'; +import path from 'path'; +import { rimrafSync } from 'rimraf'; +import webpackPaths from '../configs/webpack.paths'; + +export default function deleteSourceMaps() { + if (fs.existsSync(webpackPaths.distMainPath)) + rimrafSync(path.join(webpackPaths.distMainPath, '*.js.map'), { + glob: true, + }); + if (fs.existsSync(webpackPaths.distRendererPath)) + rimrafSync(path.join(webpackPaths.distRendererPath, '*.js.map'), { + glob: true, + }); +} diff --git a/apps/server-web/.erb/scripts/electron-rebuild.js b/apps/server-web/.erb/scripts/electron-rebuild.js new file mode 100644 index 000000000..0bea32793 --- /dev/null +++ b/apps/server-web/.erb/scripts/electron-rebuild.js @@ -0,0 +1,20 @@ +import { execSync } from 'child_process'; +import fs from 'fs'; +import { dependencies } from '../../release/app/package.json'; +import webpackPaths from '../configs/webpack.paths'; + +if ( + Object.keys(dependencies || {}).length > 0 && + fs.existsSync(webpackPaths.appNodeModulesPath) +) { + const electronRebuildCmd = + '../../node_modules/.bin/electron-rebuild --force --types prod,dev,optional --module-dir .'; + const cmd = + process.platform === 'win32' + ? electronRebuildCmd.replace(/\//g, '\\') + : electronRebuildCmd; + execSync(cmd, { + cwd: webpackPaths.appPath, + stdio: 'inherit', + }); +} diff --git a/apps/server-web/.erb/scripts/link-modules.ts b/apps/server-web/.erb/scripts/link-modules.ts new file mode 100644 index 000000000..6cc31e666 --- /dev/null +++ b/apps/server-web/.erb/scripts/link-modules.ts @@ -0,0 +1,9 @@ +import fs from 'fs'; +import webpackPaths from '../configs/webpack.paths'; + +const { srcNodeModulesPath } = webpackPaths; +const { appNodeModulesPath } = webpackPaths; + +if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) { + fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction'); +} diff --git a/apps/server-web/.erb/scripts/notarize.js b/apps/server-web/.erb/scripts/notarize.js new file mode 100644 index 000000000..097ff35b7 --- /dev/null +++ b/apps/server-web/.erb/scripts/notarize.js @@ -0,0 +1,32 @@ +const { notarize } = require('@electron/notarize'); +const { build } = require('../../package.json'); + +exports.default = async function notarizeMacos(context) { + const { electronPlatformName, appOutDir } = context; + if (electronPlatformName !== 'darwin') { + return; + } + + if (process.env.CI !== 'true') { + console.warn('Skipping notarizing step. Packaging is not running in CI'); + return; + } + + if ( + !('APPLE_ID' in process.env && 'APPLE_APP_SPECIFIC_PASSWORD' in process.env) + ) { + console.warn( + 'Skipping notarizing step. APPLE_ID and APPLE_APP_SPECIFIC_PASSWORD env variables must be set', + ); + return; + } + + const appName = context.packager.appInfo.productFilename; + + await notarize({ + appBundleId: build.appId, + appPath: `${appOutDir}/${appName}.app`, + appleId: process.env.APPLE_ID, + appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD, + }); +}; diff --git a/apps/server-web/.eslintignore b/apps/server-web/.eslintignore new file mode 100644 index 000000000..7cad53588 --- /dev/null +++ b/apps/server-web/.eslintignore @@ -0,0 +1,33 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Coverage directory used by tools like istanbul +coverage +.eslintcache + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +release/app/dist +release/build +.erb/dll + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +# eslint ignores hidden directories by default: +# https://github.com/eslint/eslint/issues/8429 +!.erb diff --git a/apps/server-web/.eslintrc.js b/apps/server-web/.eslintrc.js new file mode 100644 index 000000000..85a1aa65f --- /dev/null +++ b/apps/server-web/.eslintrc.js @@ -0,0 +1,34 @@ +module.exports = { + extends: 'erb', + plugins: ['@typescript-eslint'], + rules: { + // A temporary hack related to IDE not resolving correct package.json + 'import/no-extraneous-dependencies': 'off', + 'react/react-in-jsx-scope': 'off', + 'react/jsx-filename-extension': 'off', + 'import/extensions': 'off', + 'import/no-unresolved': 'off', + 'import/no-import-module-exports': 'off', + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'error', + }, + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + }, + settings: { + 'import/resolver': { + // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below + node: {}, + webpack: { + config: require.resolve('./.erb/configs/webpack.config.eslint.ts'), + }, + typescript: {}, + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, +}; diff --git a/apps/server-web/.gitattributes b/apps/server-web/.gitattributes new file mode 100644 index 000000000..20570f2f3 --- /dev/null +++ b/apps/server-web/.gitattributes @@ -0,0 +1,12 @@ +* text eol=lf +*.exe binary +*.png binary +*.jpg binary +*.jpeg binary +*.ico binary +*.icns binary +*.eot binary +*.otf binary +*.ttf binary +*.woff binary +*.woff2 binary diff --git a/apps/server-web/.gitignore b/apps/server-web/.gitignore new file mode 100644 index 000000000..93b6f44fd --- /dev/null +++ b/apps/server-web/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Coverage directory used by tools like istanbul +coverage +.eslintcache + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +release/app/dist +release/build +.erb/dll + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts \ No newline at end of file diff --git a/apps/server-web/.vscode/launch.json b/apps/server-web/.vscode/launch.json new file mode 100644 index 000000000..43b848402 --- /dev/null +++ b/apps/server-web/.vscode/launch.json @@ -0,0 +1,40 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Nextron: Main", + "type": "node", + "request": "attach", + "protocol": "inspector", + "port": 9292, + "skipFiles": ["/**"], + "sourceMapPathOverrides": { + "webpack:///./~/*": "${workspaceFolder}/node_modules/*", + "webpack:///./*": "${workspaceFolder}/*", + "webpack:///*": "*" + } + }, + { + "name": "Nextron: Renderer", + "type": "chrome", + "request": "attach", + "port": 5858, + "timeout": 10000, + "urlFilter": "http://localhost:*", + "webRoot": "${workspaceFolder}/app", + "sourceMapPathOverrides": { + "webpack:///./src/*": "${webRoot}/*" + } + } + ], + "compounds": [ + { + "name": "Nextron: All", + "preLaunchTask": "dev", + "configurations": ["Nextron: Main", "Nextron: Renderer"] + } + ] +} diff --git a/apps/server-web/.vscode/tasks.json b/apps/server-web/.vscode/tasks.json new file mode 100644 index 000000000..57290398b --- /dev/null +++ b/apps/server-web/.vscode/tasks.json @@ -0,0 +1,21 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "dev", + "isBackground": true, + "problemMatcher": { + "owner": "custom", + "pattern": { + "regexp": "" + }, + "background": { + "beginsPattern": "started server", + "endsPattern": "Debugger listening on" + } + }, + "label": "dev" + } + ] +} diff --git a/apps/server-web/README.md b/apps/server-web/README.md index 9d0d9808e..782109f1f 100644 --- a/apps/server-web/README.md +++ b/apps/server-web/README.md @@ -1,3 +1,3 @@ # Ever Teams Web Server -Electron-based Desktop App that serve Ever Teams NextJs frontend. +Electron-based Desktop App that serve Ever Teams NextJs frontend. \ No newline at end of file diff --git a/apps/server-web/assets/assets.d.ts b/apps/server-web/assets/assets.d.ts new file mode 100644 index 000000000..251085e97 --- /dev/null +++ b/apps/server-web/assets/assets.d.ts @@ -0,0 +1,35 @@ +type Styles = Record; + +declare module '*.svg' { + import React = require('react'); + + export const ReactComponent: React.FC>; + + const content: string; + export default content; +} + +declare module '*.png' { + const content: string; + export default content; +} + +declare module '*.jpg' { + const content: string; + export default content; +} + +declare module '*.scss' { + const content: Styles; + export default content; +} + +declare module '*.sass' { + const content: Styles; + export default content; +} + +declare module '*.css' { + const content: Styles; + export default content; +} diff --git a/apps/server-web/assets/entitlements.mac.plist b/apps/server-web/assets/entitlements.mac.plist new file mode 100644 index 000000000..dad3e20e6 --- /dev/null +++ b/apps/server-web/assets/entitlements.mac.plist @@ -0,0 +1,10 @@ + + + + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-jit + + + diff --git a/apps/server-web/assets/icon.icns b/apps/server-web/assets/icon.icns new file mode 100644 index 000000000..c2213ce89 Binary files /dev/null and b/apps/server-web/assets/icon.icns differ diff --git a/apps/server-web/assets/icon.ico b/apps/server-web/assets/icon.ico new file mode 100644 index 000000000..98948ea68 Binary files /dev/null and b/apps/server-web/assets/icon.ico differ diff --git a/apps/server-web/assets/icon.png b/apps/server-web/assets/icon.png new file mode 100755 index 000000000..755a6e51d Binary files /dev/null and b/apps/server-web/assets/icon.png differ diff --git a/apps/server-web/assets/icon.svg b/apps/server-web/assets/icon.svg new file mode 100644 index 000000000..b064abf9f --- /dev/null +++ b/apps/server-web/assets/icon.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/server-web/assets/icons/1024x1024.png b/apps/server-web/assets/icons/1024x1024.png new file mode 100755 index 000000000..5940b65a3 Binary files /dev/null and b/apps/server-web/assets/icons/1024x1024.png differ diff --git a/apps/server-web/assets/icons/128x128.png b/apps/server-web/assets/icons/128x128.png new file mode 100755 index 000000000..14e578d24 Binary files /dev/null and b/apps/server-web/assets/icons/128x128.png differ diff --git a/apps/server-web/assets/icons/16x16.png b/apps/server-web/assets/icons/16x16.png new file mode 100755 index 000000000..260a46cb0 Binary files /dev/null and b/apps/server-web/assets/icons/16x16.png differ diff --git a/apps/server-web/assets/icons/24x24.png b/apps/server-web/assets/icons/24x24.png new file mode 100755 index 000000000..56172416c Binary files /dev/null and b/apps/server-web/assets/icons/24x24.png differ diff --git a/apps/server-web/assets/icons/256x256.png b/apps/server-web/assets/icons/256x256.png new file mode 100755 index 000000000..755a6e51d Binary files /dev/null and b/apps/server-web/assets/icons/256x256.png differ diff --git a/apps/server-web/assets/icons/32x32.png b/apps/server-web/assets/icons/32x32.png new file mode 100755 index 000000000..63423dfec Binary files /dev/null and b/apps/server-web/assets/icons/32x32.png differ diff --git a/apps/server-web/assets/icons/48x48.png b/apps/server-web/assets/icons/48x48.png new file mode 100755 index 000000000..74d87a0cf Binary files /dev/null and b/apps/server-web/assets/icons/48x48.png differ diff --git a/apps/server-web/assets/icons/512x512.png b/apps/server-web/assets/icons/512x512.png new file mode 100755 index 000000000..313cd499d Binary files /dev/null and b/apps/server-web/assets/icons/512x512.png differ diff --git a/apps/server-web/assets/icons/64x64.png b/apps/server-web/assets/icons/64x64.png new file mode 100755 index 000000000..6de0ec0e0 Binary files /dev/null and b/apps/server-web/assets/icons/64x64.png differ diff --git a/apps/server-web/assets/icons/96x96.png b/apps/server-web/assets/icons/96x96.png new file mode 100755 index 000000000..8255ab58c Binary files /dev/null and b/apps/server-web/assets/icons/96x96.png differ diff --git a/apps/server-web/electronmon.js b/apps/server-web/electronmon.js new file mode 100644 index 000000000..90b2221d1 --- /dev/null +++ b/apps/server-web/electronmon.js @@ -0,0 +1,5 @@ +require('ts-node').register({ + transpileOnly: true +}); + +require('./src/main/main.ts'); \ No newline at end of file diff --git a/apps/server-web/package.json b/apps/server-web/package.json new file mode 100644 index 000000000..fa95261b3 --- /dev/null +++ b/apps/server-web/package.json @@ -0,0 +1,253 @@ +{ + "name": "@ever-teams/server-web", + "version": "0.1.0", + "description": "Ever Teams Web Server", + "license": "AGPL-3.0", + "homepage": "https://ever.team", + "repository": { + "type": "git", + "url": "https://github.com/ever-co/ever-teams.git" + }, + "bugs": { + "url": "https://github.com/ever-co/ever-teams/issues" + }, + "private": true, + "author": { + "name": "Ever Co. LTD", + "email": "ever@ever.co", + "url": "https://ever.co" + }, + "main": "./src/main/main.ts", + "scripts": { + "build": "concurrently \"npm run build:main\" \"npm run build:renderer\"", + "build:dll": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts", + "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", + "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts", + "postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && npm run build:dll", + "lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx", + "package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never && npm run build:dll", + "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app", + "start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run start:renderer", + "start:main": "cross-env NODE_ENV=development electronmon electronmon.js", + "start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts", + "start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts", + "test": "jest" + }, + "dependencies": { + "electron-debug": "^3.2.0", + "electron-log": "^4.4.8", + "electron-updater": "^6.1.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.16.0", + "electron-store": "^8.1.0" + }, + "devDependencies": { + "electron": "28.1.0", + "electron-builder": "^24.6.4", + "@electron/notarize": "^2.1.0", + "@electron/rebuild": "^3.3.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", + "@teamsupercell/typings-for-css-modules-loader": "^2.5.2", + "@testing-library/jest-dom": "^6.1.3", + "@testing-library/react": "^14.0.0", + "@types/jest": "^29.5.5", + "@types/react-test-renderer": "^18.0.1", + "@types/terser-webpack-plugin": "^5.0.4", + "@types/webpack-bundle-analyzer": "^4.6.0", + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", + "browserslist-config-erb": "^0.0.3", + "chalk": "^4.1.2", + "concurrently": "^8.2.1", + "core-js": "^3.32.2", + "cross-env": "^7.0.3", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^5.0.1", + "detect-port": "^1.5.1", + "electron-devtools-installer": "^3.2.0", + "electronmon": "^2.0.2", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.1.0-0", + "eslint-import-resolver-typescript": "^3.6.0", + "eslint-import-resolver-webpack": "^0.13.7", + "eslint-plugin-compat": "^4.2.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jest": "^27.4.0", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "file-loader": "^6.2.0", + "html-webpack-plugin": "^5.5.3", + "identity-obj-proxy": "^3.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "mini-css-extract-plugin": "^2.7.6", + "prettier": "^3.0.3", + "react-refresh": "^0.14.0", + "react-test-renderer": "^18.2.0", + "rimraf": "^5.0.1", + "sass": "^1.67.0", + "sass-loader": "^13.3.2", + "style-loader": "^3.3.3", + "terser-webpack-plugin": "^5.3.9", + "ts-jest": "^29.1.1", + "ts-loader": "^9.4.4", + "ts-node": "^10.9.1", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "url-loader": "^4.1.1", + "webpack": "^5.88.2", + "webpack-bundle-analyzer": "^4.9.1", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0" + }, + "prettier": { + "singleQuote": true, + "overrides": [ + { + "files": [ + ".prettierrc", + ".eslintrc" + ], + "options": { + "parser": "json" + } + } + ] + }, + "jest": { + "moduleDirectories": [ + "node_modules", + "release/app/node_modules", + "src" + ], + "moduleFileExtensions": [ + "js", + "jsx", + "ts", + "tsx", + "json" + ], + "moduleNameMapper": { + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/.erb/mocks/fileMock.js", + "\\.(css|less|sass|scss)$": "identity-obj-proxy" + }, + "setupFiles": [ + "./.erb/scripts/check-build-exists.ts" + ], + "testEnvironment": "jsdom", + "testEnvironmentOptions": { + "url": "http://localhost/" + }, + "testPathIgnorePatterns": [ + "release/app/dist", + ".erb/dll" + ], + "transform": { + "\\.(ts|tsx|js|jsx)$": "ts-jest" + } + }, + "engines": { + "node": ">=16.0.0", + "yarn": ">=1.13.0" + }, + "build": { + "appId": "co.ever.teamswebserver", + "artifactName": "${name}-${version}.${ext}", + "productName": "Ever Teams Web Server", + "copyright": "Copyright © 2024-Present. Ever Co. LTD", + "dmg": { + "sign": false + }, + "asar": true, + "asarUnpack": "**\\*.{node,dll}", + "files": [ + "dist", + "node_modules", + "package.json" + ], + "afterSign": ".erb/scripts/notarize.js", + "mac": { + "category": "public.app-category.developer-tools", + "target": [ + "zip", + "dmg" + ], + "asarUnpack": "**/*.node", + "artifactName": "${name}-${version}.${ext}", + "type": "distribution", + "hardenedRuntime": true, + "gatekeeperAssess": false, + "entitlements": "assets/entitlements.mac.plist", + "entitlementsInherit": "assets/entitlements.mac.plist" + }, + "dmg": { + "contents": [ + { + "x": 130, + "y": 220 + }, + { + "x": 410, + "y": 220, + "type": "link", + "path": "/Applications" + } + ] + }, + "win": { + "publisherName": "Ever", + "target": [ + { + "target": "nsis", + "arch": [ + "x64" + ] + } + ], + "verifyUpdateCodeSignature": false, + "requestedExecutionLevel": "requireAdministrator" + }, + "linux": { + "target": [ + "AppImage", + "deb", + "tar.gz" + ], + "executableName": "ever-teams-web-server", + "artifactName": "${name}-${version}.${ext}", + "synopsis": "Server", + "category": "Development" + }, + "directories": { + "app": "release/app", + "buildResources": "assets", + "output": "release/build" + }, + "extraResources": [ + "./assets/**" + ], + "publish": [{ + "provider": "github", + "repo": "ever-teams-web-server", + "releaseType": "release" + }, + { + "provider": "spaces", + "name": "ever", + "region": "sfo3", + "path": "/ever-teams-web-server", + "acl": "public-read" + } + ] + }, + "electronmon": { + "patterns": [ + "!**/**", + "src/main/**" + ], + "logLevel": "quiet" + } +} diff --git a/apps/server-web/release/app/package-lock.json b/apps/server-web/release/app/package-lock.json new file mode 100644 index 000000000..351a9dab9 --- /dev/null +++ b/apps/server-web/release/app/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "electron-react-boilerplate", + "version": "4.6.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "electron-react-boilerplate", + "version": "4.6.0", + "hasInstallScript": true, + "license": "MIT" + } + } +} diff --git a/apps/server-web/release/app/package.json b/apps/server-web/release/app/package.json new file mode 100644 index 000000000..de2f9ac9c --- /dev/null +++ b/apps/server-web/release/app/package.json @@ -0,0 +1,18 @@ +{ + "name": "electron-react-boilerplate", + "version": "4.6.0", + "description": "A foundation for scalable desktop apps", + "license": "MIT", + "author": { + "name": "Electron React Boilerplate Maintainers", + "email": "electronreactboilerplate@gmail.com", + "url": "https://github.com/electron-react-boilerplate" + }, + "main": "./dist/main/main.js", + "scripts": { + "rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js", + "postinstall": "npm run rebuild && npm run link-modules", + "link-modules": "node -r ts-node/register ../../.erb/scripts/link-modules.ts" + }, + "dependencies": {} +} diff --git a/apps/server-web/release/app/yarn.lock b/apps/server-web/release/app/yarn.lock new file mode 100644 index 000000000..fb57ccd13 --- /dev/null +++ b/apps/server-web/release/app/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/apps/server-web/src/__tests__/App.test.tsx b/apps/server-web/src/__tests__/App.test.tsx new file mode 100644 index 000000000..6a1de2a63 --- /dev/null +++ b/apps/server-web/src/__tests__/App.test.tsx @@ -0,0 +1,9 @@ +import '@testing-library/jest-dom'; +import { render } from '@testing-library/react'; +import App from '../renderer/App'; + +describe('App', () => { + it('should render', () => { + expect(render()).toBeTruthy(); + }); +}); diff --git a/apps/server-web/src/main/helpers/constant.ts b/apps/server-web/src/main/helpers/constant.ts new file mode 100644 index 000000000..3090c1df5 --- /dev/null +++ b/apps/server-web/src/main/helpers/constant.ts @@ -0,0 +1,6 @@ +export const EventLists = { + webServerStarted: 'WEB_SERVER_STARTED', + webServerStopped: 'WEB_SERVER_STOPPED', + webServerStart: 'WEB_SERVER_START', + webServerStop: 'WEB_SERVER_STOP' + } diff --git a/apps/server-web/src/main/helpers/create-window.ts b/apps/server-web/src/main/helpers/create-window.ts new file mode 100644 index 000000000..b4deda5f3 --- /dev/null +++ b/apps/server-web/src/main/helpers/create-window.ts @@ -0,0 +1,86 @@ +import { + screen, + BrowserWindow, + BrowserWindowConstructorOptions, + Rectangle, +} from 'electron' +import Store from 'electron-store' + +export const createWindow = ( + windowName: string, + options: BrowserWindowConstructorOptions +): BrowserWindow => { + const key = 'window-state' + const name = `window-state-${windowName}` + const store = new Store({ name }) + const defaultSize = { + width: options.width, + height: options.height, + } + let state = {} + + const restore = () => store.get(key, defaultSize) + + const getCurrentPosition = () => { + const position = win.getPosition() + const size = win.getSize() + return { + x: position[0], + y: position[1], + width: size[0], + height: size[1], + } + } + + const windowWithinBounds = (windowState, bounds) => { + return ( + windowState.x >= bounds.x && + windowState.y >= bounds.y && + windowState.x + windowState.width <= bounds.x + bounds.width && + windowState.y + windowState.height <= bounds.y + bounds.height + ) + } + + const resetToDefaults = () => { + const bounds = screen.getPrimaryDisplay().bounds + return Object.assign({}, defaultSize, { + x: (bounds.width - defaultSize.width) / 2, + y: (bounds.height - defaultSize.height) / 2, + }) + } + + const ensureVisibleOnSomeDisplay = (windowState) => { + const visible = screen.getAllDisplays().some((display) => { + return windowWithinBounds(windowState, display.bounds) + }) + if (!visible) { + // Window is partially or fully not visible now. + // Reset it to safe defaults. + return resetToDefaults() + } + return windowState + } + + const saveState = () => { + if (!win.isMinimized() && !win.isMaximized()) { + Object.assign(state, getCurrentPosition()) + } + store.set(key, state) + } + + state = ensureVisibleOnSomeDisplay(restore()) + + const win = new BrowserWindow({ + ...state, + ...options, + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + ...options.webPreferences, + }, + }) + + win.on('close', saveState) + + return win +} diff --git a/apps/server-web/src/main/helpers/desktop-server.ts b/apps/server-web/src/main/helpers/desktop-server.ts new file mode 100644 index 000000000..fc367e6a1 --- /dev/null +++ b/apps/server-web/src/main/helpers/desktop-server.ts @@ -0,0 +1,136 @@ +import { BrowserWindow } from 'electron'; +import { DesktopServerFactory } from './services/desktop-server-factory'; +import EventEmitter from 'events'; +import { Observer } from './services/utils'; +import NotificationDesktop from '../windows/desktop-notifier'; +// Define server states +export enum ServerState { + STOPPED = 'stopped', + RUNNING = 'running', + RESTARTING = 'restarting' +} + +/** + * Represents a Desktop Server. + */ +export class DesktopServer { + private state: ServerState = ServerState.STOPPED; + private stateObserver: Observer; + private eventEmitter:EventEmitter; + constructor(private readonly isOnlyApiServer = false, eventEmitter: EventEmitter) { + // super(); + + this.stateObserver = new Observer((state: ServerState) => { + this.state = state; + this.notification(state); + // this.emit('stateChange', state); + }); + this.eventEmitter = eventEmitter + } + + public async start( + path?: any, + env?: any, + mainWindow?: BrowserWindow, + signal?: AbortSignal, + ): Promise { + console.log('DesktopServer -> start'); + + try { + if (this.state !== ServerState.STOPPED) { + return; // Server already running or restarting + } + + const apiInstance = DesktopServerFactory.getApiInstance(path?.api, env, mainWindow, signal, this.eventEmitter); + await this.startInstance(apiInstance); + // Notify running state + this.stateObserver.notify(ServerState.RUNNING); + } catch (error) { + this.handleError(error); + } + } + + public async stop(): Promise { + // if (this.state === ServerState.STOPPED) { + // return; // Server already stopped + // } + + const apiInstance = DesktopServerFactory.getApiInstance(); + await this.stopInstance(apiInstance); + + // Notify stopped state + this.stateObserver.notify(ServerState.STOPPED); + } + + public async restart(): Promise { + // if (this.state === ServerState.STOPPED) { + // return; // Server is stopped no need to restarting + // } + + // if (this.state === ServerState.RESTARTING) { + // return; // Server already restarting + // } + + // Notify restarting state + this.stateObserver.notify(ServerState.RESTARTING); + + const apiInstance = DesktopServerFactory.getApiInstance(); + apiInstance?.restartObserver?.notify?.({ type: 'restart' }); + + await this.restartInstance(apiInstance); + + // Notify running state + this.stateObserver.notify(ServerState.RUNNING); + } + + public get running(): boolean { + return this.state === ServerState.RUNNING; + } + + private async stopInstance(instance: any): Promise { + if (instance) { + await instance.stop(); + } + } + + private async startInstance(instance: any): Promise { + if (instance) { + await instance.start(); + } + } + + private async restartInstance(instance: any): Promise { + if (instance) { + await instance.restart(); + } + } + + private handleError(error: Error): void { + console.error('Error occurred:', error); + } + + private get name(): string { + return process.env.DESCRIPTION || 'Server'; + } + + private notification(state: ServerState) { + let message = ''; + switch (state) { + case ServerState.STOPPED: + message = 'Server is stopped'; + break; + case ServerState.RESTARTING: + message = 'Server is restarting'; + break; + case ServerState.RUNNING: + message = 'Server is running'; + break; + default: + console.log(`ERROR: Uncaught state: ${state}`); + break; + } + + const notifier = new NotificationDesktop(); + notifier.customNotification(message, this.name); + } +} diff --git a/apps/server-web/src/main/helpers/index.ts b/apps/server-web/src/main/helpers/index.ts new file mode 100644 index 000000000..e1b9aad0a --- /dev/null +++ b/apps/server-web/src/main/helpers/index.ts @@ -0,0 +1 @@ +export * from './create-window' diff --git a/apps/server-web/src/main/helpers/interfaces/i-desktop-dialog.ts b/apps/server-web/src/main/helpers/interfaces/i-desktop-dialog.ts new file mode 100644 index 000000000..b1ce87736 --- /dev/null +++ b/apps/server-web/src/main/helpers/interfaces/i-desktop-dialog.ts @@ -0,0 +1,9 @@ +import { BrowserWindow, MessageBoxOptions } from 'electron'; + +export interface IDesktopDialog { + show(): Promise; + close(): void; + get options(): MessageBoxOptions; + set options(value: MessageBoxOptions); + get browserWindow(): BrowserWindow; +} diff --git a/apps/server-web/src/main/helpers/interfaces/i-server.ts b/apps/server-web/src/main/helpers/interfaces/i-server.ts new file mode 100644 index 000000000..ec50d5aba --- /dev/null +++ b/apps/server-web/src/main/helpers/interfaces/i-server.ts @@ -0,0 +1,6 @@ +export interface WebServer { + PORT: number; + NEXT_PUBLIC_GAUZY_API_SERVER_URL: string; + GAUZY_API_SERVER_URL: string; + [key: string]: any; +} \ No newline at end of file diff --git a/apps/server-web/src/main/helpers/interfaces/index.ts b/apps/server-web/src/main/helpers/interfaces/index.ts new file mode 100644 index 000000000..f7a793501 --- /dev/null +++ b/apps/server-web/src/main/helpers/interfaces/index.ts @@ -0,0 +1,2 @@ +export * from './i-server'; +export * from './i-desktop-dialog'; diff --git a/apps/server-web/src/main/helpers/services/desktop-server-factory.ts b/apps/server-web/src/main/helpers/services/desktop-server-factory.ts new file mode 100644 index 000000000..1a9502238 --- /dev/null +++ b/apps/server-web/src/main/helpers/services/desktop-server-factory.ts @@ -0,0 +1,13 @@ +import { BrowserWindow } from 'electron'; +import { WebService } from './web-service'; +import { EventEmitter } from 'events'; + +export class DesktopServerFactory { + private static apiInstance: WebService; + public static getApiInstance(path?: string, env?: any, win?: BrowserWindow, signal?: AbortSignal, eventEmitter?: EventEmitter): WebService { + if (!this.apiInstance && !!env) { + this.apiInstance = new WebService(path, env, win, signal, eventEmitter); + } + return this.apiInstance; + } +} diff --git a/apps/server-web/src/main/helpers/services/libs/desktop-store.ts b/apps/server-web/src/main/helpers/services/libs/desktop-store.ts new file mode 100644 index 000000000..275863cd1 --- /dev/null +++ b/apps/server-web/src/main/helpers/services/libs/desktop-store.ts @@ -0,0 +1,29 @@ +import Store from 'electron-store'; +import { WebServer } from '../../interfaces'; +const store = new Store(); +export const LocalStore = { + getStore: (source: string) => { + return store.get(source); + }, + + updateConfigSetting: (values: WebServer) => { + let config: WebServer | any = store.get('config'); + config = { ...config, ...values }; + store.set({ + config + }); + }, + + + setDefaultServerConfig: () => { + const defaultConfig: WebServer | any = store.get('config'); + if (!defaultConfig || !defaultConfig.PORT) { + const config: WebServer = { + PORT: 3002, + GAUZY_API_SERVER_URL: 'htpp://localhost:3000', + NEXT_PUBLIC_GAUZY_API_SERVER_URL: 'http://localhost:3000' + } + store.set({ config }); + } + } +}; diff --git a/apps/server-web/src/main/helpers/services/libs/server-config.ts b/apps/server-web/src/main/helpers/services/libs/server-config.ts new file mode 100644 index 000000000..2d2c1060b --- /dev/null +++ b/apps/server-web/src/main/helpers/services/libs/server-config.ts @@ -0,0 +1,11 @@ +import { LocalStore } from './desktop-store'; + +export class ServerConfig { + public get setting(): any { + return LocalStore.getStore('config'); + } + + public set setting(value:any) { + LocalStore.updateConfigSetting(value); + } +} diff --git a/apps/server-web/src/main/helpers/services/libs/server-task.ts b/apps/server-web/src/main/helpers/services/libs/server-task.ts new file mode 100644 index 000000000..dba091b67 --- /dev/null +++ b/apps/server-web/src/main/helpers/services/libs/server-task.ts @@ -0,0 +1,179 @@ +import { ChildProcessFactory, Observer } from '../utils'; +import { BrowserWindow } from 'electron'; +import { ServerConfig } from './server-config'; +import EventEmitter from 'events'; +import { EventLists } from '../../constant'; +// import { Timeout } from '../../decorators'; + +export abstract class ServerTask { + private processPath: string; + protected args: Record; + protected window: BrowserWindow; + protected successMessage: string; + private errorMessage: string; + protected config: ServerConfig; + protected loggerObserver: Observer; + private stateObserver: Observer; + public restartObserver: Observer<{ type?: string; status?: string }, void>; + protected pid: string; + protected isRunning: boolean; + protected signal: AbortSignal; + private criticalMessageError = ['[CRITICAL::ERROR]', 'EADDRINUSE']; + public eventEmmitter: EventEmitter; + + protected constructor( + processPath: string, + args: Record, + serverWindow: BrowserWindow, + successMessage: string, + errorMessage: string, + signal: AbortSignal, + eventEmmitter: EventEmitter + ) { + this.processPath = processPath; + this.args = args; + this.window = serverWindow; + this.successMessage = successMessage; + this.errorMessage = errorMessage; + this.config = new ServerConfig(); + this.pid = `${this.args.serviceName}Pid`; + this.signal = signal; + this.isRunning = false; + this.eventEmmitter = eventEmmitter; + + this.loggerObserver = new Observer((msg: string) => { + console.log('Sending log_state:', msg); + if (!this.window?.isDestroyed()) { + // this.window.webContents.send('log_state', { msg }); + } + }); + + this.stateObserver = new Observer((state: boolean) => { + this.isRunning = state; + if (!this.window?.isDestroyed()) { + console.log('Sending running_state:', state); + // this.window.webContents.send('running_state', state); + } + }); + + this.restartObserver = new Observer((options?) => { + if (!this.window?.isDestroyed()) { + console.log('Sending resp_msg:', options); + // this.window.webContents.send('resp_msg', { type: 'start_server', status: 'success', ...options }); + } + }); + } + + protected async runTask(signal: AbortSignal): Promise { + console.log('Run Server Task'); + return new Promise((resolve, reject) => { + try { + console.log('creating process with processPath:', this.processPath, 'args:', JSON.stringify(this.args)); + + const service = ChildProcessFactory.createProcess(this.processPath, this.args, signal); + + console.log('Service created', service.pid); + + service.stdout.on('data', (data: any) => { + const msg = data.toString(); + this.loggerObserver.notify(msg); + if (msg.includes(this.successMessage)) { + const name = String(this.args.serviceName); + this.stateObserver.notify(true); + this.loggerObserver.notify( + `☣︎ ${name.toUpperCase()} server listen to ${this.config[`${name}Url`]}` + ); + resolve(); + } + + if (this.criticalMessageError.some((error) => msg.includes(error))) { + this.handleError(msg); + reject(msg); + } + }); + + service.stderr.on('data', (data: any) => { + console.log('stderr:', data.toString()); + this.loggerObserver.notify(data.toString()); + }); + + service.on('disconnect', () => { + console.log('Webserver disconnected'); + if (this.eventEmmitter) { + this.eventEmmitter.emit(EventLists.webServerStopped); + } + }) + + service.on('error', (err) => { + console.log('child process error', err); + }) + + if (this.eventEmmitter) { + this.eventEmmitter.emit(EventLists.webServerStarted); + } + this.config.setting = { [this.pid]: service.pid }; + } catch (error) { + console.error('Error running task:', error); + this.handleError(error); + reject(error); + } + }); + } + + public kill(callHandleError = true): void { + console.log('Kill Server Task'); + try { + if (this.pid && this.config.setting[this.pid]) { + process.kill(this.config.setting[this.pid]); + delete this.config.setting[this.pid]; + this.stateObserver.notify(false); + this.loggerObserver.notify(`[${this.pid.toUpperCase()}-${this.config.setting[this.pid]}]: stopped`); + } + } catch (error) { + if (callHandleError) { + if (error.code === 'ESRCH') { + error.message = `ERROR: Could not terminate the process [${this.pid}]. It was not running: ${error}`; + } + this.handleError(error, false); // Pass false to prevent retrying kill in handleError + } + } + } + + public get running(): boolean { + return this.isRunning && !!this.config.setting[this.pid]; + } + + public async restart(): Promise { + console.log('Restart Server Task'); + + if (this.running) { + this.stop(); + } + + await this.start(); + } + + public stop(): void { + console.log('Stop Server Task'); + this.kill(); + } + + public async start(): Promise { + console.log('Start Server Task'); + try { + await this.runTask(this.signal); + } catch (error) { + console.error('Error starting task:', error); + this.handleError(error); + } + } + + protected handleError(error: any, attemptKill = true) { + if (attemptKill) { + this.kill(false); // Pass false to indicate that handleError should not attempt to kill again + } + this.stateObserver.notify(false); + console.error(this.errorMessage, error); + this.loggerObserver.notify(`ERROR: ${this.errorMessage} ${error}`); + } +} diff --git a/apps/server-web/src/main/helpers/services/utils/child-process-factory.ts b/apps/server-web/src/main/helpers/services/utils/child-process-factory.ts new file mode 100644 index 000000000..0556e736d --- /dev/null +++ b/apps/server-web/src/main/helpers/services/utils/child-process-factory.ts @@ -0,0 +1,15 @@ +import { ForkOptions, fork } from 'child_process'; + +export class ChildProcessFactory { + public static createProcess(path, env, signal, options?: ForkOptions) { + return fork(path, { + silent: true, + signal, + env: { + ...process.env, + ...env + }, + ...options + }); + } +} diff --git a/apps/server-web/src/main/helpers/services/utils/index.ts b/apps/server-web/src/main/helpers/services/utils/index.ts new file mode 100644 index 000000000..9a8f357af --- /dev/null +++ b/apps/server-web/src/main/helpers/services/utils/index.ts @@ -0,0 +1,2 @@ +export * from './observer'; +export * from './child-process-factory'; diff --git a/apps/server-web/src/main/helpers/services/utils/observer.ts b/apps/server-web/src/main/helpers/services/utils/observer.ts new file mode 100644 index 000000000..40fc02b81 --- /dev/null +++ b/apps/server-web/src/main/helpers/services/utils/observer.ts @@ -0,0 +1,11 @@ +export class Observer { + private callback: (data: T) => U; + + constructor(callback: (data: T) => U) { + this.callback = callback; + } + + public notify(data: T) { + this.callback(data); + } +} diff --git a/apps/server-web/src/main/helpers/services/web-service.ts b/apps/server-web/src/main/helpers/services/web-service.ts new file mode 100644 index 000000000..62bff4df2 --- /dev/null +++ b/apps/server-web/src/main/helpers/services/web-service.ts @@ -0,0 +1,48 @@ +import { BrowserWindow } from 'electron'; +import { ServerTask } from './libs/server-task'; +import { EventEmitter } from 'stream'; + +export class WebService extends ServerTask { + constructor( + readonly path: string, + readonly env: any, + readonly window: BrowserWindow, + readonly signal: AbortSignal, + readonly eventEmitter: EventEmitter + ) { + const args = { ...env, serviceName: 'WebServer' }; + + // Note: do not change this prefix because we may use it to detect the success message from the running server! + const successMessage = 'Listening at http'; + + const errorMessage = 'Error running API server:'; + + super(path, args, window, successMessage, errorMessage, signal, eventEmitter); + } + + public override async start(): Promise { + try { + this.setApiConfig(); + await super.start(); + } catch (error) { + this.handleError(error); + } + } + + public override async restart(): Promise { + try { + this.setApiConfig(); + await super.restart(); + } catch (error) { + this.handleError(error); + } + } + + private setApiConfig(): void { + // Object.assign(this.args, { + // API_HOST: '0.0.0.0', + // API_PORT: this.config.setting.PORT, + // API_BASE_URL: this.config.apiUrl + // }); + } +} diff --git a/apps/server-web/src/main/main.ts b/apps/server-web/src/main/main.ts new file mode 100644 index 000000000..e73ceb147 --- /dev/null +++ b/apps/server-web/src/main/main.ts @@ -0,0 +1,156 @@ +import path from 'path' +import { app, ipcMain, Tray, dialog } from 'electron'; +import { DesktopServer } from './helpers/desktop-server'; +import { LocalStore } from './helpers/services/libs/desktop-store'; +import { EventEmitter } from 'events'; +import { defaultTrayMenuItem, _initTray, updateTrayMenu } from './tray'; +import { EventLists } from './helpers/constant'; + +const eventEmiter = new EventEmitter(); + +const controller = new AbortController(); +const { signal } = controller; +const isPack = app.isPackaged; +const desktopServer = new DesktopServer(false, eventEmiter); +const isProd = process.env.NODE_ENV === 'production'; + +// const appPath = app.getAppPath(); + +let isServerRun: boolean; + +let tray:Tray; + +const trayMenuItems = defaultTrayMenuItem(eventEmiter); + + + +console.log(__dirname); + +if (isProd) { + // serve({ directory: 'app' }) +} else { + app.setPath('userData', `${app.getPath('userData')}`) +} + +const resourceDir = { + webServer: !isPack ? '../../release/app/dist' : '..', + resources: '../resources' +}; +const resourcesFiles = { + webServer: 'standalone/apps/web/server.js', + iconTray: 'icons/tray/icon.png' +} + +const runServer = async () => { + console.log('Run the Server...'); + try { + const envVal = getEnvApi(); + + // Instantiate API and UI servers + await desktopServer.start( + { api: path.join(__dirname, resourceDir.webServer, resourcesFiles.webServer) }, + envVal, + undefined, + signal + ); + } catch (error:any) { + if (error.name === 'AbortError') { + console.log('You exit without to stop the server'); + return; + } + } +}; + +const stopServer = async () => { + await desktopServer.stop(); +}; + +const getEnvApi = () => { + const setting = LocalStore.getStore('config') + console.log(setting); + return setting; +}; + +const onInitApplication = () => { + LocalStore.setDefaultServerConfig(); // check and set default config + tray = _initTray(resourceDir, resourcesFiles, trayMenuItems); + eventEmiter.on(EventLists.webServerStart, async () => { + updateTrayMenu('SERVER_START', { enabled: false }, eventEmiter, tray, trayMenuItems); + isServerRun = true; + await runServer(); + }) + + eventEmiter.on(EventLists.webServerStop, async () => { + isServerRun = false; + await stopServer(); + }) + + eventEmiter.on(EventLists.webServerStarted, () => { + console.log(EventLists.webServerStarted) + updateTrayMenu('SERVER_START', { enabled: false }, eventEmiter, tray, trayMenuItems); + updateTrayMenu('SERVER_STOP', { enabled: true }, eventEmiter, tray, trayMenuItems); + updateTrayMenu('SERVER_STATUS', { label: 'Status: Started' }, eventEmiter, tray, trayMenuItems); + isServerRun = true; + }) + + eventEmiter.on(EventLists.webServerStopped, () => { + console.log(EventLists.webServerStopped); + updateTrayMenu('SERVER_STOP', { enabled: false }, eventEmiter, tray, trayMenuItems); + updateTrayMenu('SERVER_START', { enabled: true }, eventEmiter, tray, trayMenuItems); + updateTrayMenu('SERVER_STATUS', { label: 'Status: Stopped' }, eventEmiter, tray, trayMenuItems); + isServerRun = false; + }) +} + + (async () => { + await app.whenReady() + onInitApplication(); + // const mainWindow = createWindow('main', { + // width: 1000, + // height: 600, + // webPreferences: { + // preload: path.join(__dirname, 'preload.js'), + // }, + // }) + + // if (isProd) { + // await mainWindow.loadURL('app://./home') + // } else { + // const port = process.argv[2] + // await mainWindow.loadURL(`http://localhost:${port}/home`) + // mainWindow.webContents.openDevTools() + // } +})() + +app.on('window-all-closed', () => { + app.quit() +}) + +ipcMain.on('message', async (event, arg) => { + event.reply('message', `${arg} World!`) +}) + +app.on('before-quit', async (e) => { + console.log('Before Quit'); + + e.preventDefault(); + + if (isServerRun) { + const exitConfirmationDialog = await dialog.showMessageBox({ + message: '', + title: 'Warning', + detail: 'Server web still running, Are you sure to exit the app ?', + buttons: [ + 'Yes', + 'No' + ] + }) + + if (exitConfirmationDialog.response === 0) { + // Stop the server from main + stopServer(); + } + } else { + app.exit(0); + } +}); diff --git a/apps/server-web/src/main/main_.ts b/apps/server-web/src/main/main_.ts new file mode 100644 index 000000000..05b44eb4f --- /dev/null +++ b/apps/server-web/src/main/main_.ts @@ -0,0 +1,137 @@ +/* eslint global-require: off, no-console: off, promise/always-return: off */ + +/** + * This module executes inside of electron's main process. You can start + * electron renderer process from here and communicate with the other processes + * through IPC. + * + * When running `npm run build` or `npm run build:main`, this file is compiled to + * `./src/main.js` using webpack. This gives us some performance wins. + */ +import path from 'path'; +import { app, BrowserWindow, shell, ipcMain } from 'electron'; +import { autoUpdater } from 'electron-updater'; +import log from 'electron-log'; +import MenuBuilder from './menu'; +import { resolveHtmlPath } from './util'; + +class AppUpdater { + constructor() { + log.transports.file.level = 'info'; + autoUpdater.logger = log; + autoUpdater.checkForUpdatesAndNotify(); + } +} + +let mainWindow: BrowserWindow | null = null; + +ipcMain.on('ipc-example', async (event, arg) => { + const msgTemplate = (pingPong: string) => `IPC test: ${pingPong}`; + console.log(msgTemplate(arg)); + event.reply('ipc-example', msgTemplate('pong')); +}); + +if (process.env.NODE_ENV === 'production') { + const sourceMapSupport = require('source-map-support'); + sourceMapSupport.install(); +} + +const isDebug = + process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; + +if (isDebug) { + require('electron-debug')(); +} + +const installExtensions = async () => { + const installer = require('electron-devtools-installer'); + const forceDownload = !!process.env.UPGRADE_EXTENSIONS; + const extensions = ['REACT_DEVELOPER_TOOLS']; + + return installer + .default( + extensions.map((name) => installer[name]), + forceDownload, + ) + .catch(console.log); +}; + +const createWindow = async () => { + if (isDebug) { + await installExtensions(); + } + + const RESOURCES_PATH = app.isPackaged + ? path.join(process.resourcesPath, 'assets') + : path.join(__dirname, '../../assets'); + + const getAssetPath = (...paths: string[]): string => { + return path.join(RESOURCES_PATH, ...paths); + }; + + mainWindow = new BrowserWindow({ + show: false, + width: 1024, + height: 728, + icon: getAssetPath('icon.png'), + webPreferences: { + preload: app.isPackaged + ? path.join(__dirname, 'preload.js') + : path.join(__dirname, '../../.erb/dll/preload.js'), + }, + }); + + mainWindow.loadURL(resolveHtmlPath('index.html')); + + mainWindow.on('ready-to-show', () => { + if (!mainWindow) { + throw new Error('"mainWindow" is not defined'); + } + if (process.env.START_MINIMIZED) { + mainWindow.minimize(); + } else { + mainWindow.show(); + } + }); + + mainWindow.on('closed', () => { + mainWindow = null; + }); + + const menuBuilder = new MenuBuilder(mainWindow); + menuBuilder.buildMenu(); + + // Open urls in the user's browser + mainWindow.webContents.setWindowOpenHandler((edata) => { + shell.openExternal(edata.url); + return { action: 'deny' }; + }); + + // Remove this if your app does not use auto updates + // eslint-disable-next-line + new AppUpdater(); +}; + +/** + * Add event listeners... + */ + +app.on('window-all-closed', () => { + // Respect the OSX convention of having the application in memory even + // after all windows have been closed + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app + .whenReady() + .then(() => { + createWindow(); + app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWindow === null) createWindow(); + }); + }) + .catch(console.log); diff --git a/apps/server-web/src/main/menu.ts b/apps/server-web/src/main/menu.ts new file mode 100644 index 000000000..ba0fb7709 --- /dev/null +++ b/apps/server-web/src/main/menu.ts @@ -0,0 +1,290 @@ +import { + app, + Menu, + shell, + BrowserWindow, + MenuItemConstructorOptions, +} from 'electron'; + +interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions { + selector?: string; + submenu?: DarwinMenuItemConstructorOptions[] | Menu; +} + +export default class MenuBuilder { + mainWindow: BrowserWindow; + + constructor(mainWindow: BrowserWindow) { + this.mainWindow = mainWindow; + } + + buildMenu(): Menu { + if ( + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ) { + this.setupDevelopmentEnvironment(); + } + + const template = + process.platform === 'darwin' + ? this.buildDarwinTemplate() + : this.buildDefaultTemplate(); + + const menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); + + return menu; + } + + setupDevelopmentEnvironment(): void { + this.mainWindow.webContents.on('context-menu', (_, props) => { + const { x, y } = props; + + Menu.buildFromTemplate([ + { + label: 'Inspect element', + click: () => { + this.mainWindow.webContents.inspectElement(x, y); + }, + }, + ]).popup({ window: this.mainWindow }); + }); + } + + buildDarwinTemplate(): MenuItemConstructorOptions[] { + const subMenuAbout: DarwinMenuItemConstructorOptions = { + label: 'Electron', + submenu: [ + { + label: 'About ElectronReact', + selector: 'orderFrontStandardAboutPanel:', + }, + { type: 'separator' }, + { label: 'Services', submenu: [] }, + { type: 'separator' }, + { + label: 'Hide ElectronReact', + accelerator: 'Command+H', + selector: 'hide:', + }, + { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + selector: 'hideOtherApplications:', + }, + { label: 'Show All', selector: 'unhideAllApplications:' }, + { type: 'separator' }, + { + label: 'Quit', + accelerator: 'Command+Q', + click: () => { + app.quit(); + }, + }, + ], + }; + const subMenuEdit: DarwinMenuItemConstructorOptions = { + label: 'Edit', + submenu: [ + { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, + { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, + { type: 'separator' }, + { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' }, + { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, + { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, + { + label: 'Select All', + accelerator: 'Command+A', + selector: 'selectAll:', + }, + ], + }; + const subMenuViewDev: MenuItemConstructorOptions = { + label: 'View', + submenu: [ + { + label: 'Reload', + accelerator: 'Command+R', + click: () => { + this.mainWindow.webContents.reload(); + }, + }, + { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + }, + }, + { + label: 'Toggle Developer Tools', + accelerator: 'Alt+Command+I', + click: () => { + this.mainWindow.webContents.toggleDevTools(); + }, + }, + ], + }; + const subMenuViewProd: MenuItemConstructorOptions = { + label: 'View', + submenu: [ + { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + }, + }, + ], + }; + const subMenuWindow: DarwinMenuItemConstructorOptions = { + label: 'Window', + submenu: [ + { + label: 'Minimize', + accelerator: 'Command+M', + selector: 'performMiniaturize:', + }, + { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, + { type: 'separator' }, + { label: 'Bring All to Front', selector: 'arrangeInFront:' }, + ], + }; + const subMenuHelp: MenuItemConstructorOptions = { + label: 'Help', + submenu: [ + { + label: 'Learn More', + click() { + shell.openExternal('https://electronjs.org'); + }, + }, + { + label: 'Documentation', + click() { + shell.openExternal( + 'https://github.com/electron/electron/tree/main/docs#readme', + ); + }, + }, + { + label: 'Community Discussions', + click() { + shell.openExternal('https://www.electronjs.org/community'); + }, + }, + { + label: 'Search Issues', + click() { + shell.openExternal('https://github.com/electron/electron/issues'); + }, + }, + ], + }; + + const subMenuView = + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ? subMenuViewDev + : subMenuViewProd; + + return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow, subMenuHelp]; + } + + buildDefaultTemplate() { + const templateDefault = [ + { + label: '&File', + submenu: [ + { + label: '&Open', + accelerator: 'Ctrl+O', + }, + { + label: '&Close', + accelerator: 'Ctrl+W', + click: () => { + this.mainWindow.close(); + }, + }, + ], + }, + { + label: '&View', + submenu: + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ? [ + { + label: '&Reload', + accelerator: 'Ctrl+R', + click: () => { + this.mainWindow.webContents.reload(); + }, + }, + { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen( + !this.mainWindow.isFullScreen(), + ); + }, + }, + { + label: 'Toggle &Developer Tools', + accelerator: 'Alt+Ctrl+I', + click: () => { + this.mainWindow.webContents.toggleDevTools(); + }, + }, + ] + : [ + { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen( + !this.mainWindow.isFullScreen(), + ); + }, + }, + ], + }, + { + label: 'Help', + submenu: [ + { + label: 'Learn More', + click() { + shell.openExternal('https://electronjs.org'); + }, + }, + { + label: 'Documentation', + click() { + shell.openExternal( + 'https://github.com/electron/electron/tree/main/docs#readme', + ); + }, + }, + { + label: 'Community Discussions', + click() { + shell.openExternal('https://www.electronjs.org/community'); + }, + }, + { + label: 'Search Issues', + click() { + shell.openExternal('https://github.com/electron/electron/issues'); + }, + }, + ], + }, + ]; + + return templateDefault; + } +} diff --git a/apps/server-web/src/main/preload.ts b/apps/server-web/src/main/preload.ts new file mode 100644 index 000000000..7f8f10ca0 --- /dev/null +++ b/apps/server-web/src/main/preload.ts @@ -0,0 +1,20 @@ +import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron' + +const handler = { + send(channel: string, value: unknown) { + ipcRenderer.send(channel, value) + }, + on(channel: string, callback: (...args: unknown[]) => void) { + const subscription = (_event: IpcRendererEvent, ...args: unknown[]) => + callback(...args) + ipcRenderer.on(channel, subscription) + + return () => { + ipcRenderer.removeListener(channel, subscription) + } + }, +} + +contextBridge.exposeInMainWorld('ipc', handler) + +export type IpcHandler = typeof handler diff --git a/apps/server-web/src/main/tray.ts b/apps/server-web/src/main/tray.ts new file mode 100644 index 000000000..861a65154 --- /dev/null +++ b/apps/server-web/src/main/tray.ts @@ -0,0 +1,68 @@ +import { app, NativeImage, nativeImage, Menu, Tray } from 'electron'; +import path from 'path'; +import { EventEmitter } from 'events'; +import { EventLists } from './helpers/constant'; + +export const _initTray = (resourceDir: any, resourcesFiles: any, contextMenu:any): Tray => { + const iconPath = path.join(__dirname, resourceDir.resources, resourcesFiles.iconTray); + console.log(iconPath) + const iconNativePath: NativeImage = nativeImage.createFromPath(iconPath); + iconNativePath.resize({ width: 16, height: 16 }) + const tray = new Tray(iconNativePath); + tray.setContextMenu(Menu.buildFromTemplate(contextMenu)); + return tray; +} + +export const defaultTrayMenuItem = (eventEmitter: EventEmitter) => { + const contextMenu = [ + { + id: 'SERVER_STATUS', + label: 'Status: Stopped', + }, + { + id: 'SERVER_START', + label: 'Start', + async click() { + eventEmitter.emit(EventLists.webServerStart); + } + }, + { + id: 'SERVER_STOP', + label: 'Stop', + async click() { + eventEmitter.emit(EventLists.webServerStop); + } + }, + { + id: 'APP_SETTING', + label: 'Settings', + async click() { + console.log('settings') + } + }, + { + id: 'APP_ABOUT', + label: 'About Gauzy Web Server', + async click() { + console.log('about') + } + }, + { + id: 'APP_QUIT', + label: 'Quit', + click() { + app.quit(); + } + } + ]; + return contextMenu; +} + +export const updateTrayMenu = (menuItem: string, context: { label?: string, enabled?: boolean}, eventEmitter: EventEmitter, tray: Tray, contextMenuItems: any) => { + const menuIdx:number = contextMenuItems.findIndex((item: any) => item.id === menuItem); + if (menuIdx > -1) { + contextMenuItems[menuIdx] = {...contextMenuItems[menuIdx], ...context}; + console.log(contextMenuItems) + tray.setContextMenu(Menu.buildFromTemplate(contextMenuItems)); + } +} diff --git a/apps/server-web/src/main/util.ts b/apps/server-web/src/main/util.ts new file mode 100644 index 000000000..7775eda37 --- /dev/null +++ b/apps/server-web/src/main/util.ts @@ -0,0 +1,13 @@ +/* eslint import/prefer-default-export: off */ +import { URL } from 'url'; +import path from 'path'; + +export function resolveHtmlPath(htmlFileName: string) { + if (process.env.NODE_ENV === 'development') { + const port = process.env.PORT || 1212; + const url = new URL(`http://localhost:${port}`); + url.pathname = htmlFileName; + return url.href; + } + return `file://${path.resolve(__dirname, '../renderer/', htmlFileName)}`; +} diff --git a/apps/server-web/src/main/windows/desktop-notifier.ts b/apps/server-web/src/main/windows/desktop-notifier.ts new file mode 100644 index 000000000..81f6fe326 --- /dev/null +++ b/apps/server-web/src/main/windows/desktop-notifier.ts @@ -0,0 +1,28 @@ +import { nativeImage, Notification, NativeImage } from 'electron'; +import * as path from 'path'; + +export default class NotificationDesktop { + private readonly _iconPath: string; + private readonly _iconNativePath: NativeImage; + + constructor() { + this._iconPath = path.join(__dirname, '..', 'icons', 'icon.png'); + this._iconNativePath = nativeImage.createFromPath(this._iconPath); + this._iconNativePath.resize({ width: 16, height: 16 }); + } + + + public customNotification(message: string, title: string) { + const notification = new Notification({ + title: title, + body: message, + icon: this._iconNativePath, + closeButtonText: 'Close'//TranslateService.instant('BUTTONS.CLOSE'), + }); + + notification.show(); + setTimeout(() => { + notification.close(); + }, 3000); + } +} diff --git a/apps/server-web/src/renderer/App.css b/apps/server-web/src/renderer/App.css new file mode 100644 index 000000000..616d9a48a --- /dev/null +++ b/apps/server-web/src/renderer/App.css @@ -0,0 +1,62 @@ +/* + * @NOTE: Prepend a `~` to css file paths that are in your node_modules + * See https://github.com/webpack-contrib/sass-loader#imports + */ +body { + position: relative; + color: white; + height: 100vh; + background: linear-gradient( + 200.96deg, + #fedc2a -29.09%, + #dd5789 51.77%, + #7a2c9e 129.35% + ); + font-family: sans-serif; + overflow-y: hidden; + display: flex; + justify-content: center; + align-items: center; +} + +button { + background-color: white; + padding: 10px 20px; + border-radius: 10px; + border: none; + appearance: none; + font-size: 1.3rem; + box-shadow: 0px 8px 28px -6px rgba(24, 39, 75, 0.12), + 0px 18px 88px -4px rgba(24, 39, 75, 0.14); + transition: all ease-in 0.1s; + cursor: pointer; + opacity: 0.9; +} + +button:hover { + transform: scale(1.05); + opacity: 1; +} + +li { + list-style: none; +} + +a { + text-decoration: none; + height: fit-content; + width: fit-content; + margin: 10px; +} + +a:hover { + opacity: 1; + text-decoration: none; +} + +.Hello { + display: flex; + justify-content: center; + align-items: center; + margin: 20px 0; +} diff --git a/apps/server-web/src/renderer/App.tsx b/apps/server-web/src/renderer/App.tsx new file mode 100644 index 000000000..43a4a7e07 --- /dev/null +++ b/apps/server-web/src/renderer/App.tsx @@ -0,0 +1,50 @@ +import { MemoryRouter as Router, Routes, Route } from 'react-router-dom'; +import icon from '../../assets/icon.svg'; +import './App.css'; + +function Hello() { + return ( +
+
+ icon +
+

electron-react-boilerplatex

+ +
+ ); +} + +export default function App() { + return ( + + + } /> + + + ); +} diff --git a/apps/server-web/src/renderer/index.ejs b/apps/server-web/src/renderer/index.ejs new file mode 100644 index 000000000..167cf37ef --- /dev/null +++ b/apps/server-web/src/renderer/index.ejs @@ -0,0 +1,14 @@ + + + + + + Hello Electron React! + + +
+ + diff --git a/apps/server-web/src/renderer/index.tsx b/apps/server-web/src/renderer/index.tsx new file mode 100644 index 000000000..064a05784 --- /dev/null +++ b/apps/server-web/src/renderer/index.tsx @@ -0,0 +1,13 @@ +import { createRoot } from 'react-dom/client'; +import App from './App'; + +const container = document.getElementById('root') as HTMLElement; +const root = createRoot(container); +root.render(); + +// calling IPC exposed from preload script +window.electron.ipcRenderer.once('ipc-example', (arg) => { + // eslint-disable-next-line no-console + console.log(arg); +}); +window.electron.ipcRenderer.sendMessage('ipc-example', ['ping']); diff --git a/apps/server-web/src/renderer/preload.d.ts b/apps/server-web/src/renderer/preload.d.ts new file mode 100644 index 000000000..53cc2d7b1 --- /dev/null +++ b/apps/server-web/src/renderer/preload.d.ts @@ -0,0 +1,10 @@ +import { ElectronHandler } from '../main/preload'; + +declare global { + // eslint-disable-next-line no-unused-vars + interface Window { + electron: ElectronHandler; + } +} + +export {}; diff --git a/apps/server-web/src/resources/icon.icns b/apps/server-web/src/resources/icon.icns new file mode 100644 index 000000000..4e91309e3 Binary files /dev/null and b/apps/server-web/src/resources/icon.icns differ diff --git a/apps/server-web/src/resources/icon.ico b/apps/server-web/src/resources/icon.ico new file mode 100644 index 000000000..502f78c7a Binary files /dev/null and b/apps/server-web/src/resources/icon.ico differ diff --git a/apps/server-web/src/resources/icons/tray/icon.png b/apps/server-web/src/resources/icons/tray/icon.png new file mode 100644 index 000000000..faa960171 Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@1.25x.png b/apps/server-web/src/resources/icons/tray/icon@1.25x.png new file mode 100644 index 000000000..46ea6d876 Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@1.25x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@1.33x.png b/apps/server-web/src/resources/icons/tray/icon@1.33x.png new file mode 100644 index 000000000..bc73df996 Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@1.33x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@1.4x.png b/apps/server-web/src/resources/icons/tray/icon@1.4x.png new file mode 100644 index 000000000..19ee320f0 Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@1.4x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@1.5x.png b/apps/server-web/src/resources/icons/tray/icon@1.5x.png new file mode 100644 index 000000000..5faa32626 Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@1.5x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@1.8x.png b/apps/server-web/src/resources/icons/tray/icon@1.8x.png new file mode 100644 index 000000000..0f97c50d5 Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@1.8x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@2.5x.png b/apps/server-web/src/resources/icons/tray/icon@2.5x.png new file mode 100644 index 000000000..aeb2dadc3 Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@2.5x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@2x.png b/apps/server-web/src/resources/icons/tray/icon@2x.png new file mode 100644 index 000000000..9d27eebae Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@2x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@3x.png b/apps/server-web/src/resources/icons/tray/icon@3x.png new file mode 100644 index 000000000..999c00be1 Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@3x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@4x.png b/apps/server-web/src/resources/icons/tray/icon@4x.png new file mode 100644 index 000000000..ff6c4fdec Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@4x.png differ diff --git a/apps/server-web/src/resources/icons/tray/icon@5x.png b/apps/server-web/src/resources/icons/tray/icon@5x.png new file mode 100644 index 000000000..da278ab3f Binary files /dev/null and b/apps/server-web/src/resources/icons/tray/icon@5x.png differ diff --git a/apps/server-web/tsconfig.json b/apps/server-web/tsconfig.json new file mode 100644 index 000000000..ccb6ee9d7 --- /dev/null +++ b/apps/server-web/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "incremental": true, + "target": "es2022", + "module": "commonjs", + "lib": ["dom", "es2022"], + "jsx": "react-jsx", + "strict": true, + "sourceMap": true, + "moduleResolution": "node", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "allowJs": true, + "outDir": ".erb/dll" + }, + "exclude": ["test", "release/build", "release/app/dist", ".erb/dll"] +} diff --git a/apps/web/.env b/apps/web/.env index 2fe6875eb..1d462592b 100644 --- a/apps/web/.env +++ b/apps/web/.env @@ -1,7 +1,11 @@ RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED=false -GAUZY_API_SERVER_URL=https://api.ever.team # http://localhost:3000 -NEXT_PUBLIC_GAUZY_API_SERVER_URL=https://api.ever.team # http://localhost:3000 +GAUZY_API_SERVER_URL=https://api.ever.team +NEXT_PUBLIC_GAUZY_API_SERVER_URL=https://api.ever.team + +# GAUZY_API_SERVER_URL=http://localhost:3000 +# NEXT_PUBLIC_GAUZY_API_SERVER_URL=http://localhost:3000 + NEXT_PUBLIC_GA_MEASUREMENT_ID= # CAPTCHA Settings diff --git a/apps/web/.env.sample b/apps/web/.env.sample index 30999081e..c69a51976 100644 --- a/apps/web/.env.sample +++ b/apps/web/.env.sample @@ -4,6 +4,29 @@ GAUZY_API_SERVER_URL=https://api.ever.team/api NEXT_PUBLIC_GAUZY_API_SERVER_URL=https://api.ever.team NEXT_PUBLIC_GA_MEASUREMENT_ID= +# Next Auth configs +AUTH_SECRET= + +# Google OAuth configuration +NEXT_PUBLIC_GOOGLE_APP_NAME=ever-google +AUTH_GOOGLE_ID= +AUTH_GOOGLE_SECRET= + +# Github OAuth configuration +NEXT_PUBLIC_GITHUB_APP_NAME=ever-github +AUTH_GITHUB_ID= +AUTH_GITHUB_SECRET= + +# Facebook OAuth configuration +NEXT_PUBLIC_FACEBOOK_APP_NAME=ever-facebook +AUTH_FACEBOOK_ID= +AUTH_FACEBOOK_SECRET= + +# Twitter OAuth configuration +NEXT_PUBLIC_TWITTER_APP_NAME=ever-twitter +AUTH_TWITTER_ID= +AUTH_TWITTER_SECRET= + # CAPTCHA Settings NEXT_PUBLIC_CAPTCHA_SITE_KEY= CAPTCHA_SECRET_KEY= @@ -43,9 +66,6 @@ NEXT_PUBLIC_SENTRY_DEBUG=false # true/false NEXT_PUBLIC_JITSU_BROWSER_URL= NEXT_PUBLIC_JITSU_BROWSER_WRITE_KEY= -# Github Integration -NEXT_PUBLIC_GITHUB_APP_NAME=ever-github - # Meet NEXT_PUBLIC_MEET_DOMAIN="meet.ever.team" # Private Variables (Meet) diff --git a/apps/web/app/[locale]/404.tsx b/apps/web/app/[locale]/404.tsx deleted file mode 100644 index 302287916..000000000 --- a/apps/web/app/[locale]/404.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { notFound } from 'next/navigation'; - -export default function CatchAllPage() { - notFound(); -} diff --git a/apps/web/app/[locale]/auth/error/page.tsx b/apps/web/app/[locale]/auth/error/page.tsx new file mode 100644 index 000000000..9397278fb --- /dev/null +++ b/apps/web/app/[locale]/auth/error/page.tsx @@ -0,0 +1,50 @@ +'use client'; + +import { useSearchParams } from 'next/navigation'; +import SadCry from '@components/ui/svgs/sad-cry'; +import { Text } from 'lib/components'; +import Link from 'next/link'; +import UnauthorizedPage from '@components/pages/unauthorized'; + +enum Error { + Configuration = 'Configuration', + AccessDenied = 'AccessDenied' +} + +const errorMap = { + [Error.Configuration]: ( +
+
+ + Error ! +
+ + + Something went wrong ! + +
+ + If the problem persists, send a distress signal to our support team. + + Try again +
+ +
+

Error on signing

+
+
+ ), + [Error.AccessDenied]: +}; + +/** + * Error page + * + * @description the page that will be shown if any social login failed. This is not related to Next.js error file + * @returns a custom component that shows error + */ +export default function Page() { + const search = useSearchParams(); + const error = search?.get('error') as Error; + return <>{errorMap[error]}; +} diff --git a/apps/web/app/[locale]/auth/passcode/component.tsx b/apps/web/app/[locale]/auth/passcode/component.tsx index 4887069ae..e42ff05fa 100644 --- a/apps/web/app/[locale]/auth/passcode/component.tsx +++ b/apps/web/app/[locale]/auth/passcode/component.tsx @@ -13,6 +13,8 @@ import { useRouter } from 'next/navigation'; import { Dispatch, FormEvent, FormEventHandler, SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; import stc from 'string-to-color'; +import { ScrollArea, ScrollBar } from '@components/ui/scroll-bar'; +import SocialLogins from '../social-logins-buttons'; function AuthPasscode() { const form = useAuthenticationPasscode(); @@ -41,12 +43,12 @@ function AuthPasscode() { {t('pages.authLogin.HEADING_WORKSPACE_LINE2')} ) : ( - t('pages.authLogin.HEADING_DESCRIPTION') +
{t('pages.authLogin.HEADING_DESCRIPTION')}
) } >
-
+
{form.authScreen.screen === 'email' && } {form.authScreen.screen === 'passcode' && ( @@ -56,6 +58,8 @@ function AuthPasscode() { )}
+ {/* Social logins */} +
); @@ -127,6 +131,35 @@ function EmailScreen({ form, className }: { form: TAuthenticationPasscode } & IC function PasscodeScreen({ form, className }: { form: TAuthenticationPasscode } & IClassName) { const t = useTranslations(); const inputsRef = useRef>([]); + + const formatTime = (seconds: number) => { + const minutes = Math.floor(seconds / 60); + const remainingSeconds = seconds % 60; + return `${String(minutes).padStart(2, '0')}:${String(remainingSeconds).padStart(2, '0')}`; + }; + + const [timer, setTimer] = useState(60); + const [disabled, setDisabled] = useState(true); + + useEffect(() => { + let interval: NodeJS.Timeout | undefined = undefined; + if (timer > 0) { + interval = setInterval(() => { + setTimer((prevTimer) => prevTimer - 1); + }, 1000); + } else { + setDisabled(false); + clearInterval(interval); + } + + return () => clearInterval(interval); + }, [timer]); + + const handleResendClick = () => { + setDisabled(true); + setTimer(60); + }; + const resetForm = () => { if (inputsRef.current) { for (let i = 0; i < inputsRef.current.length; i++) { @@ -173,8 +206,8 @@ function PasscodeScreen({ form, className }: { form: TAuthenticationPasscode } & form.errors['code'] || form.errors['email'] ? 'error' : form.authenticated - ? 'success' - : undefined + ? 'success' + : undefined } autoFocus={form.authScreen.screen === 'passcode'} /> @@ -192,20 +225,30 @@ function PasscodeScreen({ form, className }: { form: TAuthenticationPasscode } & {t('pages.auth.UNRECEIVED_CODE')} - - {!form.sendCodeLoading && ( + {!form.sendCodeLoading ? ( + ) : ( + )} - {form.sendCodeLoading && }
@@ -317,83 +360,84 @@ export function WorkSpaceComponent(props: IWorkSpace) { {t('pages.auth.SELECT_WORKSPACE')} - -
- {props.workspaces?.map((worksace, index) => ( -
-
-
- {worksace.user.tenant.name} - { - props.setSelectedWorkspace(index); - if ( - props.selectedTeam && - !worksace.current_teams - ?.map((team) => team.team_id) - .includes(props.selectedTeam) - ) { - props.setSelectedTeam(worksace.current_teams[0].team_id); - } - }} - > - {props.selectedWorkspace === index ? ( - - ) : ( - - )} - -
- - {/*
*/} -
- {worksace.current_teams?.map((team) => ( -
+
+ {props.workspaces?.map((worksace, index) => ( +
+
+
+ {worksace.user.tenant.name} + { + props.setSelectedWorkspace(index); + if ( + props.selectedTeam && + !worksace.current_teams + ?.map((team) => team.team_id) + .includes(props.selectedTeam) + ) { + props.setSelectedTeam(worksace.current_teams[0].team_id); + } + }} > - - -
- - {team.team_name} - - ({team.team_member_count}) -
-
- { - props.setSelectedTeam(team.team_id); - if (props.selectedWorkspace !== index) { - props.setSelectedWorkspace(index); - } - }} + {props.selectedWorkspace === index ? ( + + ) : ( + + )} + +
+ + {/*
*/} +
+ {worksace.current_teams?.map((team) => ( +
- {props.selectedTeam === team.team_id ? ( - - ) : ( - - )} - -
- ))} + + +
+ + {team.team_name} + + ({team.team_member_count}) +
+
+ { + props.setSelectedTeam(team.team_id); + if (props.selectedWorkspace !== index) { + props.setSelectedWorkspace(index); + } + }} + > + {props.selectedTeam === team.team_id ? ( + + ) : ( + + )} + +
+ ))} +
-
- ))} -
- + ))} +
+ +
diff --git a/apps/web/app/[locale]/auth/passcode/page.tsx b/apps/web/app/[locale]/auth/passcode/page.tsx index 79cbc90df..b1ffb51dd 100644 --- a/apps/web/app/[locale]/auth/passcode/page.tsx +++ b/apps/web/app/[locale]/auth/passcode/page.tsx @@ -1,9 +1,9 @@ -import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; +// import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; import AuthPasscode from './component'; -export async function generateStaticParams() { - return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; -} +// export function generateStaticParams() { +// return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; +// } export default function Page() { return ; diff --git a/apps/web/app/[locale]/auth/password/component.tsx b/apps/web/app/[locale]/auth/password/component.tsx index af0015c43..4d87760aa 100644 --- a/apps/web/app/[locale]/auth/password/component.tsx +++ b/apps/web/app/[locale]/auth/password/component.tsx @@ -11,6 +11,7 @@ import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { useCallback, useEffect, useState } from 'react'; import { WorkSpaceComponent } from '../passcode/component'; +import SocialLogins from '../social-logins-buttons'; export default function AuthPassword() { const t = useTranslations(); @@ -36,60 +37,64 @@ function LoginForm({ form }: { form: TAuthenticationPassword }) { const t = useTranslations(); return ( - -
- - {t('pages.authLogin.LOGIN_WITH_PASSWORD')} - - -
- - - -
+
+ + + + {t('pages.authLogin.LOGIN_WITH_PASSWORD')} + +
+ + + +
-
-
-
- - {t('pages.authLogin.LOGIN_WITH_MAGIC_CODE')}. - +
+
+
+ + {t('pages.authLogin.LOGIN_WITH_MAGIC_CODE')}. + +
+ +
+ {t('common.DONT_HAVE_ACCOUNT')} + + {t('common.REGISTER')} + +
-
- {t('common.DONT_HAVE_ACCOUNT')} - - {t('common.REGISTER')} - -
+
- - -
- - + + +
+ +
+
); } diff --git a/apps/web/app/[locale]/auth/password/page.tsx b/apps/web/app/[locale]/auth/password/page.tsx index 9fe342cd3..316a0b2a9 100644 --- a/apps/web/app/[locale]/auth/password/page.tsx +++ b/apps/web/app/[locale]/auth/password/page.tsx @@ -1,9 +1,9 @@ -import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; +// import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; import AuthPassword from './component'; -export async function generateStaticParams() { - return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; -} +// export async function generateStaticParams() { +// return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; +// } export default function Page() { return ; diff --git a/apps/web/app/[locale]/auth/social-logins-buttons.tsx b/apps/web/app/[locale]/auth/social-logins-buttons.tsx new file mode 100644 index 000000000..3555b059b --- /dev/null +++ b/apps/web/app/[locale]/auth/social-logins-buttons.tsx @@ -0,0 +1,44 @@ +import { FaGoogle, FaFacebook, FaTwitter, FaGithub } from 'react-icons/fa'; +import { signInFunction } from './social-logins'; +import { Divider } from 'lib/components'; +import { mappedProviders, providerNames } from '@app/utils/check-provider-env-vars'; + +export default function SocialLogins() { + // For many providers, make sure to add icons in alphabetic order + const providerIcons: { name: string; icon: React.ReactNode }[] = [ + { name: 'facebook', icon: }, + { name: 'google', icon: }, + { name: 'github', icon: }, + { name: 'twitter', icon: } + ].filter((provider) => providerNames[provider.name] !== undefined); + + return mappedProviders.length > 0 ? ( +
+
+ +
Continue with
+ +
+
+ {Object.values(mappedProviders).map((provider, i) => ( +
{ + e.preventDefault(); + signInFunction(provider); + }} + > + +
+ ))} +
+
+ ) : ( + <> + ); +} diff --git a/apps/web/app/[locale]/auth/social-logins.ts b/apps/web/app/[locale]/auth/social-logins.ts new file mode 100644 index 000000000..bed8aa503 --- /dev/null +++ b/apps/web/app/[locale]/auth/social-logins.ts @@ -0,0 +1,11 @@ +'use server'; + +import { signIn, signOut } from '../../../auth'; + +export async function signInFunction(provider: any) { + return await signIn(provider.id, { redirectTo: '/auth/workspace' }); +} + +export async function signOutFunction() { + return await signOut({ redirectTo: '/auth/passcode' }); +} diff --git a/apps/web/app/[locale]/auth/team/page.tsx b/apps/web/app/[locale]/auth/team/page.tsx index 92a1bdd3e..2dceeb787 100644 --- a/apps/web/app/[locale]/auth/team/page.tsx +++ b/apps/web/app/[locale]/auth/team/page.tsx @@ -1,9 +1,9 @@ -import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; +// import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; import AuthTeam from './component'; -export async function generateStaticParams() { - return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; -} +// export async function generateStaticParams() { +// return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; +// } export default function Page() { return ; diff --git a/apps/web/app/[locale]/auth/workspace/component.tsx b/apps/web/app/[locale]/auth/workspace/component.tsx new file mode 100644 index 000000000..a7f0624f5 --- /dev/null +++ b/apps/web/app/[locale]/auth/workspace/component.tsx @@ -0,0 +1,87 @@ +'use client'; + +import { clsxm } from '@app/utils'; +import { AuthLayout } from 'lib/layout'; +import { useTranslations } from 'next-intl'; +import { useRouter } from 'next/navigation'; +import { useCallback, useEffect, useState } from 'react'; +import { WorkSpaceComponent } from '../passcode/component'; +import { useAuthenticationSocialLogin } from '@app/hooks/auth/useAuthenticationSocialLogin'; +import { ISigninEmailConfirmWorkspaces } from '@app/interfaces'; +import Cookies from 'js-cookie'; +import { useSession } from 'next-auth/react'; + +export default function SocialLoginChooseWorspace() { + const t = useTranslations(); + return ( + +
+
+ +
+
+
+ ); +} + +function WorkSpaceScreen() { + const [selectedWorkspace, setSelectedWorkspace] = useState(0); + const [selectedTeam, setSelectedTeam] = useState(''); + const router = useRouter(); + const form = useAuthenticationSocialLogin(); + const { data: session }: any = useSession(); + const [signinResult, setSigninResult] = useState({ + access_token: '', + confirmed_mail: '', + organizationId: '', + refresh_token: { + token: '', + decoded: undefined + }, + tenantId: '', + userId: '' + }); + + const [workspaces, setWorkspaces] = useState([]); + + useEffect(() => { + const loadOAuthSession = async () => { + if (session) { + const { access_token, confirmed_mail, organizationId, refresh_token, tenantId, userId } = session.user; + setSigninResult({ access_token, confirmed_mail, organizationId, refresh_token, tenantId, userId }); + setWorkspaces(session.user.workspaces); + } else { + return; + } + }; + loadOAuthSession(); + }, [session]); + + const signInToWorkspace = (e: any) => { + e.preventDefault(); + updateOAuthSession(); + + new Array(3).fill('').forEach((_, i) => { + Cookies.remove(`authjs.session-token.${i}`); + }); + }; + + const updateOAuthSession = useCallback(() => { + form.updateOAuthSession(signinResult, workspaces, selectedWorkspace, selectedTeam); + }, [form, selectedTeam, selectedWorkspace, signinResult, workspaces]); + + return ( + { + router.back(); + }} + selectedWorkspace={selectedWorkspace} + setSelectedWorkspace={setSelectedWorkspace} + setSelectedTeam={setSelectedTeam} + selectedTeam={selectedTeam} + signInWorkspaceLoading={form.signInWorkspaceLoading} + /> + ); +} diff --git a/apps/web/app/[locale]/auth/workspace/page.tsx b/apps/web/app/[locale]/auth/workspace/page.tsx new file mode 100644 index 000000000..7577bbffb --- /dev/null +++ b/apps/web/app/[locale]/auth/workspace/page.tsx @@ -0,0 +1,5 @@ +import SocialLoginChooseWorspace from './component'; + +export default function Page() { + return ; +} diff --git a/apps/web/app/[locale]/board/page.tsx b/apps/web/app/[locale]/board/page.tsx index 832a406e6..5c533358b 100644 --- a/apps/web/app/[locale]/board/page.tsx +++ b/apps/web/app/[locale]/board/page.tsx @@ -1,9 +1,9 @@ -import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; +// import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; import BoardPage from './component'; -export async function generateStaticParams() { - return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; -} +// export async function generateStaticParams() { +// return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; +// } export default function Page() { return ; diff --git a/apps/web/app/[locale]/integration/github/page.tsx b/apps/web/app/[locale]/integration/github/page.tsx index 01902a261..1d4ab0d54 100644 --- a/apps/web/app/[locale]/integration/github/page.tsx +++ b/apps/web/app/[locale]/integration/github/page.tsx @@ -1,9 +1,9 @@ -import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; +// import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; import GitHubPage from './component'; -export async function generateStaticParams() { - return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; -} +// export async function generateStaticParams() { +// return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; +// } export default function Page() { return ; diff --git a/apps/web/app/[locale]/kanban/page.tsx b/apps/web/app/[locale]/kanban/page.tsx index 98bb89d51..a514c49a4 100644 --- a/apps/web/app/[locale]/kanban/page.tsx +++ b/apps/web/app/[locale]/kanban/page.tsx @@ -5,9 +5,9 @@ import { useAuthenticateUser, useModal, useOrganizationTeams } from '@app/hooks' import { useKanban } from '@app/hooks/features/useKanban'; import KanbanBoardSkeleton from '@components/shared/skeleton/KanbanBoardSkeleton'; import { withAuthentication } from 'lib/app/authenticator'; -import { Breadcrumb, Container } from 'lib/components'; +import { Breadcrumb, Container, Divider } from 'lib/components'; import { KanbanView } from 'lib/features/team-members-kanban-view'; -import { MainLayout } from 'lib/layout'; +import { Footer, MainLayout } from 'lib/layout'; import { useState } from 'react'; import { useTranslations } from 'next-intl'; import { useParams } from 'next/navigation'; @@ -32,6 +32,8 @@ import { useRecoilValue } from 'recoil'; import { fullWidthState } from '@app/stores/fullWidth'; import { CircleIcon } from 'lucide-react'; import { XMarkIcon } from '@heroicons/react/20/solid'; +import Head from 'next/head'; +import { clsxm } from '@app/utils'; const Kanban = () => { const { @@ -85,11 +87,21 @@ const Kanban = () => { }); return ( <> - -
-
+ + + {t('common.KANBAN')} {t('common.BOARD')} + + + +
+
-
+
@@ -98,7 +110,7 @@ const Kanban = () => {
-
+

{t('common.KANBAN')} {t('common.BOARD')}

@@ -124,7 +136,7 @@ const Kanban = () => {
-
+
{tabs.map((tab) => (
{ {/*
*/}
-
+
{/** TODO:fetch teamtask based on days */} {activeTab && ( // add filter for today, yesterday and tomorrow
@@ -238,6 +250,11 @@ const Kanban = () => { )}
+
+ + +
+
); diff --git a/apps/web/app/[locale]/layout.tsx b/apps/web/app/[locale]/layout.tsx index 3e30ff716..5586b1718 100644 --- a/apps/web/app/[locale]/layout.tsx +++ b/apps/web/app/[locale]/layout.tsx @@ -4,7 +4,7 @@ import clsx from 'clsx'; import { notFound, useRouter } from 'next/navigation'; import { ReactNode, useEffect } from 'react'; -import { usePathname } from 'next/navigation'; +import { usePathname, useSearchParams } from 'next/navigation'; import { NextIntlClientProvider } from 'next-intl'; import { RecoilRoot } from 'recoil'; import { AppState } from 'lib/app/init-state'; @@ -17,7 +17,6 @@ import { JitsuOptions } from '@jitsu/jitsu-react/dist/useJitsu'; import { useCheckAPI } from '@app/hooks/useCheckAPI'; const locales = ['en', 'de', 'ar', 'bg', 'zh', 'nl', 'de', 'he', 'it', 'pl', 'pt', 'ru', 'es', 'fr']; - interface Props { children: ReactNode; params: { locale: string }; @@ -32,6 +31,7 @@ interface Props { import { Poppins } from 'next/font/google'; import GlobalSkeleton from '@components/ui/global-skeleton'; +import NextAuthSessionProvider from 'lib/layout/next-auth-provider'; const poppins = Poppins({ subsets: ['latin'], @@ -56,9 +56,45 @@ const LocaleLayout = ({ children, params: { locale }, pageProps }: Props) => { if (!locales.includes(locale as any)) notFound(); const router = useRouter(); const pathname = usePathname(); + const searchParams = useSearchParams(); const { isApiWork, loading } = useCheckAPI(); // Enable static rendering // unstable_setRequestLocale(locale); + const formatTitle = (url: string) => { + // Separate the URL into pathname and query parts + const [pathname, queryString] = url.split('?'); + + // Ignore language codes or any initial two-letter or specific codes like 'ru', 'ur' + const segments = pathname + .split('/') + .filter((seg) => seg && seg.length > 2) + .map((seg) => { + // Replace dashes with spaces in the segment if it looks like a UUID or has digits (likely an ID) + if (seg.includes('-') || /\d/.test(seg)) { + return ''; // Exclude IDs from title + } + return seg.charAt(0).toUpperCase() + seg.slice(1).toLowerCase(); // Capitalize non-ID segments + }) + .filter((seg: string) => seg); // Remove empty strings resulting from ID exclusion + + // Process query parameters, specifically looking for 'name' + let namePart = ''; + if (queryString) { + const params = new URLSearchParams(queryString); + if (params?.get('name')) { + const name = params.get('name') ?? ''; + const nameValue = name.charAt(0).toUpperCase() + name.slice(1).toLowerCase(); + namePart = nameValue; + } + } + + // Combine the pathname segments with the name part, if present + const title = [...segments, namePart].filter((part) => part).join(' | '); + + return title; + }; + + const name = searchParams?.get('name'); // eslint-disable-next-line @typescript-eslint/no-var-requires const messages = require(`../../messages/${locale}.json`); @@ -69,6 +105,9 @@ const LocaleLayout = ({ children, params: { locale }, pageProps }: Props) => { }, [isApiWork, loading, router, pathname]); return ( + + {formatTitle(`${pathname}${name ? `?name=${name}` : ''}`) || 'Home'} + {/* @@ -86,18 +125,25 @@ const LocaleLayout = ({ children, params: { locale }, pageProps }: Props) => { */} - - - {loading ? ( - - ) : ( - <> - - {children} - - )} - - + + + + {loading && !pathname?.startsWith('/auth') ? ( + + ) : ( + <> + + {children} + + )} + + + diff --git a/apps/web/app/[locale]/meet/page.tsx b/apps/web/app/[locale]/meet/page.tsx index 10f29fab0..c31eaeced 100644 --- a/apps/web/app/[locale]/meet/page.tsx +++ b/apps/web/app/[locale]/meet/page.tsx @@ -1,10 +1,10 @@ -import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; +// import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; import MeetPage from './component'; export default function Page() { return ; } -export async function generateStaticParams() { - return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; -} +// export async function generateStaticParams() { +// return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; +// } diff --git a/apps/web/app/[locale]/page-component.tsx b/apps/web/app/[locale]/page-component.tsx index 17892dd2a..df67c6220 100644 --- a/apps/web/app/[locale]/page-component.tsx +++ b/apps/web/app/[locale]/page-component.tsx @@ -7,9 +7,9 @@ import { useOrganizationTeams } from '@app/hooks'; import { clsxm } from '@app/utils'; import NoTeam from '@components/pages/main/no-team'; import { withAuthentication } from 'lib/app/authenticator'; -import { Breadcrumb, Card } from 'lib/components'; +import { Breadcrumb, Card, Divider } from 'lib/components'; import { AuthUserTaskInput, TeamInvitations, TeamMembers, Timer, UnverifiedEmail } from 'lib/features'; -import { MainHeader, MainLayout } from 'lib/layout'; +import { Footer, MainLayout } from 'lib/layout'; import { IssuesView } from '@app/constants'; import { useNetworkState } from '@uidotdev/usehooks'; import Offline from '@components/pages/offline'; @@ -59,29 +59,45 @@ function MainPage() { } return ( <> - - - -
-
- - +
+
+ + +
+ {/* */} +
+
+
+
+ + +
+
+ +
+
+
+ + + {isTeamMember ? ( + + ) : null} +
+ +
+
+ {/*
*/} + {isTeamMember ? : }
-
- -
-
- - - - {isTeamMember ? : null} - - - - {/*
*/} - {isTeamMember ? : } - - + +
+
+ +
+
+
); diff --git a/apps/web/app/[locale]/page.tsx b/apps/web/app/[locale]/page.tsx index d14938210..8ce160415 100644 --- a/apps/web/app/[locale]/page.tsx +++ b/apps/web/app/[locale]/page.tsx @@ -1,9 +1,8 @@ -import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; import MainPage from './page-component'; -export async function generateStaticParams() { - return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; -} +// export async function generateStaticParams() { +// return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; +// } export default function Page() { return ; diff --git a/apps/web/app/[locale]/permissions/page.tsx b/apps/web/app/[locale]/permissions/page.tsx index 3cb2520a5..678ea17f5 100644 --- a/apps/web/app/[locale]/permissions/page.tsx +++ b/apps/web/app/[locale]/permissions/page.tsx @@ -1,10 +1,10 @@ -import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; +// import { APPLICATION_DEFAULT_LANGUAGE } from '@app/constants'; import PermissionPage from './component'; export default function Page() { return ; } -export async function generateStaticParams() { - return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; -} +// export async function generateStaticParams() { +// return [{ locale: APPLICATION_DEFAULT_LANGUAGE }]; +// } diff --git a/apps/web/app/[locale]/profile/[memberId]/page.tsx b/apps/web/app/[locale]/profile/[memberId]/page.tsx index ba39e11d6..49355dc2e 100644 --- a/apps/web/app/[locale]/profile/[memberId]/page.tsx +++ b/apps/web/app/[locale]/profile/[memberId]/page.tsx @@ -2,12 +2,12 @@ /* eslint-disable no-mixed-spaces-and-tabs */ import { imgTitle } from '@app/helpers'; -import { useAuthenticateUser, useOrganizationTeams, useTimer, useUserProfilePage } from '@app/hooks'; +import { useAuthenticateUser, useDailyPlan, useOrganizationTeams, useTimer, useUserProfilePage } from '@app/hooks'; import { ITimerStatusEnum, OT_Member } from '@app/interfaces'; import { clsxm, isValidUrl } from '@app/utils'; import clsx from 'clsx'; import { withAuthentication } from 'lib/app/authenticator'; -import { Avatar, Breadcrumb, Container, Text, VerticalSeparator } from 'lib/components'; +import { Avatar, Breadcrumb, Button, Container, Text, VerticalSeparator } from 'lib/components'; import { ArrowLeftIcon } from 'assets/svg'; import { TaskFilter, Timer, TimerStatus, UserProfileTask, getTimerStatusValue, useTaskFilter } from 'lib/features'; import { MainHeader, MainLayout } from 'lib/layout'; @@ -23,16 +23,18 @@ import { AppsTab } from 'lib/features/activity/apps'; import { VisitedSitesTab } from 'lib/features/activity/visited-sites'; import { activityTypeState } from '@app/stores/activity-type'; -type FilterTab = 'Tasks' | 'Screenshots' | 'Apps' | 'Visited Sites'; +export type FilterTab = 'Tasks' | 'Screenshots' | 'Apps' | 'Visited Sites'; const Profile = React.memo(function ProfilePage({ params }: { params: { memberId: string } }) { const profile = useUserProfilePage(); + const { user } = useAuthenticateUser(); const { isTrackingEnabled, activeTeam, activeTeamManagers } = useOrganizationTeams(); + const members = activeTeam?.members; + const { getEmployeeDayPlans } = useDailyPlan(); const fullWidth = useRecoilValue(fullWidthState); const [activityFilter, setActivityFilter] = useState('Tasks'); const setActivityTypeFilter = useSetRecoilState(activityTypeState); - const hook = useTaskFilter(profile); const isManagerConnectedUser = activeTeamManagers.findIndex((member) => member.employee?.user?.id == user?.id); @@ -69,68 +71,98 @@ const Profile = React.memo(function ProfilePage({ params }: { params: { memberId // eslint-disable-next-line react-hooks/exhaustive-deps }, [profile.member]); + React.useEffect(() => { + console.log(profile.member?.employeeId); + getEmployeeDayPlans(profile.member?.employeeId ?? ''); + }, [getEmployeeDayPlans, profile.member?.employeeId]); + return ( <> - - - {/* Breadcrumb */} -
- - - - - -
- - {/* User Profile Detail */} -
- - - {profileIsAuthUser && isTrackingEnabled && ( - - )} + {Array.isArray(members) && members.length && !profile.member ? ( + +
+
+ + {t('common.MEMBER')} {t('common.NOT_FOUND')}! + + + + {t('pages.profile.MEMBER_NOT_FOUND_MSG_1')} + + + {t('pages.profile.MEMBER_NOT_FOUND_MSG_1')} + + + +
+
+ ) : ( + + + {/* Breadcrumb */} +
+ + + - {/* TaskFilter */} - - - {/* Divider */} -
- {hook.tab == 'worked' && canSeeActivity && ( - -
- {Object.keys(activityScreens).map((filter, i) => ( -
- {i !== 0 && } -
changeActivityFilter(filter as FilterTab)} - > - {filter} -
-
- ))} +
-
- )} - - {hook.tab !== 'worked' || activityFilter == 'Tasks' ? ( - - ) : ( - activityScreens[activityFilter] ?? null + {/* User Profile Detail */} +
+ + + {profileIsAuthUser && isTrackingEnabled && ( + + )} +
+ {/* TaskFilter */} + + + {/* Divider */} +
+ {hook.tab == 'worked' && canSeeActivity && ( + +
+ {Object.keys(activityScreens).map((filter, i) => ( +
+ {i !== 0 && } +
changeActivityFilter(filter as FilterTab)} + > + {filter} +
+
+ ))} +
+
)} -
- + + + {hook.tab !== 'worked' || activityFilter == 'Tasks' ? ( + + ) : ( + activityScreens[activityFilter] ?? null + )} + + + )} ); }); @@ -150,7 +182,7 @@ function UserProfileDetail({ member }: { member?: OT_Member }) {
{ const t = useTranslations(); const [user] = useRecoilState(userState); const fullWidth = useRecoilValue(fullWidthState); - + const pathName = usePathname(); + const getEndPath: any = pathName?.split('settings/')[1]; + const endWord: 'TEAM' | 'PERSONAL' = getEndPath?.toUpperCase(); const breadcrumb = [ { title: JSON.parse(t('pages.home.BREADCRUMB')), href: '/' }, - { title: JSON.parse(t('pages.settings.BREADCRUMB')), href: '/settings/personnal' } + { title: t('common.SETTINGS'), href: pathName as string }, + { title: t(`common.${endWord}`), href: pathName as string } ]; + if (!user) { return ; } else { @@ -33,23 +38,19 @@ const SettingsLayout = ({ children }: { children: JSX.Element }) => {
- {/*
*/} + className={clsxm('w-full mt-4 flex flex-row items-center justify-start gap-8')} + > - - {/*
*/} +
- +
-
- -
-
{children}
+ +
{children}
diff --git a/apps/web/app/[locale]/settings/personal/page.tsx b/apps/web/app/[locale]/settings/personal/page.tsx index 1bc0a9065..4a2585354 100644 --- a/apps/web/app/[locale]/settings/personal/page.tsx +++ b/apps/web/app/[locale]/settings/personal/page.tsx @@ -19,7 +19,7 @@ const Personal = () => { {/* diff --git a/apps/web/app/[locale]/settings/team/page.tsx b/apps/web/app/[locale]/settings/team/page.tsx index 2fee89912..9044cd372 100644 --- a/apps/web/app/[locale]/settings/team/page.tsx +++ b/apps/web/app/[locale]/settings/team/page.tsx @@ -10,20 +10,24 @@ import { userState } from '@app/stores'; import NoTeam from '@components/pages/main/no-team'; import Link from 'next/link'; import { useTranslations } from 'next-intl'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useSetRecoilState } from 'recoil'; import { Accordian } from 'lib/components/accordian'; import { IntegrationSetting } from 'lib/settings/integration-setting'; import { InvitationSetting } from 'lib/settings/invitation-setting'; import { IssuesSettings } from 'lib/settings/issues-settings'; import { MemberSetting } from 'lib/settings/member-setting'; +import { activeSettingTeamTab } from '@app/stores/setting'; +import { InteractionObserverVisible } from '@components/pages/setting/interaction-observer'; const Team = () => { const t = useTranslations(); + + const setActiveTeam = useSetRecoilState(activeSettingTeamTab); const [user] = useRecoilState(userState); const { isTeamMember, activeTeam } = useOrganizationTeams(); const { isTeamManager } = useIsMemberManager(user); return ( -
+
{isTeamMember ? ( <> @@ -32,57 +36,62 @@ const Team = () => { {/* General Settings */} - -
- - -
-
- - {/* Invitations */} - {isTeamManager ? ( + - +
+ + +
+
+ + {/* Invitations */} + {isTeamManager ? ( + + + + + ) : null} {/* Members */} {isTeamManager ? ( - - - + + + + + ) : null} {isTeamManager && ( - - - + + + + + )} {/* Issues Settings */} - - - + + + + + {/* TODO */} {/* Notification Settings */} @@ -94,14 +103,15 @@ const Team = () => { */} {/* Danger Zone */} - - - + + + + + ) : (
diff --git a/apps/web/app/api/auth/[...nextauth]/route.ts b/apps/web/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 000000000..608e25d71 --- /dev/null +++ b/apps/web/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,2 @@ +import { handlers } from '../../../../auth'; +export const { GET, POST } = handlers; diff --git a/apps/web/app/api/auth/register/route.ts b/apps/web/app/api/auth/register/route.ts index c5ae81330..658fefb2b 100644 --- a/apps/web/app/api/auth/register/route.ts +++ b/apps/web/app/api/auth/register/route.ts @@ -8,8 +8,8 @@ import { createTenantRequest, createTenantSmtpRequest, loginUserRequest, - registerUserRequest, - refreshTokenRequest + refreshTokenRequest, + registerUserRequest } from '@app/services/server/requests'; import { setAuthCookies } from '@app/helpers/cookies'; import { recaptchaVerification } from '@app/services/server/recaptcha'; @@ -18,7 +18,7 @@ import { NextResponse } from 'next/server'; export async function POST(req: Request) { const url = new URL(req.url); - const res = new NextResponse(); + const response = new NextResponse(); const appEmailConfirmationUrl = `${url.origin}${VERIFY_EMAIL_CALLBACK_PATH}`; @@ -62,6 +62,8 @@ export async function POST(req: Request) { const password = generateToken(8); const names = body.name.split(' '); + console.log('Random password: ', password); + // Register user const { data: user } = await registerUserRequest({ password: password, @@ -137,8 +139,8 @@ export async function POST(req: Request) { languageId: 'en', // TODO: not sure what should be here userId: user.id }, - { req, res } + { req, res: response } ); - return NextResponse.json({ loginRes, team, employee }); + return response; } diff --git a/apps/web/app/api/auth/signin-email-social-login/route.ts b/apps/web/app/api/auth/signin-email-social-login/route.ts new file mode 100644 index 000000000..d42837f62 --- /dev/null +++ b/apps/web/app/api/auth/signin-email-social-login/route.ts @@ -0,0 +1,12 @@ +import { signWithSocialLoginsRequest } from '@app/services/server/requests'; +import { ProviderEnum } from '@app/services/server/requests/OAuth'; + +import { NextResponse } from 'next/server'; + +export async function POST(req: Request) { + const body = (await req.json()) as { provider: ProviderEnum; access_token: string }; + + const { data } = await signWithSocialLoginsRequest(body.provider, body.access_token); + + return NextResponse.json(data); +} diff --git a/apps/web/app/api/daily-plan/[id]/route.ts b/apps/web/app/api/daily-plan/[id]/route.ts new file mode 100644 index 000000000..e5cb724e2 --- /dev/null +++ b/apps/web/app/api/daily-plan/[id]/route.ts @@ -0,0 +1,65 @@ +import { NextResponse } from 'next/server'; +import { authenticatedGuard } from '@app/services/server/guards/authenticated-guard-app'; +import { deleteDailyPlanRequest, getDayPlansByEmployee, updatePlanRequest } from '@app/services/server/requests'; +import { INextParams, IUpdateDailyPlan } from '@app/interfaces'; + +export async function GET(req: Request, { params }: INextParams) { + const res = new NextResponse(); + const { id } = params; + if (!id) { + return; + } + + const { $res, user, tenantId, organizationId, access_token } = await authenticatedGuard(req, res); + if (!user) return $res('Unauthorized'); + + const response = await getDayPlansByEmployee({ + bearer_token: access_token, + employeeId: id, + organizationId, + tenantId + }); + + return $res(response.data); +} + +export async function PUT(req: Request, { params }: INextParams) { + const res = new NextResponse(); + const { id } = params; + if (!id) { + return; + } + + const { $res, user, access_token, tenantId } = await authenticatedGuard(req, res); + + if (!user) return $res('Unauthorized'); + + const body = (await req.json()) as unknown as IUpdateDailyPlan; + + const response = await updatePlanRequest({ + bearer_token: access_token, + data: body, + planId: id, + tenantId + }); + + return $res(response.data); +} + +export async function DELETE(req: Request, { params }: INextParams) { + const res = new NextResponse(); + const { id } = params; + if (!id) { + return; + } + + const { $res, user, access_token } = await authenticatedGuard(req, res); + if (!user) return $res('Unauthorized'); + + const response = await deleteDailyPlanRequest({ + planId: id, + bearer_token: access_token + }); + + return $res(response.data); +} diff --git a/apps/web/app/api/daily-plan/plan/[planId]/route.ts b/apps/web/app/api/daily-plan/plan/[planId]/route.ts new file mode 100644 index 000000000..acdb8064d --- /dev/null +++ b/apps/web/app/api/daily-plan/plan/[planId]/route.ts @@ -0,0 +1,50 @@ +import { IDailyPlanTasksUpdate, INextParams } from '@app/interfaces'; +import { authenticatedGuard } from '@app/services/server/guards/authenticated-guard-app'; +import { addTaskToDailyPlanRequest, removeTaskFromPlanRequest } from '@app/services/server/requests'; +import { NextResponse } from 'next/server'; + +export async function POST(req: Request, { params }: INextParams) { + const res = new NextResponse(); + + const { planId } = params; + if (!planId) { + return; + } + + const { $res, user, tenantId, access_token } = await authenticatedGuard(req, res); + if (!user) return $res('Unauthorized'); + + const body = (await req.json()) as unknown as IDailyPlanTasksUpdate; + + const response = await addTaskToDailyPlanRequest({ + bearer_token: access_token, + data: body, + planId, + tenantId + }); + + return $res(response.data); +} + +export async function PUT(req: Request, { params }: INextParams) { + const res = new NextResponse(); + + const { planId } = params; + if (!planId) { + return; + } + + const { $res, user, tenantId, access_token } = await authenticatedGuard(req, res); + if (!user) return $res('Unauthorized'); + + const body = (await req.json()) as unknown as IDailyPlanTasksUpdate; + + const response = await removeTaskFromPlanRequest({ + data: body, + planId, + tenantId, + bearer_token: access_token + }); + + return $res(response.data); +} diff --git a/apps/web/app/api/daily-plan/route.ts b/apps/web/app/api/daily-plan/route.ts new file mode 100644 index 000000000..e186506c8 --- /dev/null +++ b/apps/web/app/api/daily-plan/route.ts @@ -0,0 +1,32 @@ +import { ICreateDailyPlan } from '@app/interfaces'; +import { authenticatedGuard } from '@app/services/server/guards/authenticated-guard-app'; +import { createPlanRequest, getAllDayPlans } from '@app/services/server/requests'; +import { NextResponse } from 'next/server'; + +export async function POST(req: Request) { + const res = new NextResponse(); + const { $res, user, access_token: bearer_token, tenantId } = await authenticatedGuard(req, res); + + if (!user) return $res('Unauthorized'); + + const body = (await req.json()) as unknown as ICreateDailyPlan; + + const response = await createPlanRequest({ data: body, bearer_token, tenantId }); + + return $res(response.data); +} + +export async function GET(req: Request) { + const res = new NextResponse(); + + const { $res, user, tenantId, organizationId, access_token } = await authenticatedGuard(req, res); + if (!user) return $res('Unauthorized'); + + const response = await getAllDayPlans({ + bearer_token: access_token, + organizationId, + tenantId + }); + + return $res(response.data); +} diff --git a/apps/web/app/api/daily-plan/task/[taskId]/route.ts b/apps/web/app/api/daily-plan/task/[taskId]/route.ts new file mode 100644 index 000000000..3ee5a4878 --- /dev/null +++ b/apps/web/app/api/daily-plan/task/[taskId]/route.ts @@ -0,0 +1,25 @@ +import { INextParams } from '@app/interfaces'; +import { authenticatedGuard } from '@app/services/server/guards/authenticated-guard-app'; +import { getPlansByTask } from '@app/services/server/requests'; +import { NextResponse } from 'next/server'; + +export async function GET(req: Request, { params }: INextParams) { + const res = new NextResponse(); + const { taskId } = params; + if (!taskId) { + return; + } + + const { $res, user, tenantId, organizationId, access_token } = await authenticatedGuard(req, res); + + if (!user) return $res('Unauthorized'); + + const response = await getPlansByTask({ + taskId, + bearer_token: access_token, + organizationId, + tenantId + }); + + return $res(response.data); +} diff --git a/apps/web/app/api/roles/options/route.ts b/apps/web/app/api/roles/options/route.ts new file mode 100644 index 000000000..a365603b7 --- /dev/null +++ b/apps/web/app/api/roles/options/route.ts @@ -0,0 +1,84 @@ +import { INVITE_CALLBACK_URL, INVITE_CALLBACK_PATH } from '@app/constants'; +import { validateForm } from '@app/helpers/validations'; +import { IInviteRequest } from '@app/interfaces/IInvite'; +import { authenticatedGuard } from '@app/services/server/guards/authenticated-guard-app'; +import { + getEmployeeRoleRequest, + getTeamInvitationsRequest, + inviteByEmailsRequest +} from '@app/services/server/requests'; +import { NextResponse } from 'next/server'; + +export async function GET(req: Request) { + const res = new NextResponse(); + const { $res, user, access_token, tenantId } = await authenticatedGuard(req, res); + if (!user) return NextResponse.json({ errors: 'Unauthorized' }, { status: 401 }); + + const { data: employeeRole } = await getEmployeeRoleRequest({ + tenantId, + role: 'EMPLOYEE', + bearer_token: access_token + }); + + return $res(employeeRole); +} + +export async function POST(req: Request) { + const res = new NextResponse(); + const { $res, user, organizationId, access_token, teamId, tenantId } = await authenticatedGuard(req, res); + if (!user) return NextResponse.json({ errors: 'Unauthorized' }, { status: 401 }); + + const { origin } = new URL(req.url); + + const callbackUrl = `${origin}${INVITE_CALLBACK_PATH}`; + + const body = (await req.json()) as IInviteRequest; + + const { errors, isValid: formValid } = validateForm(['email', 'name'], body); + + if (!formValid) { + return NextResponse.json({ errors }, { status: 400 }); + } + + const { data: employeeRole } = await getEmployeeRoleRequest({ + tenantId, + role: 'EMPLOYEE', + bearer_token: access_token + }); + + const date = new Date(); + + date.setDate(date.getDate() - 1); + + await inviteByEmailsRequest( + { + emailIds: [body.email], + projectIds: [], + departmentIds: [], + organizationContactIds: [], + teamIds: [teamId], + roleId: employeeRole?.id || '', + invitationExpirationPeriod: 'Never', + inviteType: 'TEAM', + appliedDate: null, + fullName: body.name, + callbackUrl: INVITE_CALLBACK_URL || callbackUrl, + organizationId, + tenantId, + startedWorkOn: date.toISOString() + }, + access_token + ); + + const { data } = await getTeamInvitationsRequest( + { + tenantId, + teamId, + organizationId, + role: 'EMPLOYEE' + }, + access_token + ); + + return $res(data); +} diff --git a/apps/web/app/constants.ts b/apps/web/app/constants.ts index 5cffc679d..efcb8d3dd 100644 --- a/apps/web/app/constants.ts +++ b/apps/web/app/constants.ts @@ -2,7 +2,8 @@ import { JitsuOptions } from '@jitsu/jitsu-react/dist/useJitsu'; import { I_SMTPRequest } from './interfaces/ISmtp'; import { getNextPublicEnv } from './env'; import enLanguage from '../messages/en.json'; - +// import { } from 'country-flag-icons/react/3x2' +import { BG, CN, DE, ES, FR, IS, IT, NL, PL, PT, RU, SA, US } from 'country-flag-icons/react/1x1'; export const API_BASE_URL = '/api'; export const DEFAULT_APP_PATH = '/auth/passcode'; export const DEFAULT_MAIN_PATH = '/'; @@ -194,3 +195,71 @@ export enum IssuesView { export const TaskStatus = { INPROGRESS: 'in-progress' }; + +export const languagesFlags = [ + { + Flag: US, + country: 'United Kingdom', + code: 'en' + }, + { + Flag: CN, + country: 'China', + code: 'zh' + }, + { + Flag: ES, + country: 'Spain', + code: 'es' + }, + { + Flag: RU, + country: 'Russia', + code: 'ru' + }, + { + Flag: PT, + country: 'Portugal', + code: 'pt' + }, + { + Flag: IT, + country: 'Italy', + code: 'it' + }, + { + Flag: DE, + country: 'Germany', + code: 'de' + }, + { + Flag: BG, + country: 'Bulgaria', + code: 'bg' + }, + { + Flag: SA, + country: 'Saudi Arabia', + code: 'ar' + }, + { + Flag: NL, + country: 'Netherlands', + code: 'nl' + }, + { + Flag: FR, + country: 'France', + code: 'fr' + }, + { + Flag: PL, + country: 'Poland', + code: 'pl' + }, + { + Flag: IS, + country: 'Israel', + code: 'he' + } +]; diff --git a/apps/web/app/helpers/cookies/index.ts b/apps/web/app/helpers/cookies/index.ts index 431e42694..44629f59a 100644 --- a/apps/web/app/helpers/cookies/index.ts +++ b/apps/web/app/helpers/cookies/index.ts @@ -40,8 +40,7 @@ type NextCtx = { export const setLargeStringInCookies = ( COOKIE_NAME: string, largeString: string, - req: any, - res: any, + ctx: NextCtx | undefined, crossSite = false ) => { const chunkSize = 4000; @@ -50,10 +49,10 @@ export const setLargeStringInCookies = ( chunks.forEach((chunk, index) => { const cookieValue = chunk.join(''); - setCookie(`${COOKIE_NAME}${index}`, cookieValue, { res, req }, crossSite); + setCookie(`${COOKIE_NAME}${index}`, cookieValue, ctx, crossSite); }); - setCookie(`${COOKIE_NAME}_totalChunks`, chunks.length, { res, req }, crossSite); + setCookie(`${COOKIE_NAME}_totalChunks`, chunks.length, ctx, crossSite); }; export const getLargeStringFromCookies = (COOKIE_NAME: string, ctx?: NextCtx) => { @@ -95,12 +94,12 @@ export function setAuthCookies(datas: DataParams, ctx?: NextCtx) { // Handle Large Access Token // Cookie can support upto 4096 characters only! if (access_token.length <= 4096) { - setCookie(TOKEN_COOKIE_NAME, access_token, ctx, true); // cross site cookie + setCookie(TOKEN_COOKIE_NAME, access_token, ctx); // cross site cookie } else { - setLargeStringInCookies(TOKEN_COOKIE_NAME, access_token, ctx?.req, ctx?.res, true); // cross site cookie + setLargeStringInCookies(TOKEN_COOKIE_NAME, access_token, ctx); // cross site cookie } - setCookie(REFRESH_TOKEN_COOKIE_NAME, refresh_token.token, ctx, true); // cross site cookie + setCookie(REFRESH_TOKEN_COOKIE_NAME, refresh_token.token, ctx); // cross site cookie setCookie(ACTIVE_TEAM_COOKIE_NAME, teamId, ctx); setCookie(TENANT_ID_COOKIE_NAME, tenantId, ctx); setCookie(ORGANIZATION_ID_COOKIE_NAME, organizationId, ctx); diff --git a/apps/web/app/helpers/date.ts b/apps/web/app/helpers/date.ts index 06e44c3a8..ace5da630 100644 --- a/apps/web/app/helpers/date.ts +++ b/apps/web/app/helpers/date.ts @@ -115,3 +115,38 @@ export const calculateRemainingDays = (startDate: string, endDate: string): numb return moment(endDate).diff(startDate, 'days'); }; + +export const tomorrowDate = moment().add(1, 'days').toDate(); + +export const yesterdayDate = moment().subtract(1, 'days').toDate(); + +export const formatDayPlanDate = (dateString: string | Date, format?: string) => { + if (dateString.toString().length > 10) { + dateString = dateString.toString().split('T')[0]; + } + const date = moment(dateString, 'YYYY-MM-DD'); + + if (date.isSame(moment(), 'day')) return 'Today'; + if (date.isSame(moment().add(1, 'day'), 'day')) return 'Tomorrow'; + if (date.isSame(moment().subtract(1, 'day'), 'day')) return 'Yesterday'; + if (format === 'DD MMM YYYY') return formatDateString(dateString.toString()); + return date.format('dddd, MMMM DD, YYYY'); +}; + +// Formats a given number into hours +export const formatIntegerToHour = (number: number) => { + // Separate decimal and in parts + const integerPart = Math.floor(number); + const decimalPart = number - integerPart; + + // Format int part with 'h' + let formattedHour = `${integerPart}h`; + + // if the decimal part is not zero, add minutes + if (decimalPart !== 0) { + const minutes = Math.round(decimalPart * 60); + formattedHour += `${minutes < 10 ? '0' : ''}${minutes}m`; + } + + return formattedHour; +}; diff --git a/apps/web/app/helpers/index.ts b/apps/web/app/helpers/index.ts index 681b8e9f1..5ec7a1bb8 100644 --- a/apps/web/app/helpers/index.ts +++ b/apps/web/app/helpers/index.ts @@ -8,3 +8,4 @@ export * from './regex'; export * from './validations'; export * from './colors'; export * from './strings'; +export * from './plan-day-badge'; diff --git a/apps/web/app/helpers/plan-day-badge.ts b/apps/web/app/helpers/plan-day-badge.ts new file mode 100644 index 000000000..b40497c5d --- /dev/null +++ b/apps/web/app/helpers/plan-day-badge.ts @@ -0,0 +1,25 @@ +import { IDailyPlan, ITeamTask } from '@app/interfaces'; +import { formatDayPlanDate } from './date'; + +export const planBadgeContent = (plans: IDailyPlan[], taskId: ITeamTask['id']): string | null => { + // Search a plan that contains a given task + const plan = plans.find((plan) => plan.tasks?.some((task) => task.id === taskId)); + + // If at least one plan have this task + if (plan) { + // Check if the task appears in other plans + const otherPlansWithTask = plans.filter( + (pl) => pl.id !== plan.id && pl.tasks?.some((tsk) => tsk.id === taskId) + ); + + // If the task exists in other plans, the its planned many days + if (otherPlansWithTask.length > 0) { + return 'Planned'; + } else { + return `Planned ${formatDayPlanDate(plan.date, 'DD MMM YYYY')}`; + } + // The task does not exist in any plan + } else { + return null; + } +}; diff --git a/apps/web/app/helpers/validations.ts b/apps/web/app/helpers/validations.ts index d0db0fa89..df20293ff 100644 --- a/apps/web/app/helpers/validations.ts +++ b/apps/web/app/helpers/validations.ts @@ -24,7 +24,7 @@ export const authFormValidate = (keys: (keyof IRegisterDataAPI)[], values: IRegi } break; case 'recaptcha': - if (RECAPTCHA_SITE_KEY) { + if (RECAPTCHA_SITE_KEY?.value) { if (!values['recaptcha'] || values['recaptcha'].trim().length < 2) { err['recaptcha'] = 'Please check the ReCaptcha checkbox before continue'; } diff --git a/apps/web/app/hooks/auth/useAuthenticationPasscode.ts b/apps/web/app/hooks/auth/useAuthenticationPasscode.ts index 986a9c46c..e51746f1e 100644 --- a/apps/web/app/hooks/auth/useAuthenticationPasscode.ts +++ b/apps/web/app/hooks/auth/useAuthenticationPasscode.ts @@ -21,11 +21,11 @@ type AuthCodeRef = { }; export function useAuthenticationPasscode() { + const router = useRouter(); const pathname = usePathname(); const query = useSearchParams(); - const queryTeamId = useMemo(() => { - return query?.get('teamId'); - }, [query]); + + const queryTeamId = query?.get('teamId'); const queryEmail = useMemo(() => { const emailQuery = query?.get('email') || ''; @@ -52,7 +52,6 @@ export function useAuthenticationPasscode() { }); const [errors, setErrors] = useState({} as { [x: string]: any }); - const router = useRouter(); // Queries const { queryCall: sendCodeQueryCall, loading: sendCodeLoading } = useQuery(sendAuthCodeAPI); @@ -78,10 +77,17 @@ export function useAuthenticationPasscode() { const verifySignInEmailConfirmRequest = async ({ email, code }: { email: string; code: string }) => { signInEmailConfirmQueryCall(email, code) .then((res) => { + if ('team' in res.data) { + router.replace('/'); + return; + } + const checkError: { message: string; } = res.data as any; + const isError = checkError.message === 'Unauthorized'; + if (isError) { setErrors({ code: 'Invalid code. Please try again.' @@ -89,6 +95,7 @@ export function useAuthenticationPasscode() { } else { setErrors({}); } + const data = res.data as ISigninEmailConfirmResponse; if (!data.workspaces) { return; @@ -110,6 +117,7 @@ export function useAuthenticationPasscode() { signInToWorkspaceRequest({ email: email, + code: code, token: currentWorkspace?.token as string, selectedTeam: queryTeamId as string }); @@ -156,16 +164,13 @@ export function useAuthenticationPasscode() { [queryCall] ); - const signInToWorkspaceRequest = ({ - email, - token, - selectedTeam - }: { + const signInToWorkspaceRequest = (params: { email: string; token: string; selectedTeam: string; + code?: string; }) => { - signInWorkspaceQueryCall(email, token, selectedTeam) + signInWorkspaceQueryCall(params) .then(() => { setAuthenticated(true); router.push('/'); @@ -227,6 +232,7 @@ export function useAuthenticationPasscode() { signInToWorkspaceRequest({ email: formValues.email, + code: formValues.code, token, selectedTeam }); @@ -285,7 +291,6 @@ export function useAuthenticationPasscode() { workspaces, sendCodeQueryCall, signInWorkspaceLoading, - queryCall, handleWorkspaceSubmit }; } diff --git a/apps/web/app/hooks/auth/useAuthenticationPassword.ts b/apps/web/app/hooks/auth/useAuthenticationPassword.ts index 4c8fe64d2..5858556cb 100644 --- a/apps/web/app/hooks/auth/useAuthenticationPassword.ts +++ b/apps/web/app/hooks/auth/useAuthenticationPassword.ts @@ -87,7 +87,7 @@ export function useAuthenticationPassword() { token: string; selectedTeam: string; }) => { - signInWorkspaceQueryCall(email, token, selectedTeam) + signInWorkspaceQueryCall({ email, token, selectedTeam }) .then(() => { setAuthenticated(true); router.push('/'); diff --git a/apps/web/app/hooks/auth/useAuthenticationSocialLogin.ts b/apps/web/app/hooks/auth/useAuthenticationSocialLogin.ts new file mode 100644 index 000000000..10bce10a6 --- /dev/null +++ b/apps/web/app/hooks/auth/useAuthenticationSocialLogin.ts @@ -0,0 +1,97 @@ +'use client'; + +import { setAuthCookies } from '@app/helpers'; +import { useCallback, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import { getUserOrganizationsRequest, signInWorkspaceAPI } from '@app/services/client/api/auth/invite-accept'; +import { ISigninEmailConfirmWorkspaces } from '@app/interfaces'; +import { useSession } from 'next-auth/react'; +type SigninResult = { + access_token: string; + confirmed_mail: string; + organizationId: string; + refresh_token: { + token: string; + decoded: any; + }; + tenantId: string; + userId: string; +}; + +export function useAuthenticationSocialLogin() { + const router = useRouter(); + const [signInWorkspaceLoading, setSignInWorkspaceLoading] = useState(false); + + const { update: updateNextAuthSession }: any = useSession(); + + const updateOAuthSession = useCallback( + ( + signinResult: SigninResult, + workspaces: ISigninEmailConfirmWorkspaces[], + selectedWorkspace: number, + selectedTeam: string + ) => { + setSignInWorkspaceLoading(true); + signInWorkspaceAPI(signinResult.confirmed_mail, workspaces[selectedWorkspace].token) + .then(async (result) => { + const tenantId = result.user?.tenantId || ''; + const access_token = result.token; + const userId = result.user?.id; + + const organizations = await getUserOrganizationsRequest({ + tenantId, + userId, + token: access_token + }); + const organization = organizations?.data.items[0]; + if (!organization) { + return Promise.reject({ + errors: { + email: 'Your account is not yet ready to be used on the Ever Teams Platform' + } + }); + } + + updateNextAuthSession({ + access_token, + refresh_token: { + token: result.refresh_token + }, + teamId: selectedTeam, + tenantId, + organizationId: organization?.organizationId, + languageId: 'en', + noTeamPopup: true, + + userId, + workspaces: workspaces, + confirmed_mail: signinResult.confirmed_mail + }); + + setAuthCookies({ + access_token, + refresh_token: { + token: result.refresh_token + }, + teamId: selectedTeam, + tenantId, + organizationId: organization?.organizationId, + languageId: 'en', + noTeamPopup: undefined, + userId + }); + setSignInWorkspaceLoading(false); + router.push('/'); + }) + .catch((err) => console.log(err)); + }, + [router, updateNextAuthSession] + ); + + return { + updateOAuthSession, + signInWorkspaceLoading + }; +} + +export type TAuthenticationSocial = ReturnType; diff --git a/apps/web/app/hooks/auth/useAuthenticationTeam.ts b/apps/web/app/hooks/auth/useAuthenticationTeam.ts index eebec90fe..72d017aa5 100644 --- a/apps/web/app/hooks/auth/useAuthenticationTeam.ts +++ b/apps/web/app/hooks/auth/useAuthenticationTeam.ts @@ -9,7 +9,7 @@ import { AxiosError } from 'axios'; import { useCallback, useMemo, useState } from 'react'; import { useQuery } from '../useQuery'; import { RECAPTCHA_SITE_KEY } from '@app/constants'; -import { useSearchParams } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; const FIRST_STEP = 'STEP1' as const; const SECOND_STEP = 'STEP2' as const; @@ -25,15 +25,17 @@ const initialValues: IRegisterDataAPI = RECAPTCHA_SITE_KEY email: '', team: '', recaptcha: '' - } + } : { name: '', email: '', team: '' - }; + }; export function useAuthenticationTeam() { const query = useSearchParams(); + const router = useRouter(); + const queryEmail = useMemo(() => { let localEmail: null | string = null; @@ -70,6 +72,7 @@ export function useAuthenticationTeam() { const { errors, valid } = authFormValidate(validationFields, formValues); if (!valid) { + console.log({ errors }); setErrors(errors as any); return; } @@ -78,7 +81,7 @@ export function useAuthenticationTeam() { infiniteLoading.current = true; queryCall(formValues) - .then(() => window.location.reload()) + .then(() => router.push('/')) .catch((err: AxiosError) => { if (err.response?.status === 400) { setErrors((err.response?.data as any)?.errors || {}); diff --git a/apps/web/app/hooks/features/useAuthTeamTasks.ts b/apps/web/app/hooks/features/useAuthTeamTasks.ts index c6853703a..ec57b486b 100644 --- a/apps/web/app/hooks/features/useAuthTeamTasks.ts +++ b/apps/web/app/hooks/features/useAuthTeamTasks.ts @@ -1,11 +1,12 @@ import { IUser } from '@app/interfaces'; -import { tasksByTeamState } from '@app/stores'; +import { profileDailyPlanListState, tasksByTeamState } from '@app/stores'; import { useMemo } from 'react'; import { useRecoilValue } from 'recoil'; import { useOrganizationTeams } from './useOrganizationTeams'; export function useAuthTeamTasks(user: IUser | undefined) { const tasks = useRecoilValue(tasksByTeamState); + const plans = useRecoilValue(profileDailyPlanListState); const { activeTeam } = useOrganizationTeams(); const currentMember = activeTeam?.members?.find((member) => member.employee?.userId === user?.id); @@ -24,6 +25,11 @@ export function useAuthTeamTasks(user: IUser | undefined) { }); }, [tasks, user]); + const dailyplan = useMemo(() => { + if (!user) return []; + return plans.items; + }, [plans, user]); + const totalTodayTasks = useMemo( () => currentMember?.totalTodayTasks && currentMember?.totalTodayTasks.length @@ -41,6 +47,7 @@ export function useAuthTeamTasks(user: IUser | undefined) { return { assignedTasks, unassignedTasks, - workedTasks + workedTasks, + dailyplan }; } diff --git a/apps/web/app/hooks/features/useAuthenticateUser.ts b/apps/web/app/hooks/features/useAuthenticateUser.ts index 0dcd403bf..9d6233dc6 100644 --- a/apps/web/app/hooks/features/useAuthenticateUser.ts +++ b/apps/web/app/hooks/features/useAuthenticateUser.ts @@ -10,6 +10,8 @@ import { useRecoilState } from 'recoil'; import { useQuery } from '../useQuery'; import { useIsMemberManager } from './useTeamMember'; +import { useOrganizationTeams } from './useOrganizationTeams'; +import { useUserProfilePage } from './useUserProfilePage'; export const useAuthenticateUser = (defaultUser?: IUser) => { const [user, setUser] = useRecoilState(userState); @@ -68,3 +70,19 @@ export const useAuthenticateUser = (defaultUser?: IUser) => { refreshToken }; }; + +/** + * A hook to check if the current user is a manager or whom the current profile belongs to + * + * @description We need, especially for the user profile page, to know if the current user can see some activities, or interact with data + * @returns a boolean that defines in the user is authorized + */ + +export const useCanSeeActivityScreen = () => { + const { user } = useAuthenticateUser(); + const { activeTeamManagers } = useOrganizationTeams(); + const profile = useUserProfilePage(); + + const isManagerConnectedUser = activeTeamManagers.findIndex((member) => member.employee?.user?.id == user?.id); + return profile.userProfile?.id === user?.id || isManagerConnectedUser != -1; +}; diff --git a/apps/web/app/hooks/features/useDailyPlan.ts b/apps/web/app/hooks/features/useDailyPlan.ts new file mode 100644 index 000000000..9482f3195 --- /dev/null +++ b/apps/web/app/hooks/features/useDailyPlan.ts @@ -0,0 +1,167 @@ +'use client'; + +import { useRecoilState } from 'recoil'; +import { useCallback, useEffect } from 'react'; +import { useQuery } from '../useQuery'; +import { + dailyPlanFetchingState, + dailyPlanListState, + profileDailyPlanListState, + taskPlans, + userState +} from '@app/stores'; +import { + addTaskToPlanAPI, + createDailyPlanAPI, + deleteDailyPlanAPI, + getAllDayPlansAPI, + getDayPlansByEmployeeAPI, + getPlansByTaskAPI, + removeTaskFromPlanAPI, + updateDailyPlanAPI +} from '@app/services/client/api'; +import { ICreateDailyPlan, IDailyPlanTasksUpdate, IUpdateDailyPlan } from '@app/interfaces'; +import { useFirstLoad } from '../useFirstLoad'; + +export function useDailyPlan() { + const [user] = useRecoilState(userState); + + const { loading, queryCall } = useQuery(getDayPlansByEmployeeAPI); + const { loading: getAllDayPlansLoading, queryCall: getAllQueryCall } = useQuery(getAllDayPlansAPI); + const { loading: createDailyPlanLoading, queryCall: createQueryCall } = useQuery(createDailyPlanAPI); + const { loading: updateDailyPlanLoading, queryCall: updateQueryCall } = useQuery(updateDailyPlanAPI); + const { loading: getPlansByTaskLoading, queryCall: getPlansByTaskQueryCall } = useQuery(getPlansByTaskAPI); + const { loading: addTaskToPlanLoading, queryCall: addTaskToPlanQueryCall } = useQuery(addTaskToPlanAPI); + const { loading: removeTaskFromPlanLoading, queryCall: removeTAskFromPlanQueryCall } = + useQuery(removeTaskFromPlanAPI); + const { loading: deleteDailyPlanLoading, queryCall: deleteDailyPlanQueryCall } = useQuery(deleteDailyPlanAPI); + + const [dailyPlan, setDailyPlan] = useRecoilState(dailyPlanListState); + const [profileDailyPlans, setProfileDailyPlans] = useRecoilState(profileDailyPlanListState); + const [taskPlanList, setTaskPlans] = useRecoilState(taskPlans); + const [dailyPlanFetching, setDailyPlanFetching] = useRecoilState(dailyPlanFetchingState); + const { firstLoadData: firstLoadDailyPlanData, firstLoad } = useFirstLoad(); + + useEffect(() => { + if (firstLoad) { + setDailyPlanFetching(loading); + } + }, [loading, firstLoad, setDailyPlanFetching]); + + const getAllDayPlans = useCallback(() => { + getAllQueryCall().then((response) => { + if (response.data.items.length) { + const { items, total } = response.data; + setDailyPlan({ items, total }); + } + }); + }, [getAllQueryCall, setDailyPlan]); + + const getEmployeeDayPlans = useCallback( + (employeeId: string) => { + queryCall(employeeId).then((response) => { + const { items, total } = response.data; + setProfileDailyPlans({ items, total }); + }); + }, + [queryCall, setProfileDailyPlans] + ); + + const getPlansByTask = useCallback( + (taskId?: string) => { + getPlansByTaskQueryCall(taskId).then((response) => { + setTaskPlans(response.data.items); + }); + }, + [getPlansByTaskQueryCall, setTaskPlans] + ); + + const createDailyPlan = useCallback( + async (data: ICreateDailyPlan) => { + if (user?.tenantId) { + const res = await createQueryCall(data, user?.tenantId || ''); + setProfileDailyPlans({ + total: profileDailyPlans.total + 1, + items: [...profileDailyPlans.items, res.data] + }); + return res; + } + }, + [createQueryCall, profileDailyPlans.items, profileDailyPlans.total, setProfileDailyPlans, user?.tenantId] + ); + + const updateDailyPlan = useCallback( + async (data: IUpdateDailyPlan, planId: string) => { + const res = await updateQueryCall(data, planId); + const updated = profileDailyPlans.items.filter((plan) => plan.id != planId); + setProfileDailyPlans({ total: profileDailyPlans.total, items: [...updated, res.data] }); + return res; + }, + [profileDailyPlans.items, profileDailyPlans.total, setProfileDailyPlans, updateQueryCall] + ); + + const addTaskToPlan = useCallback( + async (data: IDailyPlanTasksUpdate, planId: string) => { + const res = await addTaskToPlanQueryCall(data, planId); + const updated = profileDailyPlans.items.filter((plan) => plan.id != planId); + setProfileDailyPlans({ total: profileDailyPlans.total, items: [...updated, res.data] }); + return res; + }, + [addTaskToPlanQueryCall, profileDailyPlans.items, profileDailyPlans.total, setProfileDailyPlans] + ); + + const removeTaskFromPlan = useCallback( + async (data: IDailyPlanTasksUpdate, planId: string) => { + const res = await removeTAskFromPlanQueryCall(data, planId); + const updated = profileDailyPlans.items.filter((plan) => plan.id != planId); + setProfileDailyPlans({ total: profileDailyPlans.total, items: [...updated, res.data] }); + return res; + }, + [profileDailyPlans.items, profileDailyPlans.total, removeTAskFromPlanQueryCall, setProfileDailyPlans] + ); + + const deleteDailyPlan = useCallback( + async (planId: string) => { + const res = await deleteDailyPlanQueryCall(planId); + const updated = profileDailyPlans.items.filter((plan) => plan.id != planId); + setProfileDailyPlans({ total: updated.length, items: [...updated] }); + return res; + }, + [deleteDailyPlanQueryCall, profileDailyPlans.items, setProfileDailyPlans] + ); + + return { + dailyPlan, + profileDailyPlans, + setDailyPlan, + dailyPlanFetching, + + taskPlanList, + + firstLoadDailyPlanData, + + getAllDayPlans, + getAllDayPlansLoading, + + getEmployeeDayPlans, + loading, + + getPlansByTask, + getPlansByTaskLoading, + + createDailyPlan, + createDailyPlanLoading, + + updateDailyPlan, + updateDailyPlanLoading, + + addTaskToPlan, + addTaskToPlanLoading, + + removeTaskFromPlan, + removeTaskFromPlanLoading, + + deleteDailyPlan, + deleteDailyPlanLoading + }; +} diff --git a/apps/web/app/hooks/features/useKanban.ts b/apps/web/app/hooks/features/useKanban.ts index 852e1a348..42596ba2e 100644 --- a/apps/web/app/hooks/features/useKanban.ts +++ b/apps/web/app/hooks/features/useKanban.ts @@ -80,11 +80,11 @@ export function useKanban() { }; const isColumnCollapse = (column: string) => { - const columnData = taskStatusHook.taskStatus.filter((taskStatus: ITaskStatusItemList) => { + const columnData = taskStatusHook.taskStatus.find((taskStatus: ITaskStatusItemList) => { return taskStatus.name === column; }); - return columnData[0].isCollapsed; + return columnData?.isCollapsed; }; const reorderStatus = (itemStatus: string, index: number) => { diff --git a/apps/web/app/hooks/features/useLanguageSettings.ts b/apps/web/app/hooks/features/useLanguageSettings.ts index 16bad43a6..f5bd7c535 100644 --- a/apps/web/app/hooks/features/useLanguageSettings.ts +++ b/apps/web/app/hooks/features/useLanguageSettings.ts @@ -39,14 +39,10 @@ export function useLanguageSettings() { const loadLanguagesData = useCallback(() => { setActiveLanguageId(getActiveLanguageIdCookie()); - if (user) { - return queryCall(user.role.isSystem).then((res) => { - setLanguages( - res?.data?.items.filter((item: any) => APPLICATION_LANGUAGES_CODE.includes(item.code)) || [] - ); - return res; - }); - } + return queryCall(user?.role?.isSystem ?? false).then((res) => { + setLanguages(res?.data?.items.filter((item: any) => APPLICATION_LANGUAGES_CODE.includes(item.code)) || []); + return res; + }); }, [queryCall, setActiveLanguageId, setLanguages, user]); const setActiveLanguage = useCallback( diff --git a/apps/web/app/hooks/features/useOrganizationTeams.ts b/apps/web/app/hooks/features/useOrganizationTeams.ts index 8f2879c8f..fe9bc7406 100644 --- a/apps/web/app/hooks/features/useOrganizationTeams.ts +++ b/apps/web/app/hooks/features/useOrganizationTeams.ts @@ -21,7 +21,6 @@ import { activeTeamManagersState, activeTeamState, isTeamMemberState, - memberActiveTaskIdState, organizationTeamsState, teamsFetchingState, timerStatusState @@ -181,20 +180,22 @@ export function useOrganizationTeams() { const { updateUserFromAPI, refreshToken, user } = useAuthenticateUser(); const timerStatus = useRecoilValue(timerStatusState); - const setMemberActiveTaskId = useSetRecoilState(memberActiveTaskIdState); + // const setMemberActiveTaskId = useSetRecoilState(memberActiveTaskIdState); const currentUser = activeTeam?.members?.find((member) => member.employee.userId === user?.id); + const memberActiveTaskId = (timerStatus?.running && timerStatus?.lastLog?.taskId) || currentUser?.activeTaskId || null; + const isTrackingEnabled = activeTeam?.members?.find( (member) => member.employee.userId === user?.id && member.isTrackingEnabled ) ? true : false; - useEffect(() => { - setMemberActiveTaskId(memberActiveTaskId); - }, [setMemberActiveTaskId, memberActiveTaskId]); + // useEffect(() => { + // setMemberActiveTaskId(memberActiveTaskId); + // }, [setMemberActiveTaskId, memberActiveTaskId]); // Updaters const { createOrganizationTeam, loading: createOTeamLoading } = useCreateOrganizationTeam(); diff --git a/apps/web/app/hooks/features/useTaskActivity.ts b/apps/web/app/hooks/features/useTaskActivity.ts index 0645f8104..4764ec406 100644 --- a/apps/web/app/hooks/features/useTaskActivity.ts +++ b/apps/web/app/hooks/features/useTaskActivity.ts @@ -24,7 +24,6 @@ export function useTaskTimeSheets(id: string) { organizationId: user?.employee.organizationId ?? '', taskId: id }).then((response) => { - console.log(response); if (response.data) { console.log(response.data); setTaskTimesheets(response.data); diff --git a/apps/web/app/hooks/features/useTaskEstimation.ts b/apps/web/app/hooks/features/useTaskEstimation.ts index cd203d45f..3e5c02724 100644 --- a/apps/web/app/hooks/features/useTaskEstimation.ts +++ b/apps/web/app/hooks/features/useTaskEstimation.ts @@ -18,7 +18,7 @@ export function useTaskEstimation(task?: Nullable) { const { h, m } = secondsToTime($task?.estimate || 0); setValue({ hours: h ? h.toString() : '', - minutes: pad(m).toString() + minutes: m ? pad(m).toString() : '' }); }, [$task?.estimate]); @@ -124,6 +124,7 @@ export function useTaskEstimation(task?: Nullable) { if (updateLoading || !editableMode) return; handleSubmit(); }, [updateLoading, editableMode, handleSubmit]); + const { targetEl, ignoreElementRef } = useOutsideClick(handleOutsideClick); return { diff --git a/apps/web/app/hooks/features/useTaskInput.ts b/apps/web/app/hooks/features/useTaskInput.ts index 134168405..241ca8f18 100644 --- a/apps/web/app/hooks/features/useTaskInput.ts +++ b/apps/web/app/hooks/features/useTaskInput.ts @@ -1,6 +1,6 @@ 'use client'; -import { useAuthenticateUser, useModal, useSyncRef } from '@app/hooks'; +import { useAuthenticateUser, useModal, useSyncRef, useTaskStatus } from '@app/hooks'; import { useTeamTasks } from '@app/hooks/features/useTeamTasks'; import { ITaskLabelsItemList, Nullable } from '@app/interfaces'; import { ITaskStatus, ITeamTask } from '@app/interfaces/ITask'; @@ -36,7 +36,7 @@ export function useTaskInput({ } = {}) { const { isOpen: isModalOpen, openModal, closeModal } = useModal(); const [closeableTask, setCloseableTaskTask] = useState(null); - + const { taskStatus: taskStatusList } = useTaskStatus(); const { tasks: teamTasks, activeTeamTask, @@ -50,8 +50,7 @@ export function useTaskInput({ const { user } = useAuthenticateUser(); const userRef = useSyncRef(user); - - const taskIssue = useRef(null); + const [taskIssue, setTaskIssue] = useState(''); const taskStatus = useRef(null); const taskPriority = useRef(null); const taskSize = useRef(null); @@ -61,18 +60,12 @@ export function useTaskInput({ const tasks = customTasks || teamTasks; const memberActiveTaskId = useRecoilValue(memberActiveTaskIdState); + const memberActiveTask = useMemo(() => { return tasks.find((item) => item.id === memberActiveTaskId) || null; }, [memberActiveTaskId, tasks]); - /** - * If task has null value then consider it as value 😄 - */ - const inputTask = initEditMode - ? task !== undefined - ? task - : activeTeamTask - : memberActiveTask || (task !== undefined ? task : activeTeamTask); + const inputTask = initEditMode ? task ?? activeTeamTask : memberActiveTask ?? task ?? activeTeamTask; const [filter, setFilter] = useState<'closed' | 'open'>('open'); const [editMode, setEditMode] = useState(initEditMode || false); @@ -125,7 +118,6 @@ export function useTaskInput({ .startsWith(query.toLowerCase().replace(/\s+/g, '')); }); }, [query, tasks]); - const hasCreateForm = filteredTasks2.length === 0 && query !== ''; const handleTaskCreation = ({ @@ -140,11 +132,13 @@ export function useTaskInput({ }[]; } = {}) => { if (query.trim().length < 2 || inputTask?.title === query.trim() || !userRef.current?.isEmailVerified) return; - + const openId = taskStatusList.find((item) => item.value === 'open')?.id; + const statusId = taskStatusList.find((item) => item.name === taskStatus.current)?.id; return createTask( { taskName: query.trim(), - issueType: taskIssue.current || 'Bug', + issueType: taskIssue || 'Bug', + taskStatusId: statusId || (openId as string), status: taskStatus.current || undefined, priority: taskPriority.current || undefined, size: taskSize.current || undefined, @@ -154,6 +148,8 @@ export function useTaskInput({ !autoAssignTaskAuth ? assignToUsers : undefined ).then((res) => { setQuery(''); + localStorage.setItem('lastTaskIssue', taskIssue || 'Bug'); + setTaskIssue(''); const items = res.data?.items || []; const created = items.find((t) => t.title === query.trim()); if (created && autoActiveTask) setActiveTask(created); @@ -183,7 +179,7 @@ export function useTaskInput({ }).length; useEffect(() => { - taskIssue.current = null; + setTaskIssue(''); }, [hasCreateForm]); return { @@ -209,6 +205,7 @@ export function useTaskInput({ filter, updateTaskTitleHandler, taskIssue, + setTaskIssue, taskStatus, taskPriority, taskSize, diff --git a/apps/web/app/hooks/features/useTaskVersion.ts b/apps/web/app/hooks/features/useTaskVersion.ts index f96044907..f4e8694ca 100644 --- a/apps/web/app/hooks/features/useTaskVersion.ts +++ b/apps/web/app/hooks/features/useTaskVersion.ts @@ -14,10 +14,9 @@ import { useRecoilState, useRecoilValue } from 'recoil'; import { useFirstLoad } from '../useFirstLoad'; import { useQuery } from '../useQuery'; import isEqual from 'lodash/isEqual'; -import { useCallbackRef } from '../useCallbackRef'; import { getActiveTeamIdCookie } from '@app/helpers'; -export function useTaskVersion(onVersionCreated?: (version: ITaskVersionCreate) => void) { +export function useTaskVersion() { const [user] = useRecoilState(userState); const activeTeamId = useRecoilValue(activeTeamIdState); @@ -27,7 +26,6 @@ export function useTaskVersion(onVersionCreated?: (version: ITaskVersionCreate) const { loading: editTaskVersionLoading, queryCall: editQueryCall } = useQuery(editTaskVersionAPI); const [taskVersion, setTaskVersion] = useRecoilState(taskVersionListState); - const $onVersionCreated = useCallbackRef(onVersionCreated); const [taskVersionFetching, setTaskVersionFetching] = useRecoilState(taskVersionFetchingState); const { firstLoadData: firstLoadTaskVersionData, firstLoad } = useFirstLoad(); @@ -68,7 +66,7 @@ export function useTaskVersion(onVersionCreated?: (version: ITaskVersionCreate) } }, - [$onVersionCreated, createQueryCall, createTaskVersionLoading, deleteTaskVersionLoading, activeTeamId] + [createQueryCall, createTaskVersionLoading, deleteTaskVersionLoading, activeTeamId] ); const deleteTaskVersion = useCallback( diff --git a/apps/web/app/hooks/features/useTeamMemberCard.ts b/apps/web/app/hooks/features/useTeamMemberCard.ts index 77510197b..43bc27570 100644 --- a/apps/web/app/hooks/features/useTeamMemberCard.ts +++ b/apps/web/app/hooks/features/useTeamMemberCard.ts @@ -21,8 +21,9 @@ import cloneDeep from 'lodash/cloneDeep'; * IOrganizationTeamList['members'][number] | undefined */ export function useTeamMemberCard(member: IOrganizationTeamList['members'][number] | undefined) { - const { updateTask, tasks, setActiveTask, deleteEmployeeFromTasks } = useTeamTasks(); - + const { updateTask, tasks, setActiveTask, deleteEmployeeFromTasks, unassignAuthActiveTask } = useTeamTasks(); + const [assignTaskLoading, setAssignTaskLoading] = useState(false); + const [unAssignTaskLoading, setUnAssignTaskLoading] = useState(false); const publicTeam = useRecoilValue(getPublicState); const allTaskStatistics = useRecoilValue(allTaskStatisticsState); @@ -167,7 +168,7 @@ export function useTeamMemberCard(member: IOrganizationTeamList['members'][numbe if (!member?.employeeId) { return Promise.resolve(); } - + setAssignTaskLoading(true); return updateTask({ ...task, members: [...task.members, (member?.employeeId ? { id: member?.employeeId } : {}) as any] @@ -175,6 +176,7 @@ export function useTeamMemberCard(member: IOrganizationTeamList['members'][numbe if (isAuthUser && !activeTeamTask) { setActiveTask(task); } + setAssignTaskLoading(false); }); }, [updateTask, member, isAuthUser, setActiveTask, activeTeamTask] @@ -185,15 +187,17 @@ export function useTeamMemberCard(member: IOrganizationTeamList['members'][numbe if (!member?.employeeId) { return Promise.resolve(); } + setUnAssignTaskLoading(true); return updateTask({ ...task, members: task.members.filter((m) => m.id !== member.employeeId) }).finally(() => { - isAuthUser && setActiveTask(null); + isAuthUser && unassignAuthActiveTask(); + setUnAssignTaskLoading(false); }); }, - [updateTask, member, isAuthUser, setActiveTask] + [updateTask, member, isAuthUser, unassignAuthActiveTask] ); return { @@ -201,6 +205,8 @@ export function useTeamMemberCard(member: IOrganizationTeamList['members'][numbe memberUnassignTasks, isTeamManager, memberUser, + assignTaskLoading, + unAssignTaskLoading, member, memberTask: memberTaskRef.current, isAuthUser, diff --git a/apps/web/app/hooks/features/useTeamTasks.ts b/apps/web/app/hooks/features/useTeamTasks.ts index 8097779ab..a63926d31 100644 --- a/apps/web/app/hooks/features/useTeamTasks.ts +++ b/apps/web/app/hooks/features/useTeamTasks.ts @@ -19,6 +19,7 @@ import { } from '@app/services/client/api'; import { activeTeamState, + activeTeamTaskId, detailedTaskState, // employeeTasksState, memberActiveTaskIdState, @@ -48,6 +49,7 @@ export function useTeamTasks() { const [tasksFetching, setTasksFetching] = useRecoilState(tasksFetchingState); const authUser = useSyncRef(useRecoilValue(userState)); const memberActiveTaskId = useRecoilValue(memberActiveTaskIdState); + const $memberActiveTaskId = useSyncRef(memberActiveTaskId); // const [employeeState, setEmployeeState] = useRecoilState(employeeTasksState); const { taskStatus } = useTaskStatus(); const activeTeam = useRecoilValue(activeTeamState); @@ -74,6 +76,12 @@ export function useTeamTasks() { const getTaskById = useCallback( (taskId: string) => { + tasksRef.current.forEach((task) => { + if (task.id === taskId) { + setDetailedTask(task); + } + }); + return getTasksByIdQueryCall(taskId).then((res) => { setDetailedTask(res?.data || null); return res; @@ -180,6 +188,7 @@ export function useTeamTasks() { loadTeamTasksData(); } }, [activeTeam?.id, firstLoad, loadTeamTasksData]); + const setActive = useSetRecoilState(activeTeamTaskId); // Get the active task from cookie and put on global store useEffect(() => { @@ -215,6 +224,7 @@ export function useTeamTasks() { { taskName, issueType, + taskStatusId, status = taskStatus[0]?.name, priority, size, @@ -224,6 +234,7 @@ export function useTeamTasks() { taskName: string; issueType?: string; status?: string; + taskStatusId: string; priority?: string; size?: string; tags?: ITaskLabelsItemList[]; @@ -231,13 +242,11 @@ export function useTeamTasks() { }, members?: { id: string }[] ) => { - const activeStatus = taskStatus.find((ts) => ts.name == status); return createQueryCall( { title: taskName, issueType, status, - taskStatusId: activeStatus?.id, priority, size, tags, @@ -246,10 +255,11 @@ export function useTeamTasks() { ...(activeTeam?.projects && activeTeam?.projects.length > 0 ? { projectId: activeTeam.projects[0].id - } + } : {}), ...(description ? { description: `

${description}

` } : {}), - ...(members ? { members } : {}) + ...(members ? { members } : {}), + taskStatusId: taskStatusId }, $user.current ).then((res) => { @@ -264,6 +274,9 @@ export function useTeamTasks() { const updateTask = useCallback( (task: Partial & { id: string }) => { return updateQueryCall(task.id, task).then((res) => { + setActive({ + id: '' + }); const updatedTasks = res?.data?.items || []; deepCheckAndUpdateTasks(updatedTasks, true); @@ -274,7 +287,7 @@ export function useTeamTasks() { return res; }); }, - [updateQueryCall, deepCheckAndUpdateTasks, detailedTask, getTaskById] + [updateQueryCall, setActive, deepCheckAndUpdateTasks, detailedTask, getTaskById] ); const updateTitle = useCallback( @@ -371,6 +384,20 @@ export function useTeamTasks() { */ const setActiveTask = useCallback( (task: ITeamTask | null) => { + /** + * Unassign previous active task + */ + if ($memberActiveTaskId.current && $user.current) { + const _task = tasksRef.current.find((t) => t.id === $memberActiveTaskId.current); + + if (_task) { + updateTask({ + ..._task, + members: _task.members.filter((m) => m.id !== $user.current?.employee.id) + }); + } + } + setActiveTaskIdCookie(task?.id || ''); setActiveTeamTask(task); setActiveUserTaskCookieCb(task); @@ -401,6 +428,11 @@ export function useTeamTasks() { [deleteEmployeeFromTasksQueryCall] ); + const unassignAuthActiveTask = useCallback(() => { + setActiveTaskIdCookie(''); + setActiveTeamTask(null); + }, [setActiveTeamTask]); + useEffect(() => { const memberActiveTask = tasks.find((item) => item.id === memberActiveTaskId); if (memberActiveTask) { @@ -430,6 +462,7 @@ export function useTeamTasks() { getTasksByEmployeeIdLoading, activeTeam, activeTeamId: activeTeam?.id, + unassignAuthActiveTask, setAllTasks, loadTeamTasksData, deleteEmployeeFromTasks, diff --git a/apps/web/app/hooks/features/useTimer.ts b/apps/web/app/hooks/features/useTimer.ts index 041a85cc2..35478eb04 100644 --- a/apps/web/app/hooks/features/useTimer.ts +++ b/apps/web/app/hooks/features/useTimer.ts @@ -30,6 +30,7 @@ import isEqual from 'lodash/isEqual'; import { useOrganizationEmployeeTeams } from './useOrganizatioTeamsEmployee'; import { useAuthenticateUser } from './useAuthenticateUser'; import moment from 'moment'; +import { usePathname } from 'next/navigation'; const LOCAL_TIMER_STORAGE_KEY = 'local-timer-ever-team'; @@ -151,7 +152,8 @@ function useLocalTimeCounter(timerStatus: ITimerStatus | null, activeTeamTask: I * It returns a bunch of data and functions related to the timer */ export function useTimer() { - const { updateTask, activeTeamId, activeTeam, activeTeamTask } = useTeamTasks(); + const pathname = usePathname(); + const { updateTask, setActiveTask, detailedTask, activeTeamId, activeTeam, activeTeamTask } = useTeamTasks(); const { updateOrganizationTeamEmployeeActiveTask } = useOrganizationEmployeeTeams(); const { user, $user } = useAuthenticateUser(); @@ -247,6 +249,7 @@ export function useTimer() { // Start timer const startTimer = useCallback(async () => { + if (pathname?.startsWith('/task/')) setActiveTask(detailedTask); if (!taskId.current) return; updateLocalTimerStatus({ lastTaskId: taskId.current, @@ -289,17 +292,22 @@ export function useTimer() { return promise; }, [ + pathname, + setActiveTask, + detailedTask, + taskId, + updateLocalTimerStatus, + setTimerStatusFetching, + startTimerQueryCall, activeTeamTaskRef, timerStatus, - updateOrganizationTeamEmployeeActiveTask, - user, - activeTeam, setTimerStatus, - setTimerStatusFetching, - startTimerQueryCall, - taskId, - updateLocalTimerStatus, - updateTask + updateTask, + activeTeam?.members, + activeTeam?.id, + activeTeam?.tenantId, + user?.employee.id, + updateOrganizationTeamEmployeeActiveTask ]); // Stop timer diff --git a/apps/web/app/hooks/features/useUserProfilePage.ts b/apps/web/app/hooks/features/useUserProfilePage.ts index 9a67841bd..037059780 100644 --- a/apps/web/app/hooks/features/useUserProfilePage.ts +++ b/apps/web/app/hooks/features/useUserProfilePage.ts @@ -8,19 +8,21 @@ import { useAuthTeamTasks } from './useAuthTeamTasks'; import { useOrganizationTeams } from './useOrganizationTeams'; import { useTaskStatistics } from './useTaskStatistics'; import { useTeamTasks } from './useTeamTasks'; +import { useRecoilValue } from 'recoil'; +import { userDetailAccordion } from '@app/stores'; export function useUserProfilePage() { const { activeTeam } = useOrganizationTeams(); const { activeTeamTask, updateTask } = useTeamTasks(); + const userMemberId = useRecoilValue(userDetailAccordion); const { user: auth } = useAuthenticateUser(); const { getTasksStatsData } = useTaskStatistics(); - const params = useParams(); const memberId: string = useMemo(() => { - return (params?.memberId ?? '') as string; + return (params?.memberId ?? userMemberId) as string; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [params]); + }, [params, userMemberId]); const members = activeTeam?.members || []; diff --git a/apps/web/app/hooks/index.ts b/apps/web/app/hooks/index.ts index 1ca8c9f67..8e1f27f7b 100644 --- a/apps/web/app/hooks/index.ts +++ b/apps/web/app/hooks/index.ts @@ -59,6 +59,9 @@ export * from './features/useTaskSizes'; export * from './features/useTaskStatus'; export * from './features/useTaskVersion'; +// Daily plan +export * from './features/useDailyPlan'; + export * from './features/useRefetchData'; export * from './features/useRolePermissions'; diff --git a/apps/web/app/hooks/useHotkeys.ts b/apps/web/app/hooks/useHotkeys.ts index 92eea73e4..87089850f 100644 --- a/apps/web/app/hooks/useHotkeys.ts +++ b/apps/web/app/hooks/useHotkeys.ts @@ -25,10 +25,10 @@ export const HostKeys = { export const HostKeysMapping = [ { - heading: 'Help', + heading: 'HELP', keySequence: [ { - label: 'To Open Shortcut List', + label:'TO_OPEN_SHORTCUT_LIST', sequence: { MAC: ['H'], OTHER: ['H'] @@ -37,17 +37,17 @@ export const HostKeysMapping = [ ] }, { - heading: 'Timer', + heading: 'TIMER', keySequence: [ { - label: 'Start Timer', + label: 'START_TIMER', sequence: { MAC: ['Ctrl(⌃)', 'Opt(⌥)', ']'], OTHER: ['Ctrl', 'Alt', ']'] } }, { - label: 'Stop Timer', + label: 'STOP_TIMER', sequence: { MAC: ['Ctrl(⌃)', 'Opt(⌥)', '['], OTHER: ['Ctrl', 'Alt', '['] @@ -56,17 +56,17 @@ export const HostKeysMapping = [ ] }, { - heading: 'Task', + heading: 'TASK', keySequence: [ { - label: 'Assign Task', + label: 'ASSIGN_TASK', sequence: { MAC: ['A'], OTHER: ['A'] } }, { - label: 'Create Task', + label: 'CREATE_TASK', sequence: { MAC: ['C'], OTHER: ['C'] diff --git a/apps/web/app/hooks/useInfinityFetch.ts b/apps/web/app/hooks/useInfinityFetch.ts index 99bd60f7b..506115430 100644 --- a/apps/web/app/hooks/useInfinityFetch.ts +++ b/apps/web/app/hooks/useInfinityFetch.ts @@ -15,17 +15,21 @@ export const useInfinityScrolling = (arr: T[], lim?: number) => { const getSomeTasks = React.useCallback( (offset: number) => { - setData(() => { - const newData = getPartData({ arr, limit, offset }); - return newData; - }); + if (arr.length > 0) { + setData(() => { + const newData = getPartData({ arr, limit, offset }); + return newData; + }); + } }, [arr, limit] ); const nextOffset = React.useCallback(() => { - setOffset((prev) => prev + 1); - }, []); + if (arr.length > 0) { + setOffset((prev) => prev + 1); + } + }, [arr.length]); React.useEffect(() => { getSomeTasks(offset); diff --git a/apps/web/app/hooks/useLanguage.ts b/apps/web/app/hooks/useLanguage.ts index 78277befd..691c9efa5 100644 --- a/apps/web/app/hooks/useLanguage.ts +++ b/apps/web/app/hooks/useLanguage.ts @@ -4,11 +4,9 @@ import { currentLanguageState } from '@app/stores'; import { useRouter } from 'next/navigation'; import { useCallback, useEffect } from 'react'; -import { useTranslation } from 'react-i18next'; import { useRecoilState } from 'recoil'; export function useLanguage() { - const { i18n } = useTranslation(); const router = useRouter(); const [currentLanguage, setCurrentLanguage] = useRecoilState(currentLanguageState); @@ -30,7 +28,7 @@ export function useLanguage() { } // router.refresh(); }, - [router, i18n] + [router] ); - return { currentLanguage, changeLanguage, i18n }; + return { currentLanguage, changeLanguage,}; } diff --git a/apps/web/app/hooks/useLeftSettingData.ts b/apps/web/app/hooks/useLeftSettingData.ts index 7967576bf..60172af88 100644 --- a/apps/web/app/hooks/useLeftSettingData.ts +++ b/apps/web/app/hooks/useLeftSettingData.ts @@ -80,12 +80,12 @@ export const useLeftSettingData = () => { href: '#labels', managerOnly: false }, - { - title: t('pages.settingsTeam.RELATED_ISSUE_TYPE'), - color: '#7E7991', - href: '#related-issue-types', - managerOnly: true - }, + // { + // title: t('pages.settingsTeam.RELATED_ISSUE_TYPE'), + // color: '#7E7991', + // href: '#related-issue-types', + // managerOnly: true + // }, // { // title: t('pages.settingsTeam.NOTIFICATION_HEADING'), // color: '#7E7991', diff --git a/apps/web/app/interfaces/IBaseModel.ts b/apps/web/app/interfaces/IBaseModel.ts new file mode 100644 index 000000000..5adf49218 --- /dev/null +++ b/apps/web/app/interfaces/IBaseModel.ts @@ -0,0 +1,34 @@ +import { IOrganization } from './IOrganization'; +import { ITenant } from './ITenant'; + +export interface IBaseDelete { + deletedAt?: Date; +} + +export interface IBaseEntity extends IBaseDelete { + id?: string; + readonly createdAt?: Date; + readonly updatedAt?: Date; + isActive?: boolean; + isArchived?: boolean; +} + +export interface IBasePerTenant extends IBaseEntity { + tenantId?: ITenant['id']; + tenant?: ITenant; +} + +export interface IBasePerTenantEntityMutationInput extends Pick, IBaseEntity { + tenant?: Pick; +} + +export interface IBasePerTenantAndOrganizationEntity extends IBasePerTenant { + organizationId?: IOrganization['id']; + organization?: IOrganization; +} + +export interface IBasePerTenantAndOrganizationEntityMutationInput + extends Pick, + Partial { + organization?: Pick; +} diff --git a/apps/web/app/interfaces/IDailyPlan.ts b/apps/web/app/interfaces/IDailyPlan.ts new file mode 100644 index 000000000..e5003ef02 --- /dev/null +++ b/apps/web/app/interfaces/IDailyPlan.ts @@ -0,0 +1,31 @@ +import { IBasePerTenantAndOrganizationEntity } from './IBaseModel'; +import { IRelationnalEmployee } from './IEmployee'; +import { ITeamTask } from './ITask'; + +export interface IDailyPlanBase extends IBasePerTenantAndOrganizationEntity { + date: Date; + workTimePlanned: number; + status: DailyPlanStatusEnum; +} + +export interface IDailyPlan extends IDailyPlanBase, IRelationnalEmployee { + tasks?: ITeamTask[]; +} + +export interface ICreateDailyPlan extends IDailyPlanBase, IRelationnalEmployee { + taskId?: ITeamTask['id']; +} + +export interface IUpdateDailyPlan extends Partial, Pick {} + +export interface IDailyPlanTasksUpdate + extends Pick, + IBasePerTenantAndOrganizationEntity {} + +export enum DailyPlanStatusEnum { + OPEN = 'open', + IN_PROGRESS = 'in-progress', + COMPLETED = 'completed' +} + +export type IDailyPlanMode = 'today' | 'tomorow' | 'custom'; diff --git a/apps/web/app/interfaces/IEmployee.ts b/apps/web/app/interfaces/IEmployee.ts index dea78b974..3844c9ff9 100644 --- a/apps/web/app/interfaces/IEmployee.ts +++ b/apps/web/app/interfaces/IEmployee.ts @@ -11,6 +11,7 @@ export interface IEmployee { short_description: any; description: any; startedWorkOn: any; + isTrackingTime?: boolean; endWork: any; payPeriod: string; billRateValue: number; @@ -82,3 +83,8 @@ export type IWorkingEmployee = Pick< | 'user' | 'fullName' >; + +export interface IRelationnalEmployee { + readonly employee?: IEmployee; + readonly employeeId?: IEmployee['id']; +} diff --git a/apps/web/app/interfaces/IIssueTypes.ts b/apps/web/app/interfaces/IIssueTypes.ts index dfa080056..9dd11e873 100644 --- a/apps/web/app/interfaces/IIssueTypes.ts +++ b/apps/web/app/interfaces/IIssueTypes.ts @@ -1,5 +1,7 @@ +import { ITaskIssue } from './ITask'; + export interface IIssueTypesCreate { - name: string; + name: ITaskIssue; description?: string; icon?: string; color?: string; @@ -7,6 +9,7 @@ export interface IIssueTypesCreate { organizationId?: string; tenantId?: string | undefined | null; organizationTeamId?: string | undefined | null; + isDefault?: boolean; } export interface IIssueTypesItemList extends IIssueTypesCreate { @@ -19,4 +22,5 @@ export interface IIssueTypesItemList extends IIssueTypesCreate { fullIconUrl?: string; is_system?: boolean; isSystem?: boolean; + isDefault: boolean; } diff --git a/apps/web/app/interfaces/IOrganizationTeam.ts b/apps/web/app/interfaces/IOrganizationTeam.ts index b609dd051..cb392b8c1 100644 --- a/apps/web/app/interfaces/IOrganizationTeam.ts +++ b/apps/web/app/interfaces/IOrganizationTeam.ts @@ -15,6 +15,7 @@ export interface IOrganizationTeamCreate { tags?: any[]; organizationId: string; tenantId: string; + shareProfileView?: boolean; public?: boolean; imageId?: string | null; image?: IImageAssets | null; @@ -42,6 +43,7 @@ export interface IOrganizationTeam { id: string; createdAt: string; updatedAt: string; + shareProfileView?: boolean; imageId?: string | null; image?: IImageAssets | null; } @@ -59,6 +61,7 @@ export interface IOrganizationTeamList { updated?: boolean; prefix: string; members: OT_Member[]; + shareProfileView?: boolean; public?: boolean; createdById: string; createdBy: IUser; diff --git a/apps/web/app/interfaces/ITaskStatus.ts b/apps/web/app/interfaces/ITaskStatus.ts index b2a8e9350..3769e6163 100644 --- a/apps/web/app/interfaces/ITaskStatus.ts +++ b/apps/web/app/interfaces/ITaskStatus.ts @@ -21,6 +21,7 @@ export interface ITaskStatusCreate { name?: string; description?: string; icon?: string; + value?: string; color?: string; projectId?: string; organizationId?: string; diff --git a/apps/web/app/interfaces/index.ts b/apps/web/app/interfaces/index.ts index f6ba725be..187fbd13a 100644 --- a/apps/web/app/interfaces/index.ts +++ b/apps/web/app/interfaces/index.ts @@ -16,6 +16,7 @@ export * from './ITaskSizes'; export * from './ITaskTimesheet'; export * from './ITaskLabels'; export * from './ITaskRelatedIssueType'; +export * from './IDailyPlan'; export * from './IColor'; export * from './hooks'; export * from './IIcon'; diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index d48047682..00063f410 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -9,5 +9,9 @@ type Props = { // Since we have a `not-found.tsx` page on the root, a layout file // is required, even if it's just passing children through. export default function RootLayout({ children }: Props) { - return children; + return ( + + {children} + + ); } diff --git a/apps/web/app/not-found.tsx b/apps/web/app/not-found.tsx new file mode 100644 index 000000000..b95b93927 --- /dev/null +++ b/apps/web/app/not-found.tsx @@ -0,0 +1,9 @@ +'use client'; + +import NotFound from '@components/pages/404'; + +const NotFoundPage = () => { + return ; +}; + +export default NotFoundPage; diff --git a/apps/web/app/services/client/api/auth.ts b/apps/web/app/services/client/api/auth.ts index 22d6d6a44..fe53873f5 100644 --- a/apps/web/app/services/client/api/auth.ts +++ b/apps/web/app/services/client/api/auth.ts @@ -13,17 +13,24 @@ import { } from '@app/constants'; import qs from 'qs'; import { signInEmailConfirmGauzy, signInWorkspaceGauzy } from './auth/invite-accept'; +import { ProviderEnum } from '@app/services/server/requests/OAuth'; +/** + * Fetches data of the authenticated user with specified relations and the option to include employee details. + * + * @returns A Promise resolving to the IUser object. + */ export const getAuthenticatedUserDataAPI = () => { - const params = {} as { [x: string]: string }; - const relations = ['employee', 'role', 'tenant']; + // Define the relations to be included in the request + const relations = ['role', 'tenant']; - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; + // Construct the query string with 'qs', including the includeEmployee parameter + const query = qs.stringify({ + relations: relations, + includeEmployee: true // Append includeEmployee parameter set to true }); - const query = qs.stringify(params); - + // Execute the GET request to fetch the user data return get(`/user/me?${query}`); }; @@ -100,11 +107,14 @@ export const signInEmailAPI = (email: string) => { }; export function signInEmailPasswordAPI(email: string, password: string) { - const endpoint = GAUZY_API_BASE_SERVER_URL.value - ? '/auth/signin.email.password?includeTeams=true' - : `/auth/signin-email-password`; + const endpoint = GAUZY_API_BASE_SERVER_URL.value ? '/auth/signin.email.password' : `/auth/signin-email-password`; + return post(endpoint, { email, password, includeTeams: true }); +} + +export function signInEmailSocialLoginAPI(provider: ProviderEnum, access_token: string) { + const endpoint = GAUZY_API_BASE_SERVER_URL.value ? '/auth/signin.provider.social' : `/auth/signin-email-social`; - return post(endpoint, { email, password }); + return post(endpoint, { provider, access_token, includeTeams: true }); } export const verifyUserEmailByTokenAPI = (email: string, token: string) => { @@ -124,15 +134,20 @@ export async function signInEmailConfirmAPI(email: string, code: string) { }); } -export const signInWorkspaceAPI = (email: string, token: string, selectedTeam: string) => { +export const signInWorkspaceAPI = (params: { email: string; token: string; selectedTeam: string; code?: string }) => { if (GAUZY_API_BASE_SERVER_URL.value) { - return signInWorkspaceGauzy({ email, token, teamId: selectedTeam, code: 'sign-in-workspace' }); + return signInWorkspaceGauzy({ + email: params.email, + token: params.token, + teamId: params.selectedTeam, + code: params.code + }); } return api.post(`/auth/signin-workspace`, { - email, - token, - teamId: selectedTeam + email: params.email, + token: params.token, + teamId: params.selectedTeam }); }; diff --git a/apps/web/app/services/client/api/auth/invite-accept.ts b/apps/web/app/services/client/api/auth/invite-accept.ts index 05f1aab58..e97106baa 100644 --- a/apps/web/app/services/client/api/auth/invite-accept.ts +++ b/apps/web/app/services/client/api/auth/invite-accept.ts @@ -25,16 +25,28 @@ export function verifyInviteCodeAPI(params: IInviteVerifyCode) { return post('/invite/validate-by-code', params).then((res) => res.data); } +/** + * Constructs a request to fetch user organizations with tenant and user ID. + * + * @param params - Parameters including tenantId, userId, and token for authentication. + * @returns A promise that resolves to a pagination response of user organizations. + */ export function getUserOrganizationsRequest(params: { tenantId: string; userId: string; token: string }) { - const query = JSON.stringify({ - relations: [], - findInput: { - userId: params.userId, - tenantId: params.tenantId - } + // Create a new instance of URLSearchParams for query string construction + const query = new URLSearchParams(); + + // Add user and tenant IDs to the query + query.append('where[userId]', params.userId); + query.append('where[tenantId]', params.tenantId); + + // If there are relations, add them to the query + const relations: string[] = []; + // Append each relation to the query string + relations.forEach((relation, index) => { + query.append(`relations[${index}]`, relation); }); - return get>(`/user-organization?data=${encodeURIComponent(query)}`, { + return get>(`/user-organization?${query.toString()}`, { tenantId: params.tenantId, headers: { Authorization: `Bearer ${params.token}` @@ -42,6 +54,13 @@ export function getUserOrganizationsRequest(params: { tenantId: string; userId: }); } +/** + * Fetches a list of all teams within an organization, including specified relation data. + * + * @param {ITeamRequestParams} params Parameters for the team request, including organization and tenant IDs, and optional relations. + * @param {string} bearer_token The bearer token for authentication. + * @returns A Promise resolving to the pagination response of organization teams. + */ export function getAllOrganizationTeamAPI(params: ITeamRequestParams, bearer_token: string) { const relations = params.relations || [ 'members', @@ -49,25 +68,24 @@ export function getAllOrganizationTeamAPI(params: ITeamRequestParams, bearer_tok 'members.employee', 'members.employee.user', 'createdBy', - 'createdBy.employee', 'projects', 'projects.repository' ]; - const searchQueries = { + // Construct search queries + const queryParams = { 'where[organizationId]': params.organizationId, 'where[tenantId]': params.tenantId, source: TimerSource.TEAMS, - withLaskWorkedTask: 'true' - } as { [x: string]: string }; - - relations.forEach((rl, i) => { - searchQueries[`relations[${i}]`] = rl; - }); + withLastWorkedTask: 'true', // Corrected the typo here + ...Object.fromEntries(relations.map((relation, index) => [`relations[${index}]`, relation])) + }; - const query = qs.stringify(params); + // Serialize search queries into a query string + const queryString = qs.stringify(queryParams, { arrayFormat: 'brackets' }); - return get>(`/organization-team?${query}`, { + // Construct and execute the request + return get>(`/organization-team?${queryString}`, { tenantId: params.tenantId, headers: { Authorization: `Bearer ${bearer_token}` @@ -77,7 +95,7 @@ export function getAllOrganizationTeamAPI(params: ITeamRequestParams, bearer_tok export const signInEmailConfirmAPI = (data: { code: string; email: string }) => { const { code, email } = data; - return post('/auth/signin.email/confirm?includeTeams=true', { code, email }); + return post('/auth/signin.email/confirm', { code, email, includeTeams: true }); }; export async function signInEmailCodeConfirmGauzy(email: string, code: string) { @@ -199,11 +217,13 @@ export async function signInEmailConfirmGauzy(email: string, code: string) { /** * @param params */ -export async function signInWorkspaceGauzy(params: { email: string; token: string; teamId: string; code: string }) { - const loginResponse = await signInEmailCodeConfirmGauzy(params.email, params.code); +export async function signInWorkspaceGauzy(params: { email: string; token: string; teamId: string; code?: string }) { + if (params.code) { + const loginResponse = await signInEmailCodeConfirmGauzy(params.email, params.code); - if (loginResponse) { - return loginResponse; + if (loginResponse) { + return loginResponse; + } } const data = await signInWorkspaceAPI(params.email, params.token); diff --git a/apps/web/app/services/client/api/daily-plan.ts b/apps/web/app/services/client/api/daily-plan.ts new file mode 100644 index 000000000..463a2d936 --- /dev/null +++ b/apps/web/app/services/client/api/daily-plan.ts @@ -0,0 +1,91 @@ +import qs from 'qs'; +import { deleteApi, get, post, put } from '../axios'; +import { + DeleteResponse, + ICreateDailyPlan, + IDailyPlan, + IDailyPlanTasksUpdate, + IUpdateDailyPlan, + PaginationResponse +} from '@app/interfaces'; +import { getOrganizationIdCookie, getTenantIdCookie } from '@app/helpers'; + +export function getAllDayPlansAPI() { + const organizationId = getOrganizationIdCookie(); + const tenantId = getTenantIdCookie(); + + const relations = ['employee', 'tasks']; + + const obj = { + 'where[organizationId]': organizationId, + 'where[tenantId]': tenantId + } as Record; + + relations.forEach((relation, i) => { + obj[`relations[${i}]`] = relation; + }); + + const query = qs.stringify(obj); + return get>(`/daily-plan?${query}`, { tenantId }); +} + +export function getDayPlansByEmployeeAPI(employeeId?: string) { + const organizationId = getOrganizationIdCookie(); + const tenantId = getTenantIdCookie(); + + const relations = ['employee', 'tasks']; + + const obj = { + 'where[organizationId]': organizationId, + 'where[tenantId]': tenantId + } as Record; + + relations.forEach((relation, i) => { + obj[`relations[${i}]`] = relation; + }); + + const query = qs.stringify(obj); + return get>(`/daily-plan/employee/${employeeId}?${query}`, { tenantId }); +} + +export function getPlansByTaskAPI(taskId?: string) { + const organizationId = getOrganizationIdCookie(); + const tenantId = getTenantIdCookie(); + + const obj = { + 'where[organizationId]': organizationId, + 'where[tenantId]': tenantId + } as Record; + + const query = qs.stringify(obj); + + return get>(`/daily-plan/task/${taskId}?${query}`, { tenantId }); +} + +export function createDailyPlanAPI(data: ICreateDailyPlan, tenantId?: string) { + return post('/daily-plan', data, { + tenantId + }); +} + +export function updateDailyPlanAPI(data: IUpdateDailyPlan, planId: string) { + return put(`/daily-plan/${planId}`, data, {}); +} + +export function addTaskToPlanAPI(data: IDailyPlanTasksUpdate, planId: string) { + const organizationId = getOrganizationIdCookie(); + const tenantId = getTenantIdCookie(); + + return post(`/daily-plan/${planId}/task`, { ...data, organizationId }, { tenantId }); +} + +export function removeTaskFromPlanAPI(data: IDailyPlanTasksUpdate, planId: string) { + const organizationId = getOrganizationIdCookie(); + const tenantId = getTenantIdCookie(); + + return put(`/daily-plan/${planId}/task`, { ...data, organizationId }, { tenantId }); +} + +export function deleteDailyPlanAPI(planId: string) { + return deleteApi(`/daily-plan/${planId}`); +} diff --git a/apps/web/app/services/client/api/index.ts b/apps/web/app/services/client/api/index.ts index 7b8f36e10..a3fc188f9 100644 --- a/apps/web/app/services/client/api/index.ts +++ b/apps/web/app/services/client/api/index.ts @@ -14,6 +14,7 @@ export * from './task-sizes'; export * from './task-labels'; export * from './issue-type'; export * from './task-related-issue-type'; +export * from './daily-plan'; export * from './user'; export * from './request-to-join-team'; diff --git a/apps/web/app/services/client/api/invite.ts b/apps/web/app/services/client/api/invite.ts index e23da8111..c8c377cbd 100644 --- a/apps/web/app/services/client/api/invite.ts +++ b/apps/web/app/services/client/api/invite.ts @@ -15,6 +15,10 @@ interface IIInviteRequest { export async function inviteByEmailsAPI(data: IIInviteRequest, tenantId: string) { const endpoint = '/invite/emails'; + if (!GAUZY_API_BASE_SERVER_URL.value) { + return post>(endpoint, data, { tenantId }); + } + const date = new Date(); date.setDate(date.getDate() - 1); diff --git a/apps/web/app/services/client/api/organization-team.ts b/apps/web/app/services/client/api/organization-team.ts index 2769cab13..75e737fd9 100644 --- a/apps/web/app/services/client/api/organization-team.ts +++ b/apps/web/app/services/client/api/organization-team.ts @@ -16,6 +16,13 @@ import { getAccessTokenCookie, getOrganizationIdCookie, getTenantIdCookie } from import { createOrganizationProjectAPI } from './projects'; import qs from 'qs'; +/** + * Fetches a list of teams for a specified organization. + * + * @param {string} organizationId The unique identifier for the organization. + * @param {string} tenantId The tenant identifier. + * @returns A Promise resolving to a paginated response containing the list of organization teams. + */ export async function getOrganizationTeamsAPI(organizationId: string, tenantId: string) { const relations = [ 'members', @@ -23,22 +30,21 @@ export async function getOrganizationTeamsAPI(organizationId: string, tenantId: 'members.employee', 'members.employee.user', 'createdBy', - 'createdBy.employee', 'projects', 'projects.repository' ]; - - const params = { + // Construct the query parameters including relations + const queryParameters = { 'where[organizationId]': organizationId, 'where[tenantId]': tenantId, source: TimerSource.TEAMS, - withLaskWorkedTask: 'true' - } as { [x: string]: string }; + withLastWorkedTask: 'true', // Corrected the typo here + relations + }; + + // Serialize parameters into a query string + const query = qs.stringify(queryParameters, { arrayFormat: 'brackets' }); - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; - }); - const query = qs.stringify(params); const endpoint = `/organization-team?${query}`; return get>(endpoint, { tenantId }); @@ -84,36 +90,43 @@ export async function createOrganizationTeamAPI(name: string, user: IUser) { return api.post>('/organization-team', { name }); } +/** + * Fetches details of a specific team within an organization. + * + * @param {string} teamId The unique identifier of the team. + * @param {string} organizationId The unique identifier of the organization. + * @param {string} tenantId The tenant identifier. + * @returns A Promise resolving to the details of the specified organization team. + */ export async function getOrganizationTeamAPI(teamId: string, organizationId: string, tenantId: string) { - const params = { - organizationId: organizationId, - tenantId: tenantId, - // source: TimerSource.TEAMS, - withLaskWorkedTask: 'true', - startDate: moment().startOf('day').toISOString(), - endDate: moment().endOf('day').toISOString(), - includeOrganizationTeamId: 'false' - } as { [x: string]: string }; - const relations = [ 'members', 'members.role', 'members.employee', 'members.employee.user', 'createdBy', - 'createdBy.employee', 'projects', 'projects.repository' ]; - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; - }); + // Define base parameters including organization and tenant IDs, and date range + const queryParams = { + organizationId, + tenantId, + withLastWorkedTask: 'true', // Corrected the typo here + startDate: moment().startOf('day').toISOString(), + endDate: moment().endOf('day').toISOString(), + includeOrganizationTeamId: 'false', + relations + }; - const queries = qs.stringify(params); + // Serialize parameters into a query string using 'qs' + const queryString = qs.stringify(queryParams, { arrayFormat: 'brackets' }); - const endpoint = `/organization-team/${teamId}?${queries}`; + // Construct the endpoint URL + const endpoint = `/organization-team/${teamId}?${queryString}`; + // Fetch and return the team details return get(endpoint); } diff --git a/apps/web/app/services/client/api/public-organization-team.ts b/apps/web/app/services/client/api/public-organization-team.ts index 9c9707ac8..59026e546 100644 --- a/apps/web/app/services/client/api/public-organization-team.ts +++ b/apps/web/app/services/client/api/public-organization-team.ts @@ -11,13 +11,12 @@ export function getPublicOrganizationTeamsAPI(profile_link: string, team_id: str 'tasks.teams', 'tasks.tags', 'members', - // 'members.role', 'members.employee', 'members.employee.user' ]; const params = { - withLaskWorkedTask: 'true', + withLastWorkedTask: 'true', startDate: moment().startOf('day').toISOString(), endDate: moment().endOf('day').toISOString() } as { [x: string]: string }; @@ -39,7 +38,7 @@ export function getPublicOrganizationTeamsMiscDataAPI(profile_link: string, team const relations = ['statuses', 'priorities', 'sizes', 'labels', 'issueTypes']; const params = { - withLaskWorkedTask: 'true', + withLastWorkedTask: 'true', startDate: moment().startOf('day').toISOString(), endDate: moment().endOf('day').toISOString() } as { [x: string]: string }; diff --git a/apps/web/app/services/client/axios.ts b/apps/web/app/services/client/axios.ts index a940e724f..5b4af5a0e 100644 --- a/apps/web/app/services/client/axios.ts +++ b/apps/web/app/services/client/axios.ts @@ -1,11 +1,6 @@ /* eslint-disable no-mixed-spaces-and-tabs */ import { API_BASE_URL, DEFAULT_APP_PATH, GAUZY_API_BASE_SERVER_URL } from '@app/constants'; -import { - getAccessTokenCookie, - getActiveTeamIdCookie, - getOrganizationIdCookie, - getTenantIdCookie -} from '@app/helpers/cookies'; +import { getAccessTokenCookie, getOrganizationIdCookie, getTenantIdCookie } from '@app/helpers/cookies'; import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; const api = axios.create({ @@ -13,9 +8,10 @@ const api = axios.create({ withCredentials: true, timeout: 60 * 1000 }); + api.interceptors.request.use( async (config: any) => { - const cookie = getActiveTeamIdCookie(); + const cookie = getAccessTokenCookie(); if (cookie) { config.headers['Authorization'] = `Bearer ${cookie}`; @@ -27,6 +23,7 @@ api.interceptors.request.use( Promise.reject(error); } ); + api.interceptors.response.use( (response: AxiosResponse) => response, async (error: { response: AxiosResponse }) => { diff --git a/apps/web/app/services/server/requests/OAuth.ts b/apps/web/app/services/server/requests/OAuth.ts new file mode 100644 index 000000000..d2743e2d0 --- /dev/null +++ b/apps/web/app/services/server/requests/OAuth.ts @@ -0,0 +1,83 @@ +import { type Adapter } from '@auth/core/adapters'; +import { signWithSocialLoginsRequest } from '@app/services/server/requests'; +import { getUserOrganizationsRequest, signInWorkspaceAPI } from '@app/services/client/api/auth/invite-accept'; + +export enum ProviderEnum { + GITHUB = 'github', + GOOGLE = 'google', + FACEBOOK = 'facebook', + TWITTER = 'twitter' +} + +export const GauzyAdapter: Adapter = { + // Provide createUser and other related functions that will call Gauzy APIs when implementing social signup +}; + +async function signIn(provider: ProviderEnum, access_token: string) { + try { + const gauzyUser = await signWithSocialLoginsRequest(provider, access_token); + + if (!gauzyUser) { + return Promise.reject({ + errors: { + email: 'Your account is not yet ready to be used on the Ever Teams Platform' + } + }); + } + + const data = await signInWorkspaceAPI(gauzyUser?.data.confirmed_email, gauzyUser?.data.workspaces[0].token); + const tenantId = data.user?.tenantId || ''; + const token = data.token; + const userId = data.user?.id; + + const { data: organizations } = await getUserOrganizationsRequest({ + tenantId, + userId, + token + }); + + const organization = organizations?.items[0]; + + if (!organization) { + return Promise.reject({ + errors: { + email: 'Your account is not yet ready to be used on the Ever Teams Platform' + } + }); + } + return { data, gauzyUser, organization, tenantId, userId }; + } catch (error) { + throw new Error('Signin error', { cause: error }); + } +} + +export async function signInCallback(provider: ProviderEnum, access_token: string): Promise { + try { + const { gauzyUser, organization } = await signIn(provider, access_token); + return !!gauzyUser && !!organization; + } catch (error) { + return false; + } +} + +export async function jwtCallback(provider: ProviderEnum, access_token: string) { + try { + const { data, gauzyUser, organization, tenantId, userId } = await signIn(provider, access_token); + return { + access_token, + refresh_token: { + token: data.refresh_token + }, + teamId: gauzyUser?.data.workspaces[0].current_teams[0].team_id, + tenantId, + organizationId: organization?.organizationId, + languageId: 'en', + noTeamPopup: true, + userId, + workspaces: gauzyUser?.data.workspaces, + confirmed_mail: gauzyUser?.data.confirmed_email + }; + } catch (error) { + throw new Error('Signin error', { cause: error }); + } +} diff --git a/apps/web/app/services/server/requests/auth.ts b/apps/web/app/services/server/requests/auth.ts index de2abfa06..7364730ed 100644 --- a/apps/web/app/services/server/requests/auth.ts +++ b/apps/web/app/services/server/requests/auth.ts @@ -4,6 +4,7 @@ import { ILoginResponse, IRegisterDataRequest, ISigninEmailConfirmResponse } fro import { IUser } from '@app/interfaces/IUserData'; import { serverFetch } from '../fetch'; import qs from 'qs'; +import { ProviderEnum } from './OAuth'; const registerDefaultValue = { appName: APP_NAME, @@ -43,9 +44,17 @@ export function signInEmailRequest(email: string, callbackUrl: string) { export function signInEmailPasswordRequest(email: string, password: string) { return serverFetch({ - path: '/auth/signin.email.password?includeTeams=true', + path: '/auth/signin.email.password', method: 'POST', - body: { email, password } + body: { email, password, includeTeams: true } + }); +} + +export function signWithSocialLoginsRequest(provider: ProviderEnum, token: string) { + return serverFetch({ + path: '/auth/signin.email.social', + method: 'POST', + body: { provider, token, includeTeams: true } }); } @@ -53,9 +62,9 @@ export const signInEmailConfirmRequest = (data: { code: string; email: string }) const { code, email } = data; return serverFetch({ - path: '/auth/signin.email/confirm?includeTeams=true', + path: '/auth/signin.email/confirm', method: 'POST', - body: { code, email } + body: { code, email, includeTeams: true } }); }; @@ -100,18 +109,20 @@ type IUEmployeeParam = { relations?: string[]; }; -export const currentAuthenticatedUserRequest = ({ - bearer_token, - relations = ['employee', 'role', 'tenant'] -}: IUEmployeeParam) => { - const params = {} as { [x: string]: string }; - - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; +/** + * Fetches details of the currently authenticated user, including specified relations. + * + * @param {IUEmployeeParam} employeeParams - The employee parameters, including bearer token and optional relations. + * @returns A Promise resolving to the IUser object with the desired relations. + */ +export const currentAuthenticatedUserRequest = ({ bearer_token, relations = ['role', 'tenant'] }: IUEmployeeParam) => { + // Construct the query string with 'qs', including the includeEmployee parameter + const query = qs.stringify({ + relations: relations, + includeEmployee: true // Append includeEmployee parameter set to true }); - const query = qs.stringify(params); - + // Construct and return the server fetch request return serverFetch({ path: `/user/me?${query}`, method: 'GET', diff --git a/apps/web/app/services/server/requests/daily-plan.ts b/apps/web/app/services/server/requests/daily-plan.ts new file mode 100644 index 000000000..20c8ba85d --- /dev/null +++ b/apps/web/app/services/server/requests/daily-plan.ts @@ -0,0 +1,175 @@ +import qs from 'qs'; +import { ICreateDailyPlan, IDailyPlan, IDailyPlanTasksUpdate, IUpdateDailyPlan } from '@app/interfaces/IDailyPlan'; +import { serverFetch } from '../fetch'; +import { DeleteResponse } from '@app/interfaces'; + +export function getAllDayPlans({ + organizationId, + tenantId, + bearer_token, + relations = ['employee', 'tasks'] +}: { + organizationId: string; + tenantId: string; + bearer_token: string; + relations?: string[]; +}) { + const obj = { + 'where[organizationId]': organizationId, + 'where[tenantId]': tenantId + } as Record; + + relations.forEach((relation, i) => { + obj[`relations[${i}]`] = relation; + }); + + const query = qs.stringify(obj); + + return serverFetch({ + path: `/daily-plan?${query}`, + method: 'GET', + bearer_token + }); +} + +export function getDayPlansByEmployee({ + employeeId, + organizationId, + tenantId, + bearer_token, + relations = ['employee', 'tasks'] +}: { + employeeId: string; + organizationId: string; + tenantId: string; + bearer_token: string; + relations?: string[]; +}) { + const obj = { + 'where[organizationId]': organizationId, + 'where[tenantId]': tenantId + } as Record; + + relations.forEach((relation, i) => { + obj[`relations[${i}]`] = relation; + }); + + const query = qs.stringify(obj); + + return serverFetch({ + path: `/daily-plan/employee/${employeeId}?${query}`, + method: 'GET', + bearer_token + }); +} + +export function getPlansByTask({ + taskId, + organizationId, + tenantId, + bearer_token +}: { + taskId: string; + organizationId: string; + tenantId: string; + bearer_token: string; +}) { + const obj = { + 'where[organizationId]': organizationId, + 'where[tenantId]': tenantId + } as Record; + + const query = qs.stringify(obj); + + return serverFetch({ + path: `/daily-plan/task/${taskId}?${query}`, + method: 'GET', + bearer_token + }); +} + +export function createPlanRequest({ + data, + bearer_token, + tenantId +}: { + data: ICreateDailyPlan; + bearer_token: string; + tenantId?: any; +}) { + return serverFetch({ + method: 'POST', + path: '/daily-plan', + body: data, + bearer_token, + tenantId + }); +} + +export function updatePlanRequest({ + planId, + data, + bearer_token, + tenantId +}: { + planId: string; + data: IUpdateDailyPlan; + bearer_token?: string; + tenantId?: any; +}) { + return serverFetch({ + method: 'PUT', + path: `/daily-plan/${planId}`, + body: data, + bearer_token, + tenantId + }); +} + +export function addTaskToDailyPlanRequest({ + planId, + data, + bearer_token, + tenantId +}: { + planId: string; + data: IDailyPlanTasksUpdate; + bearer_token?: string; + tenantId: any; +}) { + return serverFetch({ + method: 'POST', + path: `/daily-plan/${planId}/task`, + body: data, + bearer_token, + tenantId + }); +} + +export function removeTaskFromPlanRequest({ + planId, + data, + bearer_token, + tenantId +}: { + planId: string; + data: IDailyPlanTasksUpdate; + bearer_token?: string; + tenantId: any; +}) { + return serverFetch({ + method: 'PUT', + path: `/daily-plan/${planId}/task`, + body: data, + bearer_token, + tenantId + }); +} + +export function deleteDailyPlanRequest({ planId, bearer_token }: { planId: string; bearer_token?: string }) { + return serverFetch({ + method: 'DELETE', + path: `/daily-plan/${planId}`, + bearer_token + }); +} diff --git a/apps/web/app/services/server/requests/index.ts b/apps/web/app/services/server/requests/index.ts index 3226b849d..8915f0553 100644 --- a/apps/web/app/services/server/requests/index.ts +++ b/apps/web/app/services/server/requests/index.ts @@ -5,6 +5,7 @@ export * from './organization-team-employee'; export * from './tenant'; export * from './timer'; export * from './tasks'; +export * from './daily-plan'; export * from './employee'; export * from './invite'; export * from './timesheet'; diff --git a/apps/web/app/services/server/requests/organization-team.ts b/apps/web/app/services/server/requests/organization-team.ts index b4040e9ff..a62c2c6d9 100644 --- a/apps/web/app/services/server/requests/organization-team.ts +++ b/apps/web/app/services/server/requests/organization-team.ts @@ -73,6 +73,13 @@ export function deleteOrganizationTeamRequest({ }); } +/** + * Fetches detailed information for a specific team within an organization. + * + * @param {ITeamRequestParams & { teamId: string }} params Contains team, organization, tenant IDs, and optional relations. + * @param {string} bearer_token Token for authenticating the request. + * @returns A Promise resolving to the detailed information of the organization team with additional status. + */ export function getOrganizationTeamRequest( { organizationId, @@ -84,37 +91,43 @@ export function getOrganizationTeamRequest( 'members.employee', 'members.employee.user', 'createdBy', - 'createdBy.employee', 'projects', 'projects.repository' ] }: ITeamRequestParams & { teamId: string }, bearer_token: string ) { - const params = { - organizationId: organizationId, - tenantId: tenantId, + // Define base query parameters + const queryParams = { + organizationId, + tenantId, // source: TimerSource.TEAMS, - withLaskWorkedTask: 'true', + withLastWorkedTask: 'true', // Corrected typo startDate: moment().startOf('day').toISOString(), endDate: moment().endOf('day').toISOString(), - includeOrganizationTeamId: 'false' - } as { [x: string]: string }; + includeOrganizationTeamId: 'false', + ...Object.fromEntries(relations.map((relation, index) => [`relations[${index}]`, relation])) + }; - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; - }); - - const queries = qs.stringify(params); + // Serialize parameters into a query string + const queryString = qs.stringify(queryParams, { arrayFormat: 'brackets' }); + // Fetch and return team details return serverFetch({ - path: `/organization-team/${teamId}?${queries.toString()}`, + path: `/organization-team/${teamId}?${queryString}`, method: 'GET', bearer_token, tenantId }); } +/** + * Fetches team details for a specified organization from the server. + * + * @param {TeamRequestParams} params Contains organizationId, tenantId, and optional relationship specifications. + * @param {string} bearer_token Token for request authentication. + * @returns A Promise resolving to a paginated list of organization team data. + */ export function getAllOrganizationTeamRequest( { organizationId, @@ -125,26 +138,25 @@ export function getAllOrganizationTeamRequest( 'members.employee', 'members.employee.user', 'createdBy', - 'createdBy.employee', 'projects', 'projects.repository' ] }: ITeamRequestParams, bearer_token: string ) { + // Consolidate all parameters into a single object const params = { 'where[organizationId]': organizationId, 'where[tenantId]': tenantId, source: TimerSource.TEAMS, - withLaskWorkedTask: 'true' - } as { [x: string]: string }; - - relations.forEach((rl, i) => { - params[`relations[${i}]`] = rl; - }); + withLastWorkedTask: 'true', + relations + }; - const query = qs.stringify(params); + // Serialize parameters into a query string + const query = qs.stringify(params, { arrayFormat: 'brackets' }); + // Construct and return the server fetch request return serverFetch>({ path: `/organization-team?${query}`, method: 'GET', diff --git a/apps/web/app/services/server/requests/organization.ts b/apps/web/app/services/server/requests/organization.ts index 4ff22b50a..a30934f46 100644 --- a/apps/web/app/services/server/requests/organization.ts +++ b/apps/web/app/services/server/requests/organization.ts @@ -2,31 +2,48 @@ import { PaginationResponse } from '@app/interfaces/IDataResponse'; import { IOrganization, IOrganizationCreate, IUserOrganization } from '@app/interfaces/IOrganization'; import { serverFetch } from '../fetch'; -export function createOrganizationRequest(datas: IOrganizationCreate, bearer_token: string) { +export function createOrganizationRequest(datas: IOrganizationCreate, bearerToken: string) { return serverFetch({ path: '/organization', method: 'POST', body: datas, - bearer_token + bearer_token: bearerToken }); } -export function getUserOrganizationsRequest( - { tenantId, userId }: { tenantId: string; userId: string }, - bearer_token: string -) { - const query = JSON.stringify({ - relations: [], - findInput: { - userId, - tenantId - } +/** + * Constructs a GET request to fetch user organizations based on tenant and user IDs. + * + * @param param0 - Contains the tenantId and userId. + * @param bearerToken - The bearer token for authorization. + * @returns A promise resolving to a pagination response of user organizations. + * @throws Error if required parameters are missing or invalid. + */ +export function getUserOrganizationsRequest({ tenantId, userId }: { + tenantId: string; + userId: string +}, bearerToken: string) { + if (!tenantId || !userId || !bearerToken) { + throw new Error('Tenant ID, User ID, and Bearer token are required'); // Validate required parameters + } + // Create a new instance of URLSearchParams for query string construction + const query = new URLSearchParams(); + + // Add user and tenant IDs to the query + query.append('where[userId]', userId); + query.append('where[tenantId]', tenantId); + + // If there are relations, add them to the query + const relations: string[] = []; + // Append each relation to the query string + relations.forEach((relation, index) => { + query.append(`relations[${index}]`, relation); }); return serverFetch>({ - path: `/user-organization?data=${encodeURIComponent(query)}`, - method: 'GET', - bearer_token, + path: `/user-organization?${query.toString()}`, // Build query string + method: 'GET', // GET request + bearer_token: bearerToken, // Include bearer token in headers tenantId }); } diff --git a/apps/web/app/services/server/requests/public-organization-team.ts b/apps/web/app/services/server/requests/public-organization-team.ts index 54347c45d..30db4d934 100644 --- a/apps/web/app/services/server/requests/public-organization-team.ts +++ b/apps/web/app/services/server/requests/public-organization-team.ts @@ -22,7 +22,7 @@ export function getPublicOrganizationTeamRequest({ relations?: string[]; }) { const params = { - withLaskWorkedTask: 'true', + withLastWorkedTask: 'true', startDate: moment().startOf('day').toISOString(), endDate: moment().endOf('day').toISOString() } as { [x: string]: string }; @@ -49,7 +49,7 @@ export function getPublicOrganizationTeamMiscDataRequest({ relations?: string[]; }) { const params = { - withLaskWorkedTask: 'true', + withLastWorkedTask: 'true', startDate: moment().startOf('day').toISOString(), endDate: moment().endOf('day').toISOString() } as { [x: string]: string }; diff --git a/apps/web/app/stores/daily-plan.ts b/apps/web/app/stores/daily-plan.ts new file mode 100644 index 000000000..16a399ed2 --- /dev/null +++ b/apps/web/app/stores/daily-plan.ts @@ -0,0 +1,36 @@ +import { atom, selector } from 'recoil'; +import { IDailyPlan, PaginationResponse } from '@app/interfaces'; + +export const dailyPlanListState = atom>({ + key: 'dailyPlanListState', + default: { items: [], total: 0 } +}); + +export const profileDailyPlanListState = atom>({ + key: 'profileDailyPlanListState', + default: { items: [], total: 0 } +}); + +export const taskPlans = atom({ + key: 'taskPlansList', + default: [] +}); + +export const activeDailyPlanIdState = atom({ + key: 'activeDailyPlanIdService', + default: null +}); + +export const dailyPlanFetchingState = atom({ + key: 'dailyPlanFetchingState', + default: false +}); + +export const activeDailyPlanState = selector({ + key: 'activeDailyPlanState', + get: ({ get }) => { + const dailyPlans = get(dailyPlanListState); + const activeId = get(activeDailyPlanIdState); + return dailyPlans.items.find((plan) => plan.id === activeId) || dailyPlans.items[0] || null; + } +}); diff --git a/apps/web/app/stores/fullWidth.ts b/apps/web/app/stores/fullWidth.ts index 85485c666..ace0453fd 100644 --- a/apps/web/app/stores/fullWidth.ts +++ b/apps/web/app/stores/fullWidth.ts @@ -1,6 +1,6 @@ import { atom } from 'recoil'; -export const fullWidthState = atom({ +export const fullWidthState = atom({ key: 'fullWidth', default: true }); diff --git a/apps/web/app/stores/index.ts b/apps/web/app/stores/index.ts index 02fab4487..35f126481 100644 --- a/apps/web/app/stores/index.ts +++ b/apps/web/app/stores/index.ts @@ -16,6 +16,7 @@ export * from './task-sizes'; export * from './task-labels'; export * from './issue-type'; export * from './task-related-issue-type'; +export * from './daily-plan'; export * from './roles'; export * from './role-permissions'; diff --git a/apps/web/app/stores/setting.ts b/apps/web/app/stores/setting.ts new file mode 100644 index 000000000..28b408b70 --- /dev/null +++ b/apps/web/app/stores/setting.ts @@ -0,0 +1,6 @@ +import { atom } from "recoil"; + +export const activeSettingTeamTab = atom({ + key: 'activeSettingTeamTab', + default: '' +}); diff --git a/apps/web/app/stores/team-tasks.ts b/apps/web/app/stores/team-tasks.ts index 27161efe4..78783383e 100644 --- a/apps/web/app/stores/team-tasks.ts +++ b/apps/web/app/stores/team-tasks.ts @@ -12,7 +12,12 @@ export const activeTeamTaskState = atom({ key: 'activeTeamTaskState', default: null }); - +export const activeTeamTaskId = atom<{ id: string }>({ + key: 'activeTeamTaskId', + default: { + id: '' + } +}); export const tasksFetchingState = atom({ key: 'tasksFetchingState', default: false diff --git a/apps/web/app/stores/user.ts b/apps/web/app/stores/user.ts index c5fcb7c58..17396c06d 100644 --- a/apps/web/app/stores/user.ts +++ b/apps/web/app/stores/user.ts @@ -5,3 +5,7 @@ export const userState = atom({ key: 'userState', default: null }); +export const userDetailAccordion = atom({ + key: 'userDetailAccordion', + default: '' +}); diff --git a/apps/web/app/utils/check-provider-env-vars.ts b/apps/web/app/utils/check-provider-env-vars.ts new file mode 100644 index 000000000..848ac64e4 --- /dev/null +++ b/apps/web/app/utils/check-provider-env-vars.ts @@ -0,0 +1,50 @@ +import Apple from 'next-auth/providers/apple'; +import Discord from 'next-auth/providers/discord'; +import Facebook from 'next-auth/providers/facebook'; +import Google from 'next-auth/providers/google'; +import Github from 'next-auth/providers/github'; +import Linkedin from 'next-auth/providers/linkedin'; +import MicrosoftEntraID from 'next-auth/providers/microsoft-entra-id'; +import Slack from 'next-auth/providers/slack'; +import Twitter from 'next-auth/providers/twitter'; +import type { Provider } from 'next-auth/providers'; + +type ProviderNames = { + [key: string]: string | undefined; +}; + +export const providerNames: ProviderNames = { + apple: process.env.NEXT_PUBLIC_APPLE_APP_NAME, + discord: process.env.NEXT_PUBLIC_DISCORD_APP_NAME, + facebook: process.env.NEXT_PUBLIC_FACEBOOK_APP_NAME, + google: process.env.NEXT_PUBLIC_GOOGLE_APP_NAME, + github: process.env.NEXT_PUBLIC_GITHUB_APP_NAME, + linkedin: process.env.NEXT_PUBLIC_LINKEDIN_APP_NAME, + microsoftEntraId: process.env.NEXT_PUBLIC_MICROSOFTENTRAID_APP_NAME, + slack: process.env.NEXT_PUBLIC_SLACK_APP_NAME, + twitter: process.env.NEXT_PUBLIC_TWITTER_APP_NAME +}; + +export const providers: Provider[] = [ + Apple, + Discord, + Facebook, + Google, + Github, + Linkedin, + MicrosoftEntraID, + Slack, + Twitter +]; + +export const filteredProviders = providers.filter((provider) => { + const providerName = provider.name.toLowerCase(); + return providerNames[providerName] !== undefined; +}); + +export const mappedProviders = filteredProviders.map((provider) => { + if (typeof provider === 'function') { + const providerData = provider(); + return { id: providerData.id, name: providerData.name }; + } else return { id: provider.id, name: provider.name }; +}); diff --git a/apps/web/auth.ts b/apps/web/auth.ts new file mode 100644 index 000000000..c18f055fc --- /dev/null +++ b/apps/web/auth.ts @@ -0,0 +1,43 @@ +import NextAuth from 'next-auth'; +import { filteredProviders } from '@app/utils/check-provider-env-vars'; +import { GauzyAdapter, jwtCallback, ProviderEnum, signInCallback } from '@app/services/server/requests/OAuth'; + +export const { handlers, signIn, signOut, auth } = NextAuth({ + providers: filteredProviders, + adapter: GauzyAdapter, + callbacks: { + async signIn({ account }) { + if (account) { + const { provider, access_token } = account; + if (access_token) { + return await signInCallback(provider as ProviderEnum, access_token); + } + } + return true; + }, + + async jwt({ token, user, trigger, session, account }) { + if (user) { + if (account) { + const { access_token, provider } = account; + if (access_token) { + token.authCookie = await jwtCallback(provider as ProviderEnum, access_token); + } + } + } + + if (trigger === 'update' && session) { + token = { ...token, authCookie: session }; + } + + return token; + }, + session({ session, token }) { + session.user = token.authCookie as any; + return session; + } + }, + pages: { + error: '/auth/error' + } +}); diff --git a/apps/web/components/pages/404/index.tsx b/apps/web/components/pages/404/index.tsx index a26d8643a..5e8db526d 100644 --- a/apps/web/components/pages/404/index.tsx +++ b/apps/web/components/pages/404/index.tsx @@ -1,26 +1,32 @@ 'use client'; -import SadCry from '@components/ui/svgs/sad-cry'; +// import SadCry from '@components/ui/svgs/sad-cry'; import { Button, Text } from 'lib/components'; import Link from 'next/link'; +// import { useTranslations } from 'next-intl'; function NotFound() { + // const t = useTranslations(); return ( -
-
- - 404! -
+
+
+
+ {/* */} + 404 +
+ +
+ + Page Not found !{/* {t('pages.notFound.TITLE')} */} + + + + Resource you are looking for is not found ! + - - Page not found ! - -
- - {`We looked, but can't find it ....`} - - - - + +
); diff --git a/apps/web/components/pages/kanban/create-task-modal.tsx b/apps/web/components/pages/kanban/create-task-modal.tsx index a7333efb1..a511869fa 100644 --- a/apps/web/components/pages/kanban/create-task-modal.tsx +++ b/apps/web/components/pages/kanban/create-task-modal.tsx @@ -1,10 +1,11 @@ import { TaskInputKanban } from 'lib/features/task/task-input-kanban'; import React from 'react'; -const CreateTaskModal = (props: { task: any; initEditMode: boolean; tasks: any; title: string }) => { +const CreateTaskModal = (props: { onClose: any; task: any; initEditMode: boolean; tasks: any; title: string }) => { return (
{ + const { editTaskStatus, loading,editTaskStatusLoading } = useTaskStatus(); + const editStatus: any = editTaskStatus; + const [createNew] = useState(status); + const t = useTranslations(); + const { register, handleSubmit, setValue, getValues } = useForm({ + defaultValues: { + name: status.name || '', + color: status.color || '', + icon: status.icon || '' + } + }); + const renameProperty = (newProp: string, icon: string) => { + setColumn((prev: any) => { + const newColumn = prev.map((column: any) => { + if (column.id === status.id) { + return { + ...column, + name: newProp, + icon: !icon.includes('https') ? `https://api.ever.team/public/${icon}` : icon + }; + } + return column; + }); + return newColumn; + }); + }; + + const onSubmit = async (values: EditSet) => { + if (status && values) { + await editStatus(status.id, { ...values, color: !values.color ? status.color : values.color }).then(() => { + renameProperty(values.name, values.icon); + + // Call this function with 'Open1' and 'Open2' when you need to change the property name. + onClose(); + }); + } + }; + const taskStatusIconList: IIcon[] = generateIconList('task-statuses', [ + 'open', + 'in-progress', + 'ready', + 'in-review', + 'blocked', + 'completed' + ]); + const taskSizesIconList: IIcon[] = generateIconList('task-sizes', ['x-large', 'large', 'medium', 'small', 'tiny']); + const taskPrioritiesIconList: IIcon[] = generateIconList('task-priorities', ['urgent', 'high', 'medium', 'low']); + + const iconList: IIcon[] = [...taskStatusIconList, ...taskSizesIconList, ...taskPrioritiesIconList]; + + return ( +
+ +
+ + {createNew ? t('common.NEW') : t('common.EDIT')} {t('common.ISSUE_TYPE')} + +
+ + + v.fullUrl === getValues('icon'))} + /> + setValue('color', e)} /> +
+
+ + +
+
+
+
+ ); +}; + +export default EditStatusModal; diff --git a/apps/web/components/pages/kanban/menu-kanban-card.tsx b/apps/web/components/pages/kanban/menu-kanban-card.tsx new file mode 100644 index 000000000..85e8bbbd5 --- /dev/null +++ b/apps/web/components/pages/kanban/menu-kanban-card.tsx @@ -0,0 +1,101 @@ +import { useTeamMemberCard } from '@app/hooks'; +import { activeTeamTaskId } from '@app/stores'; +import { Popover, PopoverContent, PopoverTrigger } from '@components/ui/popover'; +import { ThreeCircleOutlineVerticalIcon } from 'assets/svg'; +import { HorizontalSeparator, SpinnerLoader } from 'lib/components'; +import { PlanTask } from 'lib/features/task/task-card'; +import { useTranslations } from 'next-intl'; +import { useState } from 'react'; +import { useSetRecoilState } from 'recoil'; + +export default function MenuKanbanCard({ member, item }: { item: any; member: any }) { + const t = useTranslations(); + const { assignTask, unassignTask, assignTaskLoading, unAssignTaskLoading } = useTeamMemberCard(member); + const setActiveTask = useSetRecoilState(activeTeamTaskId); + const [load, setLoad] = useState<'' | 'assign' | 'unassign'>(''); + const menu = [ + { + name: t('common.EDIT_TASK'), + closable: true, + action: 'edit', + active: true, + onClick: () => { + setActiveTask({ + id: item.id + }); + } + }, + { + name: t('common.ESTIMATE'), + closable: true, + action: 'estimate', + onClick: () => { + // TODO: Implement estimate task after fixing the time estimate issue + }, + active: true + }, + { + name: t('common.ASSIGN_TASK'), + action: 'assign', + active: true, + onClick: () => { + setLoad('assign'); + assignTask(item); + } + }, + { + name: t('common.UNASSIGN_TASK'), + action: 'unassign', + closable: true, + active: true, + onClick: () => { + setLoad('unassign'); + unassignTask(item); + } + } + ].filter((item) => item.active || item.active === undefined); + + return ( + + + + + +
    + {menu.map((item) => { + return ( +
  • item?.onClick()}> + +
  • + ); + })} +
+ +
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+ ); +} diff --git a/apps/web/components/pages/main/header-tabs.tsx b/apps/web/components/pages/main/header-tabs.tsx index 942b8783b..00b69117d 100644 --- a/apps/web/components/pages/main/header-tabs.tsx +++ b/apps/web/components/pages/main/header-tabs.tsx @@ -7,13 +7,15 @@ import KanbanIcon from '@components/ui/svgs/kanban'; import { IssuesView } from '@app/constants'; import { useRecoilState } from 'recoil'; import { headerTabs } from '@app/stores/header-tabs'; +import { DottedLanguageObjectStringPaths, useTranslations } from 'next-intl'; const HeaderTabs = ({ linkAll, kanban = false }: { linkAll: boolean; kanban?: boolean }) => { + const t = useTranslations(); const options = [ - { label: 'Cards', icon: QueueListIcon, view: IssuesView.CARDS }, - { label: 'Table', icon: TableCellsIcon, view: IssuesView.TABLE }, - { label: 'Blocks', icon: Squares2X2Icon, view: IssuesView.BLOCKS }, - { label: 'Kanban', icon: KanbanIcon, view: IssuesView.KANBAN } + { label: 'CARDS', icon: QueueListIcon, view: IssuesView.CARDS }, + { label: 'TABLE', icon: TableCellsIcon, view: IssuesView.TABLE }, + { label: 'BLOCKS', icon: Squares2X2Icon, view: IssuesView.BLOCKS }, + { label: 'KANBAN', icon: KanbanIcon, view: IssuesView.KANBAN } ]; const links = linkAll ? ['/', '/', '/', '/kanban'] : [undefined, undefined, undefined, '/kanban']; const [view, setView] = useRecoilState(headerTabs); @@ -21,7 +23,7 @@ const HeaderTabs = ({ linkAll, kanban = false }: { linkAll: boolean; kanban?: bo return ( <> {options.map(({ label, icon: Icon, view: optionView }, index) => ( - +
+ />

diff --git a/apps/web/components/pages/task/description-block/editor-toolbar.tsx b/apps/web/components/pages/task/description-block/editor-toolbar.tsx index b21aa931a..906cfe567 100644 --- a/apps/web/components/pages/task/description-block/editor-toolbar.tsx +++ b/apps/web/components/pages/task/description-block/editor-toolbar.tsx @@ -27,12 +27,20 @@ import { AlignFullIcon, ChevronDownIcon } from 'assets/svg'; +import { BsEmojiSmile } from 'react-icons/bs'; +import { clsxm } from '@app/utils'; +import data from '@emoji-mart/data'; +import Picker from '@emoji-mart/react'; +import { MdOutlineClose } from "react-icons/md"; + interface IToolbarProps { isMarkActive?: (editor: any, format: string) => boolean; isBlockActive?: (editor: any, format: any, blockType?: string) => boolean; + selectEmoji?: (emoji: { native: string }) => void; + showEmojiIcon?: boolean; } -const Toolbar = ({ isMarkActive, isBlockActive }: IToolbarProps) => { +const Toolbar = ({ isMarkActive, isBlockActive, selectEmoji, showEmojiIcon }: IToolbarProps) => { const t = useTranslations(); const editor = useSlateStatic(); const [showLinkPopup, setShowLinkPopup] = useState(false); @@ -43,9 +51,11 @@ const Toolbar = ({ isMarkActive, isBlockActive }: IToolbarProps) => { top: 0 }); const [showDropdown, setShowDropdown] = useState(false); + const [showEmoji, setShowEmoji] = useState(false); const popupRef = useRef(null); const inputRef = useRef(null); const dropdownRef = useRef(null); + const emojiRef = useRef(null); // const handleLinkIconClick = () => { // const selection = editor.selection; @@ -147,6 +157,27 @@ const Toolbar = ({ isMarkActive, isBlockActive }: IToolbarProps) => { }; }, [onClickOutsideOfDropdown]); + useEffect(() => { + const handleClickOutsideOfEmoji = (event: MouseEvent) => { + if (emojiRef.current && !emojiRef.current.contains(event.target as unknown as Node)) { + setShowEmoji(false); + } + }; + + document.addEventListener('mousedown', handleClickOutsideOfEmoji); + return () => { + document.removeEventListener('mousedown', handleClickOutsideOfEmoji); + }; + }, [setShowEmoji]); + + + const addEmoji = (emoji: { native: string }) => { + + if (showEmojiIcon) { + selectEmoji?.(emoji); + } + }; + // const isBlockActiveMemo = useMemo(() => { // return ( // isBlockActive && @@ -161,10 +192,11 @@ const Toolbar = ({ isMarkActive, isBlockActive }: IToolbarProps) => { // }, [editor, isBlockActive]); return ( -
+

{t('pages.taskDetails.DESCRIPTION')}

+ { icon={AlignFullIcon} isBlockActive={isBlockActive as (editor: any, format: any, blockType?: string | undefined) => boolean} /> + + setShowEmoji(true)} className={clsxm('mr-3')} /> + { + showEmoji &&
+
+ setShowEmoji(false)} + className="absolute right-5 cursor-pointer" + /> +
+ +
+ } +
); }; diff --git a/apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx b/apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx index d2500a643..260d9f22e 100644 --- a/apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx +++ b/apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx @@ -50,9 +50,7 @@ const TaskSecondaryInfo = () => { const onVersionCreated = useCallback( (version: ITaskVersionCreate) => { - if ($taskVersion.current.length === 0) { - handleStatusUpdate(version.value || version.name, 'version', task); - } + handleStatusUpdate(version.value || version.name, 'version', task); }, [$taskVersion, task, handleStatusUpdate] ); @@ -72,6 +70,7 @@ const TaskSecondaryInfo = () => { ); const taskLabels = useTaskLabelsValue(); + const tags = useMemo(() => { return ( task?.tags @@ -120,6 +119,7 @@ const TaskSecondaryInfo = () => { /> )} + {task && } {/* Task Status */} @@ -235,7 +235,7 @@ const EpicParent = ({ task }: { task: ITeamTask }) => {
- , +
{`#${task?.rootEpic?.number} ${task?.rootEpic?.title}`}
diff --git a/apps/web/components/pages/task/details-section/components/profile-info-with-time.tsx b/apps/web/components/pages/task/details-section/components/profile-info-with-time.tsx index fb2cbd0cf..44137a048 100644 --- a/apps/web/components/pages/task/details-section/components/profile-info-with-time.tsx +++ b/apps/web/components/pages/task/details-section/components/profile-info-with-time.tsx @@ -15,6 +15,7 @@ const ProfileInfoWithTime = ({ profilePicSrc, names, profileInfoWrapperClassName diff --git a/apps/web/components/pages/task/details-section/components/profile-info.tsx b/apps/web/components/pages/task/details-section/components/profile-info.tsx index 3a8aba4be..e6fc77302 100644 --- a/apps/web/components/pages/task/details-section/components/profile-info.tsx +++ b/apps/web/components/pages/task/details-section/components/profile-info.tsx @@ -8,15 +8,16 @@ import stc from 'string-to-color'; type Props = { profilePicSrc?: string; names?: string; + fullName?: string; wrapperClassName?: string; profilePicSize?: number; }; -const ProfileInfo = ({ profilePicSrc, names, wrapperClassName, profilePicSize }: Props) => { +const ProfileInfo = ({ profilePicSrc, fullName, names, wrapperClassName, profilePicSize }: Props) => { const size = profilePicSize || 20; return ( -
+
= ({ labelIconPath, afterIconPath, labelTitle, alignWithIconLabel }) => { return (
{labelIconPath ? ( { const t = useTranslations(); @@ -28,6 +29,11 @@ const TaskDetailsAside = () => { {/* Divider */}
+ + + {/* Divider */} +
+ {/* Divider */} diff --git a/apps/web/components/pages/task/title-block/task-title-block.tsx b/apps/web/components/pages/task/title-block/task-title-block.tsx index 5628b8024..b19256525 100644 --- a/apps/web/components/pages/task/title-block/task-title-block.tsx +++ b/apps/web/components/pages/task/title-block/task-title-block.tsx @@ -3,7 +3,7 @@ import { ITeamTask } from '@app/interfaces'; import { detailedTaskState } from '@app/stores'; import { HoverCard, HoverCardContent, HoverCardTrigger } from '@components/ui/hover-card'; import { useToast } from '@components/ui/use-toast'; -import { Button, Tooltip } from 'lib/components'; +import { Button, CopyTooltip } from 'lib/components'; import { ActiveTaskIssuesDropdown } from 'lib/features'; import Image from 'next/image'; import { CheckSimpleIcon, CopyRoundIcon } from 'assets/svg'; @@ -15,6 +15,7 @@ import CreateParentTask from '../ParentTask'; import TitleLoader from './title-loader'; import { useTranslations } from 'next-intl'; import { XMarkIcon } from '@heroicons/react/20/solid'; +import { clsxm } from '@app/utils'; const TaskTitleBlock = () => { const { updateTitle, updateLoading } = useTeamTasks(); @@ -30,7 +31,6 @@ const TaskTitleBlock = () => { //States const [edit, setEdit] = useState(false); - const [copied, setCopied] = useState(false); const [task] = useRecoilState(detailedTaskState); const [title, setTitle] = useState(''); @@ -97,16 +97,6 @@ const TaskTitleBlock = () => { titleDOM.current?.style.setProperty('height', titleDOM.current.scrollHeight + 'px'); }; - const copyTitle = () => { - navigator.clipboard.writeText(title); - setCopied(true); - setTimeout(() => setCopied(false), 1500); - }; - - const copyTaskNumber = () => { - task && navigator.clipboard.writeText(task?.taskNumber); - }; - const handleTaskTitleChange = (event: ChangeEvent) => { setTitle(event.target.value); }; @@ -116,15 +106,18 @@ const TaskTitleBlock = () => { {task ? (
+ /> {edit ? (
@@ -133,18 +126,18 @@ const TaskTitleBlock = () => { onClick={() => saveTitle(title)} className="border-2 dark:border-[#464242] rounded-md" > - +
) : ( -
+
- + +
)}
@@ -223,13 +216,12 @@ const TaskTitleBlock = () => {
- + + +
); @@ -244,33 +236,30 @@ const ParentTaskBadge = ({ task }: { task: ITeamTask | null }) => { {`#${task.parent.taskNumber || task.parent.number}`} {` - ${task.parent.title}`} diff --git a/apps/web/components/shared/collaborate/index.tsx b/apps/web/components/shared/collaborate/index.tsx index 8c4e08ee7..e760935ba 100644 --- a/apps/web/components/shared/collaborate/index.tsx +++ b/apps/web/components/shared/collaborate/index.tsx @@ -21,6 +21,7 @@ import stc from 'string-to-color'; import { JitsuAnalytics } from '../../../lib/components/services/jitsu-analytics'; import { useTranslations } from 'next-intl'; import { BrushSquareIcon, PhoneUpArrowIcon, UserLinearIcon } from 'assets/svg'; +import { ScrollArea } from '@components/ui/scroll-bar'; const Collaborate = () => { const { onMeetClick, onBoardClick, collaborativeMembers, setCollaborativeMembers } = useCollaborative(); @@ -89,58 +90,64 @@ const Collaborate = () => { {t('common.USER_NOT_FOUND')} - - {members.map((member) => ( - { - handleMemberClick(member); - }} - > -
+ + {members.map((member) => ( + { + handleMemberClick(member); }} > - {(member?.image?.thumbUrl || member?.image?.fullUrl || member?.imageUrl) && - isValidUrl( - member?.image?.thumbUrl || member?.image?.fullUrl || member?.imageUrl - ) ? ( - + {(member?.image?.thumbUrl || + member?.image?.fullUrl || + member?.imageUrl) && + isValidUrl( + member?.image?.thumbUrl || member?.image?.fullUrl || member?.imageUrl - } - alt="Team Avatar" - imageTitle={member?.name || ''} - > - ) : member?.name ? ( - imgTitle(member?.name || ' ').charAt(0) - ) : ( - '' - )} -
+ ) ? ( + + ) : member?.name ? ( + imgTitle(member?.name || ' ').charAt(0) + ) : ( + '' + )} +
-
-

{member?.name}

-

{member?.email}

-
- {selectedMemberIds.includes(member?.id) ? ( - - ) : null} - - ))} - +
+

{member?.name}

+

{member?.email}

+
+ {selectedMemberIds.includes(member?.id) ? ( + + ) : null} + + ))} + + diff --git a/apps/web/components/ui/accordion.tsx b/apps/web/components/ui/accordion.tsx new file mode 100644 index 000000000..c60b2759b --- /dev/null +++ b/apps/web/components/ui/accordion.tsx @@ -0,0 +1,54 @@ +import * as React from 'react'; +import * as AccordionPrimitive from '@radix-ui/react-accordion'; +import { ChevronDown } from 'lucide-react'; + +import { cn } from 'lib/utils'; + +const Accordion = AccordionPrimitive.Root; + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AccordionItem.displayName = 'AccordionItem'; + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180', + className + )} + {...props} + > + <> + {children} + + + + +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)); + +AccordionContent.displayName = AccordionPrimitive.Content.displayName; + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/apps/web/components/ui/data-table.tsx b/apps/web/components/ui/data-table.tsx index b0a2b3e9e..afeb6631e 100644 --- a/apps/web/components/ui/data-table.tsx +++ b/apps/web/components/ui/data-table.tsx @@ -16,6 +16,7 @@ import { import { Table, TableHeader, TableRow, TableHead, TableCell, TableBody, TableFooter } from './table'; import { Tooltip } from 'lib/components'; +import { clsxm } from '@app/utils'; interface DataTableProps { columns: ColumnDef[]; @@ -48,6 +49,7 @@ function DataTable({ columns, data, footerRows, isHeader }: DataT // Let's set up our default column filter UI size: 20 }, + enableRowSelection: true, onRowSelectionChange: setRowSelection, onSortingChange: setSorting, @@ -60,74 +62,85 @@ function DataTable({ columns, data, footerRows, isHeader }: DataT getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues() }); + return ( - - {isHeader && ( - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header, index) => { - const tooltip: any = header.column.columnDef; - const isTooltip: any = flexRender(tooltip.tooltip, header.getContext()); - return ( - +
+ {isHeader && ( + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header, index) => { + const tooltip: any = header.column.columnDef; + const isTooltip: any = flexRender(tooltip.tooltip, header.getContext()); + return ( + + +
+ {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} +
+
+
+ ); + })} +
+ ))} +
+ )} +
+ + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row, i) => ( + + {row.getVisibleCells().map((cell, index) => ( + - - {header.isPlaceholder - ? null - : flexRender(header.column.columnDef.header, header.getContext())} - - - ); - })} - - ))} - - )} -
- - {table.getRowModel().rows?.length ? ( - table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell, index) => ( - - {flexRender(cell.column.columnDef.cell, cell.getContext())} - - ))} + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + )) + ) : ( + + + No results. + - )) - ) : ( - - - No results. - - + )} + + {footerRows && footerRows?.length > 0 && ( + + {footerRows.map((row, index) => ( + {row} + ))} + )} -
- {footerRows && footerRows?.length > 0 && ( - - {footerRows.map((row, index) => ( - {row} - ))} - - )} -
+ + ); } diff --git a/apps/web/components/ui/dropdown-menu.tsx b/apps/web/components/ui/dropdown-menu.tsx new file mode 100644 index 000000000..eeba02e07 --- /dev/null +++ b/apps/web/components/ui/dropdown-menu.tsx @@ -0,0 +1,179 @@ +import * as React from 'react'; +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'; +import { Check, ChevronRight, Circle } from 'lucide-react'; + +import { cn } from 'lib/utils'; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { + return ; +}; +DropdownMenuShortcut.displayName = 'DropdownMenuShortcut'; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup +}; diff --git a/apps/web/components/ui/popover.tsx b/apps/web/components/ui/popover.tsx index 6f3f1ba18..ccbdc3081 100644 --- a/apps/web/components/ui/popover.tsx +++ b/apps/web/components/ui/popover.tsx @@ -17,7 +17,7 @@ const PopoverContent = React.forwardRef< align={align} sideOffset={sideOffset} className={cn( - 'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + 'z-[9999] w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', className )} {...props} diff --git a/apps/web/components/ui/scroll-bar.tsx b/apps/web/components/ui/scroll-bar.tsx new file mode 100644 index 000000000..dfddf4fae --- /dev/null +++ b/apps/web/components/ui/scroll-bar.tsx @@ -0,0 +1,41 @@ +'use client'; + +import * as React from 'react'; +import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'; +import { clsxm } from '@app/utils'; + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)); +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName; + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = 'vertical', ...props }, ref) => ( + + + +)); +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName; + +export { ScrollArea, ScrollBar }; diff --git a/apps/web/components/ui/select.tsx b/apps/web/components/ui/select.tsx index 85815e7fd..66bfff203 100644 --- a/apps/web/components/ui/select.tsx +++ b/apps/web/components/ui/select.tsx @@ -3,6 +3,7 @@ import * as SelectPrimitive from '@radix-ui/react-select'; import { Check, ChevronDown } from 'lucide-react'; import { cn } from 'lib/utils'; +import { clsxm } from '@app/utils'; const Select = SelectPrimitive.Root; @@ -70,8 +71,10 @@ SelectLabel.displayName = SelectPrimitive.Label.displayName; const SelectItem = React.forwardRef< React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( + { + chevronClass?: string; + } & React.ComponentPropsWithoutRef +>(({ className, chevronClass, children, ...props }, ref) => ( - + diff --git a/apps/web/lib/app/authenticator.tsx b/apps/web/lib/app/authenticator.tsx index ce8855fca..01b5fc609 100644 --- a/apps/web/lib/app/authenticator.tsx +++ b/apps/web/lib/app/authenticator.tsx @@ -9,6 +9,7 @@ import { GetServerSidePropsContext, NextPage, PreviewData } from 'next'; import { ParsedUrlQuery } from 'querystring'; import { useCallback, useEffect, useState } from 'react'; import { useRecoilState } from 'recoil'; +import { getSession } from 'next-auth/react'; type Params = { displayName: string; @@ -17,6 +18,8 @@ type Params = { }; export function withAuthentication(Component: NextPage, params: Params) { + const session = getSession(); + console.log(session); const AppComponent = (props: any) => { // const { trans } = useTranslation(); const [user, setUser] = useRecoilState(userState); diff --git a/apps/web/lib/components/Kanban.tsx b/apps/web/lib/components/Kanban.tsx index db0f3e3ac..70aac0ad4 100644 --- a/apps/web/lib/components/Kanban.tsx +++ b/apps/web/lib/components/Kanban.tsx @@ -23,6 +23,7 @@ import { useModal } from '@app/hooks'; import { Modal } from './modal'; import CreateTaskModal from '@components/pages/kanban/create-task-modal'; import Image from 'next/image'; +import EditStatusModal from '@components/pages/kanban/edit-status-modal'; const grid = 8; @@ -70,32 +71,34 @@ function InnerItemList({ items, title }: { title: string; items: ITeamTask[]; dr return ( <>
- {items.map((item: ITeamTask, index: number) => ( - - {(dragProvided: DraggableProvided, dragSnapshot: DraggableStateSnapshot) => ( - 0 && + items.map((item: ITeamTask, index: number) => ( + + {(dragProvided: DraggableProvided, dragSnapshot: DraggableStateSnapshot) => ( + - )} - - ))} - {items.length == 0 && ( + /> + )} + + ))} + {Array.isArray(items) && items?.length == 0 && (
- not found! + {t('common.NOT_FOUND')}!
)} - +
@@ -146,7 +149,6 @@ export const KanbanDroppable = ({ title, droppableId, type, - isLoading, content }: { title: string; @@ -182,11 +184,15 @@ export const KanbanDroppable = ({ export const EmptyKanbanDroppable = ({ index, title, + status, + setColumn, items, backgroundColor }: { index: number; title: string; + status: any; + setColumn: any; backgroundColor: any; items: ITeamTask[]; }) => { @@ -204,6 +210,7 @@ export const EmptyKanbanDroppable = ({ }, []); const { isOpen, closeModal, openModal } = useModal(); + const { isOpen: editIsOpen, closeModal: editCloseModal, openModal: editOpenModal } = useModal(); if (!enabled) return null; @@ -217,7 +224,7 @@ export const EmptyKanbanDroppable = ({ {...provided.draggableProps} {...provided.dragHandleProps} style={getItemStyle(snapshot.isDragging, provided.draggableProps.style)} - className="flex flex-row px-2 w-fit h-full" + className="flex flex-row px-2 w-fit h-40" > {title.length > 0 ? ( <> @@ -259,9 +266,22 @@ export const EmptyKanbanDroppable = ({ > Collapse Column
+
+ Edit Status +
+ + +
)} - + + + + ); @@ -299,6 +322,8 @@ export const EmptyKanbanDroppable = ({ const KanbanDraggableHeader = ({ title, icon, + setColumn, + status, items, snapshot, createTask, @@ -307,6 +332,8 @@ const KanbanDraggableHeader = ({ }: { title: string; items: any; + setColumn: any; + status: any; icon: string; createTask: () => void; snapshot: DraggableStateSnapshot; @@ -314,6 +341,8 @@ const KanbanDraggableHeader = ({ provided: DraggableProvided; }) => { const { toggleColumn } = useKanban(); + const { isOpen, closeModal, openModal } = useModal(); + return ( <> {title && ( @@ -335,7 +364,7 @@ const KanbanDraggableHeader = ({ flex flex-col items-center justify-center px-2.5 text-xs py-1 text-black bg-transparentWhite rounded-xl" > - {items.length} + {items?.length ?? '0'}
@@ -361,12 +390,9 @@ const KanbanDraggableHeader = ({ > Collapse Column
- {/*
toggleColumn(title, true)} - > +
Edit Status -
*/} +
+
+
+
+ +
+
+ ); + } return (
{firstArray.map((image, index) => ( - +
- -
- {secondArray.map((image: ImageOverlapperProps, index: number) => { - return ( - -
- {`${image.alt} -

{image.alt}

-
- - ); - })} -
+ + +
+ {secondArray.map((image: ImageOverlapperProps, index: number) => { + return ( + +
+ {`${image.alt} +

{image.alt}

+
+ + ); + })} +
+
)} diff --git a/apps/web/lib/components/index.ts b/apps/web/lib/components/index.ts index 18b9f617c..f5f1215e6 100644 --- a/apps/web/lib/components/index.ts +++ b/apps/web/lib/components/index.ts @@ -10,6 +10,7 @@ export * from './dropdown'; export * from './auto-complete-dropdown'; export * from './modal'; export * from './avatar'; +export * from './accordian'; export * from './toggler'; export * from './divider'; export * from './breadcrumb'; @@ -25,3 +26,4 @@ export * from './inputs/input'; export * from './inputs/auth-code-input'; export * from './services/recaptcha'; +export * from './copy-tooltip'; diff --git a/apps/web/lib/components/inputs/auth-code-input.tsx b/apps/web/lib/components/inputs/auth-code-input.tsx index 14265ec99..6b22b54e3 100644 --- a/apps/web/lib/components/inputs/auth-code-input.tsx +++ b/apps/web/lib/components/inputs/auth-code-input.tsx @@ -111,14 +111,13 @@ export const AuthCodeInputField = forwardRef( sendResult(); } })); - useEffect(() => { if (autoFocus) { setTimeout(() => { inputsRef.current[0].focus(); }, 100); } - }, [autoFocus]); + }, [autoFocus, inputsRef]); const sendResult = () => { const res = inputsRef.current.map((input) => input.value).join(''); diff --git a/apps/web/lib/components/inputs/input.tsx b/apps/web/lib/components/inputs/input.tsx index de5e9d690..aa5e4aa16 100644 --- a/apps/web/lib/components/inputs/input.tsx +++ b/apps/web/lib/components/inputs/input.tsx @@ -3,9 +3,23 @@ import { mergeRefs } from '@app/helpers'; import { IClassName } from '@app/interfaces'; import { clsxm } from '@app/utils'; -import { Dispatch, forwardRef, ReactNode, SetStateAction, useEffect, useRef, useState } from 'react'; +import { + Dispatch, + forwardRef, + MutableRefObject, + ReactNode, + Ref, + SetStateAction, + useEffect, + useRef, + useState +} from 'react'; +import { useOutsideClick } from '@app/hooks/useOutsideClick'; import { SpinnerLoader } from '../loader'; import { Text } from '../typography'; +import { BsEmojiSmile } from 'react-icons/bs'; +import data from '@emoji-mart/data'; +import Picker from '@emoji-mart/react'; type Props = { readonly errors?: Record; @@ -16,6 +30,9 @@ type Props = { leadingNode?: ReactNode; autoCustomFocus?: boolean; notValidBorder?: boolean; + emojis?: boolean; + setTaskName?: (taskName: string) => void; + ignoreElementRefForTitle?: MutableRefObject; } & React.ComponentPropsWithRef<'input'>; export const InputField = forwardRef( @@ -32,13 +49,48 @@ export const InputField = forwardRef( leadingNode, autoCustomFocus, notValidBorder, + emojis, + setTaskName, + ignoreElementRefForTitle, ...res }, ref ) => { const [error, setError] = useState(undefined); const inputRef = useRef(null); + const [showEmoji, setShowEmoji] = useState(false); + const [clickInput, setClickInput] = useState(false); + const addEmoji = (emoji: { native: string }) => { + const input = inputRef.current as HTMLInputElement | null; + if (input) { + const currentValue = input.value || ''; + const newValue = currentValue + emoji.native; + if (setTaskName) { + setTaskName(newValue); + } + input.value = newValue; + input.focus(); + } + setShowEmoji(false); + }; + const handleOutsideClick = () => { + setShowEmoji(false); + }; + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (inputRef.current && !inputRef.current.contains(event.target as Node)) { + setClickInput(false); + } + }; + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [setClickInput]); + + const { targetEl } = useOutsideClick(handleOutsideClick); useEffect(() => { if (errors && name && errors[name]) { setError(errors[name]); @@ -79,10 +131,18 @@ export const InputField = forwardRef( className )} onKeyUp={onKeyUp} + onClick={() => setClickInput(true)} + onMouseOut={() => { + if (showEmoji == true) { + setShowEmoji(false); + } + }} {...res} /> ); + const filteredRefs = [targetEl, ignoreElementRefForTitle].filter(Boolean); + return noWrapper ? ( inputElement ) : ( @@ -93,15 +153,36 @@ export const InputField = forwardRef( )} >
{leadingNode &&
{leadingNode}
}
{inputElement}
+ {emojis && ( +
{clickInput && <> + setShowEmoji(true)} className={clsxm('mr-3')} /> + {showEmoji && ( +
| MutableRefObject)[] + )} + className="absolute right-1 z-50" + > + +
+ )}} +
+ )} {trailingNode &&
{trailingNode}
}
- {error && {error}}
); @@ -125,7 +206,7 @@ type ITimeProps = { export const TimeInputField = forwardRef( ({ className, type = 'text', label, dash = '__', wrapperClassName, value, loading, ...res }, ref) => { return ( -
+
( /> {dash}
- {!loading ? label : } + + {loading && } + {!loading && {label} }
); } @@ -147,7 +230,6 @@ TimeInputField.displayName = 'TimeInputField'; /** * RadioButtonField */ - export const RadioButtonField = forwardRef( ({ className, type = 'radio', errors, name, wrapperClassName, noWrapper, ...res }, ref) => { const [error, setError] = useState(undefined); diff --git a/apps/web/lib/components/kanban-card.tsx b/apps/web/lib/components/kanban-card.tsx index cfab76262..0410fac13 100644 --- a/apps/web/lib/components/kanban-card.tsx +++ b/apps/web/lib/components/kanban-card.tsx @@ -1,22 +1,17 @@ import { DraggableProvided } from 'react-beautiful-dnd'; import PriorityIcon from '@components/ui/svgs/priority-icon'; import { ITaskPriority, ITeamTask, Tag } from '@app/interfaces'; -import { - useAuthenticateUser, - useCollaborative, - useOrganizationTeams, - useTMCardTaskEdit, - useTaskStatistics, - useTeamMemberCard -} from '@app/hooks'; +import { useAuthenticateUser, useOrganizationTeams, useTaskStatistics, useTeamMemberCard } from '@app/hooks'; import ImageComponent, { ImageOverlapperProps } from './image-overlapper'; import { TaskAllStatusTypes, TaskInput, TaskIssueStatus } from 'lib/features'; import Link from 'next/link'; import CircularProgress from '@components/ui/svgs/circular-progress'; import { HorizontalSeparator } from './separator'; import { secondsToTime } from '@app/helpers'; -import { UserTeamCardMenu } from 'lib/features/team/user-team-card/user-team-card-menu'; import { TaskStatus } from '@app/constants'; +import MenuKanbanCard from '@components/pages/kanban/menu-kanban-card'; +import { activeTeamTaskId } from '@app/stores'; +import { useRecoilState } from 'recoil'; function getStyle(provided: DraggableProvided, style: any) { if (!style) { @@ -133,6 +128,7 @@ export default function Item(props: ItemProps) { const { activeTeam } = useOrganizationTeams(); const { user } = useAuthenticateUser(); const { getEstimation } = useTaskStatistics(0); + const [activeTask, setActiveTask] = useRecoilState(activeTeamTaskId); const members = activeTeam?.members || []; const currentUser = members.find((m) => m.employee.userId === user?.id); @@ -145,7 +141,6 @@ export default function Item(props: ItemProps) { }); const memberInfo = useTeamMemberCard(currentUser); - const taskEdition = useTMCardTaskEdit(memberInfo.memberTask); const taskAssignee: ImageOverlapperProps[] = item.members.map((member: any) => { return { @@ -154,9 +149,7 @@ export default function Item(props: ItemProps) { alt: member.user.firstName }; }); - const { collaborativeSelect } = useCollaborative(memberInfo.memberUser); - const menu = <>{!collaborativeSelect && }; const progress = getEstimation(null, item, totalWorkedTasksTimer || 1, item.estimate || 0); const currentMember = activeTeam?.members.find((member) => member.id === memberInfo.member?.id || item?.id); @@ -183,52 +176,54 @@ export default function Item(props: ItemProps) { - {menu} + + +
- {!taskEdition.editMode ? ( + {activeTask?.id == item.id ? ( <> - -
- {item.issueType && ( - - - - - - )} - #{item.number} - {item.title} - - {item.priority && } - -
- +
+ { + // TODO: implement + console.log(e); + }} + onEnterKey={() => { + setActiveTask({ id: '' }); + }} + /> +
) : ( -
- { - // TODO: implement - console.log(e); - }} - onEnterKey={() => { - taskEdition.setEditMode(false); - }} - /> -
+ +
+ {item.issueType && ( + + + + + + )} + #{item.number} + {item.title} + + {item.priority && } + +
+ )}
@@ -255,7 +250,7 @@ export default function Item(props: ItemProps) {
)}
- + {item.issueType && (
(

- {item.heading} + {t(`hotkeys.${item.heading}` as DottedLanguageObjectStringPaths)}

{item.keySequence.map((keySeq, keySeqIndex) => ( @@ -49,7 +49,7 @@ export function KeyboardShortcuts() { key={`key-seq-${keySeqIndex}`} >
-

{keySeq.label}

+

{t(`hotkeys.${keySeq.label}` as DottedLanguageObjectStringPaths)}

{[...(os === 'Mac' ? keySeq.sequence.MAC : keySeq.sequence.OTHER)].map( diff --git a/apps/web/lib/components/no-data.tsx b/apps/web/lib/components/no-data.tsx index f749e9ba6..f90d2b768 100644 --- a/apps/web/lib/components/no-data.tsx +++ b/apps/web/lib/components/no-data.tsx @@ -1,10 +1,10 @@ import { Text } from 'lib/components'; -export function NoData({ text }: { text: string }) { +export function NoData({ text, component }: { text: string; component?: React.ReactNode }) { return (
- 0 + {component ?? '0'}
{text} diff --git a/apps/web/lib/components/pagination.tsx b/apps/web/lib/components/pagination.tsx index 4960bf91d..5601da628 100644 --- a/apps/web/lib/components/pagination.tsx +++ b/apps/web/lib/components/pagination.tsx @@ -17,7 +17,7 @@ export function Paginate({ total, itemsPerPage = 10, onPageChange, itemOffset, e return (
-
+
{`Showing ${itemOffset + 1} to ${endOffset} of ${total} entries`} diff --git a/apps/web/lib/components/switch.tsx b/apps/web/lib/components/switch.tsx index 6e39e09a2..5f421c857 100644 --- a/apps/web/lib/components/switch.tsx +++ b/apps/web/lib/components/switch.tsx @@ -1,6 +1,6 @@ import { useOrganizationTeams } from '@app/hooks'; import { useOrganizationEmployeeTeams } from '@app/hooks/features/useOrganizatioTeamsEmployee'; -import { OT_Member } from '@app/interfaces'; +import { OT_Member, RoleNameEnum } from '@app/interfaces'; import { Switch } from '@headlessui/react'; import { useCallback, useEffect, useState } from 'react'; import { Text } from './typography'; @@ -49,3 +49,57 @@ export default function TimeTrackingToggle({ activeManager }: { activeManager: O
); } + +export function ShareProfileViewsToggle() { + const t = useTranslations(); + const { activeTeam, editOrganizationTeam } = useOrganizationTeams(); + const [enabled, setEnabled] = useState(activeTeam?.shareProfileView); + + const handleChange = useCallback(async () => { + if (activeTeam && typeof enabled != 'undefined') { + await editOrganizationTeam({ + ...activeTeam, + shareProfileView: !enabled, + memberIds: activeTeam.members + .map((t) => t.employee.id) + .filter((value, index, array) => array.indexOf(value) === index), + managerIds: activeTeam.members + .filter( + (m) => + m.role && + (m.role.name === RoleNameEnum.MANAGER || + m.role.name === RoleNameEnum.SUPER_ADMIN || + m.role.name === RoleNameEnum.ADMIN) + ) + .map((t) => t.employee.id) + .filter((value, index, array) => array.indexOf(value) === index) + }); + setEnabled(!enabled); + } + }, [activeTeam, editOrganizationTeam, enabled]); + + useEffect(() => { + setEnabled(activeTeam?.shareProfileView); + }, [activeTeam?.shareProfileView]); + + return ( +
+ { + handleChange(); + }} + className={`${enabled ? 'bg-[#DBD3FA]' : 'bg-[#80808061]'} + relative inline-flex h-[38px] w-[74px] shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75`} + > + {t('common.USE_SETTING')} + + {enabled ? t('common.ACTIVATED') : t('common.DEACTIVATED')} +
+ ); +} diff --git a/apps/web/lib/components/team-member.tsx b/apps/web/lib/components/team-member.tsx new file mode 100644 index 000000000..dd59d488a --- /dev/null +++ b/apps/web/lib/components/team-member.tsx @@ -0,0 +1,40 @@ +import { UserInfo } from 'lib/features/team/user-team-card/user-info'; +import { useTeamMemberCard } from '@app/hooks'; +import { FaCheck } from "react-icons/fa6"; +import { useEffect } from 'react'; +import { IEmployee } from '@app/interfaces'; + +export default function TeamMember( + { member, item, onCheckMember, membersList, validate } + : + { member: any; item: any; onCheckMember: any; membersList: any; validate: any } +) { + const memberInfo = useTeamMemberCard(member); + const { assignTask } = useTeamMemberCard(member); + const checkAssign = membersList.assignedMembers.some((el:IEmployee) => el.id === member.employeeId); + const checkUnassign = membersList.unassignedMembers.some((el:IEmployee) => el.id === member.employeeId); + + useEffect(() => { + if (validate) { + if (checkAssign) { + assignTask(item); + } else if (checkUnassign) { + memberInfo.unassignTask(item); + } + } + }, [validate, checkAssign, checkUnassign, item, assignTask, memberInfo]); + + const assignMember = () => { + onCheckMember(member.employee); + } + + return ( +
{ assignMember() }} + className="w-100 cursor-pointer flex items-center" + > + + {checkAssign ? () : (<>)} +
+ ); +} diff --git a/apps/web/lib/features/activity/screenshoots.tsx b/apps/web/lib/features/activity/screenshoots.tsx index 6a1984030..6cae32e83 100644 --- a/apps/web/lib/features/activity/screenshoots.tsx +++ b/apps/web/lib/features/activity/screenshoots.tsx @@ -21,7 +21,9 @@ export function ScreenshootTab() { {/* Stats cards */}
{t('timer.TIME_ACTIVITY')} -

{activityPercent.toFixed(2)} %

+

+ {isNaN(parseFloat(activityPercent.toFixed(2))) ? '00' : activityPercent.toFixed(2)} % +

diff --git a/apps/web/lib/features/daily-plan/add-task-to-plan.tsx b/apps/web/lib/features/daily-plan/add-task-to-plan.tsx new file mode 100644 index 000000000..75c0b30eb --- /dev/null +++ b/apps/web/lib/features/daily-plan/add-task-to-plan.tsx @@ -0,0 +1,204 @@ +import { useCallback, useEffect, useState } from 'react'; +import { Check } from 'lucide-react'; +import { useDailyPlan } from '@app/hooks'; +import { DailyPlanStatusEnum, IDailyPlan, ITeamTask, OT_Member } from '@app/interfaces'; +import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@components/ui/command'; +import { ScrollArea } from '@components/ui/scroll-bar'; +import { formatDayPlanDate, tomorrowDate } from '@app/helpers'; +import { Card, InputField, Modal, Text } from 'lib/components'; +import { Button } from '@components/ui/button'; +import { CalendarIcon, ReloadIcon } from '@radix-ui/react-icons'; +import { Popover, PopoverContent, PopoverTrigger } from '@components/ui/popover'; +import { cn } from 'lib/utils'; +import moment from 'moment'; +import { Calendar } from '@components/ui/calendar'; + +export function AddTaskToPlan({ + open, + closeModal, + task, + employee +}: { + open: boolean; + closeModal: () => void; + task: ITeamTask; + employee?: OT_Member; +}) { + const { createDailyPlan, addTaskToPlan, getEmployeeDayPlans, profileDailyPlans, addTaskToPlanLoading } = + useDailyPlan(); + const [selectedPlan, setSelectedPlan] = useState(null); + const [newPlan, setNewPlan] = useState(false); + const [date, setDate] = useState(new Date()); + const [workTimePlanned, setworkTimePlanned] = useState(0); + + const handlePlanClick = useCallback((plan: IDailyPlan) => { + setSelectedPlan(plan); + }, []); + + const onSubmit = useCallback(async () => { + newPlan + ? createDailyPlan({ + workTimePlanned: workTimePlanned, + taskId: task.id, + date: new Date(moment(date).format('YYYY-MM-DD')), + status: DailyPlanStatusEnum.OPEN, + tenantId: employee?.tenantId, + employeeId: employee?.employeeId, + organizationId: employee?.organizationId + }).then(() => { + closeModal(); + }) + : addTaskToPlan({ employeeId: employee?.employeeId ?? '', taskId: task.id }, selectedPlan?.id ?? '').then( + () => { + closeModal(); + } + ); + }, [ + addTaskToPlan, + closeModal, + createDailyPlan, + date, + employee?.employeeId, + employee?.organizationId, + employee?.tenantId, + newPlan, + selectedPlan?.id, + task.id, + workTimePlanned + ]); + + useEffect(() => { + getEmployeeDayPlans(employee?.employeeId ?? ''); + }, [employee?.employeeId, getEmployeeDayPlans]); + + return ( + + +
+
+ + ADD THE TASK TO DAY PLAN + + + + You are adding the task "{task.title} + " to a plan + +
+ {newPlan ? ( +
+ setworkTimePlanned(parseFloat(e.target.value))} + required + /> + + + + + + setDate(day ? day : new Date(tomorrowDate))} + initialFocus + disabled={{ + from: new Date(1970, 1, 1), + to: moment().subtract(1, 'days').toDate() + }} + /> + + +
+ ) : ( + + )} + + setNewPlan((prev) => !prev)} + > + {newPlan ? 'Add to an existing plan' : 'Create a new Plan'} + +
+
+
+ ); +} + +function PlansList({ + plans, + selectedPlan, + handlePlanClik +}: { + plans: IDailyPlan[]; + handlePlanClik: (plan: IDailyPlan) => void; + selectedPlan: IDailyPlan | null; +}) { + return ( + + + + No plan founded + + + {plans + .filter((plan) => { + const planDate = new Date(plan?.date); + const today = new Date(); + today.setHours(0, 0, 0, 0); // Set today time to exclude timestamps in comparization + return planDate.getTime() > today.getTime(); + }) + .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()) + .map((plan) => ( + { + handlePlanClik(plan); + }} + > +
+

+ {plan?.date ? formatDayPlanDate(plan.date) : ''} ({plan?.tasks?.length}) +

+

+ Planned time : {plan?.workTimePlanned} +

+
+ {selectedPlan?.id == plan?.id && ( + + )} +
+ ))} +
+
+
+
+ ); +} diff --git a/apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx b/apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx new file mode 100644 index 000000000..3264fe250 --- /dev/null +++ b/apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx @@ -0,0 +1,235 @@ +import { useCallback, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { DailyPlanStatusEnum, IDailyPlanMode, IOrganizationTeamList, OT_Member } from '@app/interfaces'; +import { useAuthenticateUser, useDailyPlan, useOrganizationTeams } from '@app/hooks'; +import { Avatar, Card, InputField, Modal, Text } from 'lib/components'; +import { imgTitle, tomorrowDate } from '@app/helpers'; +import { Popover, PopoverContent, PopoverTrigger } from '@components/ui/popover'; +import { cn } from 'lib/utils'; +import { CalendarIcon, ReloadIcon } from '@radix-ui/react-icons'; +import moment from 'moment'; +import { Calendar } from '@components/ui/calendar'; +import { Button } from '@components/ui/button'; + +import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@components/ui/command'; +import { ScrollArea } from '@components/ui/scroll-bar'; +import { clsxm, isValidUrl } from '@app/utils'; +import stc from 'string-to-color'; +import { Check } from 'lucide-react'; + +export function CreateDailyPlanFormModal({ + open, + closeModal, + taskId, + planMode, + employeeId, + chooseMember +}: { + open: boolean; + closeModal: () => void; + taskId: string; + planMode: IDailyPlanMode; + employeeId?: string; + chooseMember?: boolean; +}) { + const { handleSubmit, reset, register } = useForm(); + const { user } = useAuthenticateUser(); + const { activeTeam, activeTeamManagers } = useOrganizationTeams(); + const { createDailyPlan, createDailyPlanLoading } = useDailyPlan(); + + const isManagerConnectedUser = activeTeamManagers.find((member) => member.employee?.user?.id == user?.id); + + const [date, setDate] = useState(new Date(tomorrowDate)); + const [selectedEmployee, setSelectedEmployee] = useState(isManagerConnectedUser); + + const handleMemberClick = useCallback((member: OT_Member) => { + setSelectedEmployee(member); + }, []); + + const onSubmit = useCallback( + async (values: any) => { + const toDay = new Date(); + createDailyPlan({ + workTimePlanned: parseInt(values.workTimePlanned), + taskId, + date: + planMode == 'today' + ? toDay + : planMode == 'tomorow' + ? tomorrowDate + : new Date(moment(date).format('YYYY-MM-DD')), + status: DailyPlanStatusEnum.OPEN, + tenantId: user?.tenantId ?? '', + employeeId: employeeId ?? selectedEmployee?.employeeId, + organizationId: user?.employee.organizationId + }).then(() => { + reset(); + closeModal(); + }); + }, + [ + createDailyPlan, + taskId, + planMode, + date, + user?.tenantId, + user?.employee.organizationId, + employeeId, + selectedEmployee?.employeeId, + reset, + closeModal + ] + ); + return ( + +
+ +
+ {/* Form header */} +
+ + CREATE A DAY PLAN + + + You are creating a new plan +
+ + {/* Form Fields */} +
+ {chooseMember && isManagerConnectedUser && ( + + )} + + + + {planMode === 'custom' && ( + + + + + + setDate(day ? day : new Date(tomorrowDate))} + initialFocus + disabled={{ from: new Date(1970, 1, 1), to: tomorrowDate }} + /> + + + )} + + +
+
+
+
+
+ ); +} + +function MembersList({ + activeTeam, + handleMemberClick, + selectedMember +}: { + activeTeam: IOrganizationTeamList | null; + selectedMember?: OT_Member; + handleMemberClick: (member: OT_Member) => void; +}) { + return ( + + + + No member founded + + + {activeTeam?.members.map((member) => ( + { + handleMemberClick(member); + }} + > +
+ {(member?.employee?.user?.image?.thumbUrl || + member?.employee?.user?.image?.fullUrl || + member?.employee?.user?.imageUrl) && + isValidUrl( + member?.employee?.user?.image?.thumbUrl || + member?.employee?.user?.image?.fullUrl || + member?.employee?.user?.imageUrl || + '' + ) ? ( + + ) : member?.employee.fullName ? ( + imgTitle(member?.employee.fullName || ' ').charAt(0) + ) : ( + '' + )} +
+ +
+

{member?.employee.fullName}

+

{member?.employee.user?.email}

+
+ {selectedMember?.id == member?.id && ( + + )} +
+ ))} +
+
+
+
+ ); +} diff --git a/apps/web/lib/features/index.ts b/apps/web/lib/features/index.ts index 5fc67fb4d..688b0f985 100644 --- a/apps/web/lib/features/index.ts +++ b/apps/web/lib/features/index.ts @@ -29,6 +29,7 @@ export * from './team/user-team-card/task-skeleton'; export * from './auth-user-task-input'; export * from './user-nav-menu'; +export * from './user-profile-plans'; export * from './user-profile-tasks'; // custom exports diff --git a/apps/web/lib/features/task/daily-plan/future-tasks.tsx b/apps/web/lib/features/task/daily-plan/future-tasks.tsx new file mode 100644 index 000000000..eda300ea7 --- /dev/null +++ b/apps/web/lib/features/task/daily-plan/future-tasks.tsx @@ -0,0 +1,90 @@ +import { formatDayPlanDate, tomorrowDate } from '@app/helpers'; +import { IDailyPlan } from '@app/interfaces'; +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@components/ui/accordion'; +import { EmptyPlans, PlanHeader } from 'lib/features/user-profile-plans'; +import { TaskCard } from '../task-card'; +import { Button } from '@components/ui/button'; +import { useCanSeeActivityScreen, useDailyPlan } from '@app/hooks'; +import { ReloadIcon } from '@radix-ui/react-icons'; + +export function FutureTasks({ dayPlans, profile }: { dayPlans: IDailyPlan[]; profile: any }) { + const ascSortedPlans = [...dayPlans].sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); + const filteredPlans = ascSortedPlans.filter((plan) => { + const planDate = new Date(plan.date); + const today = new Date(); + today.setHours(23, 59, 59, 0); // Set today time to exclude timestamps in comparization + return planDate.getTime() >= today.getTime(); + }); + const { deleteDailyPlan, deleteDailyPlanLoading } = useDailyPlan(); + const canSeeActivity = useCanSeeActivityScreen(); + + return ( +
+ {filteredPlans.length > 0 ? ( + + {filteredPlans.map((plan) => ( + + +
+ {formatDayPlanDate(plan.date.toString())} ({plan.tasks?.length}) +
+
+ + {/* Plan header */} + + + {/* Plan tasks list */} +
    + {plan.tasks?.map((task) => ( + + ))} +
+ + {/* Delete Plan */} + {canSeeActivity ? ( +
+ +
+ ) : ( + <> + )} +
+
+ ))} +
+ ) : ( + + )} +
+ ); +} diff --git a/apps/web/lib/features/task/daily-plan/index.ts b/apps/web/lib/features/task/daily-plan/index.ts new file mode 100644 index 000000000..cbcface80 --- /dev/null +++ b/apps/web/lib/features/task/daily-plan/index.ts @@ -0,0 +1,2 @@ +export * from './outstanding'; +export * from './past-tasks'; diff --git a/apps/web/lib/features/task/daily-plan/outstanding.tsx b/apps/web/lib/features/task/daily-plan/outstanding.tsx new file mode 100644 index 000000000..e5a0e65ec --- /dev/null +++ b/apps/web/lib/features/task/daily-plan/outstanding.tsx @@ -0,0 +1,75 @@ +import { formatDayPlanDate } from '@app/helpers'; +import { IDailyPlan } from '@app/interfaces'; +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@components/ui/accordion'; +import { EmptyPlans, PlanHeader } from 'lib/features/user-profile-plans'; +import { TaskCard } from '../task-card'; + +export function Outstanding({ dayPlans, profile }: { dayPlans: IDailyPlan[]; profile: any }) { + const filteredPlans = [...dayPlans] + // Exclude today plans + .filter((plan) => !plan.date?.toString()?.startsWith(new Date()?.toISOString().split('T')[0])) + + // Exclude future plans + .filter((plan) => { + const planDate = new Date(plan.date); + const today = new Date(); + today.setHours(23, 59, 59, 0); // Set today time to exclude timestamps in comparization + return planDate.getTime() <= today.getTime(); + }) + .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()) + .map((plan) => ({ + ...plan, + // Include only no completed tasks + tasks: plan.tasks?.filter((task) => task.status !== 'completed') + })) + .filter((plan) => plan.tasks?.length && plan.tasks.length > 0); + return ( +
+ {filteredPlans?.length > 0 ? ( + new Date(plan.date).toISOString().split('T')[0])} + > + {filteredPlans?.map((plan) => ( + + +
+ {formatDayPlanDate(plan.date.toString())} ({plan.tasks?.length}) +
+
+ + {/* Plan header */} + + + {/* Plan tasks list */} +
    + {plan.tasks?.map((task) => ( + + ))} +
+
+
+ ))} +
+ ) : ( + + )} +
+ ); +} diff --git a/apps/web/lib/features/task/daily-plan/past-tasks.tsx b/apps/web/lib/features/task/daily-plan/past-tasks.tsx new file mode 100644 index 000000000..88f0c7b62 --- /dev/null +++ b/apps/web/lib/features/task/daily-plan/past-tasks.tsx @@ -0,0 +1,63 @@ +import { formatDayPlanDate, yesterdayDate } from '@app/helpers'; +import { IDailyPlan } from '@app/interfaces'; +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@components/ui/accordion'; +import { EmptyPlans, PlanHeader } from 'lib/features/user-profile-plans'; +import { TaskCard } from '../task-card'; + +export function PastTasks({ dayPlans, profile }: { dayPlans: IDailyPlan[]; profile: any }) { + const descSortedPlans = [...dayPlans].sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); + const filteredPlans = descSortedPlans.filter((plan) => { + const planDate = new Date(plan.date); + const today = new Date(); + today.setHours(0, 0, 0, 0); // Set today time to exclude timestamps in comparization + return planDate.getTime() < today.getTime(); + }); + return ( +
+ {filteredPlans?.length > 0 ? ( + + {filteredPlans?.map((plan) => ( + + +
+ {formatDayPlanDate(plan.date.toString())} ({plan.tasks?.length}) +
+
+ + {/* Plan header */} + + + {/* Plan tasks list */} +
    + {plan.tasks?.map((task) => ( + + ))} +
+
+
+ ))} +
+ ) : ( + + )} +
+ ); +} diff --git a/apps/web/lib/features/task/task-all-status-type.tsx b/apps/web/lib/features/task/task-all-status-type.tsx index 26c67f1a3..ce783a704 100644 --- a/apps/web/lib/features/task/task-all-status-type.tsx +++ b/apps/web/lib/features/task/task-all-status-type.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useCustomEmblaCarousel, useSyncRef } from '@app/hooks'; +import { useCustomEmblaCarousel, useDailyPlan, useSyncRef } from '@app/hooks'; import { ITeamTask, Nullable } from '@app/interfaces'; import { RoundedButton } from 'lib/components'; import { useEffect, useMemo } from 'react'; @@ -12,6 +12,8 @@ import { useTaskStatusValue } from './task-status'; import { clsxm } from '@app/utils'; +import { planBadgeContent } from '@app/helpers'; +import { CalendarIcon } from '@radix-ui/react-icons'; export function TaskAllStatusTypes({ task, @@ -29,6 +31,8 @@ export function TaskAllStatusTypes({ const taskLabels = useTaskLabelsValue(); const taskStatus = useTaskStatusValue(); + const { dailyPlan, getAllDayPlans } = useDailyPlan(); + const { viewportRef, nextBtnEnabled, scrollNext, prevBtnEnabled, scrollPrev, emblaApi } = useCustomEmblaCarousel( 0, { @@ -43,6 +47,10 @@ export function TaskAllStatusTypes({ emblaApiRef.current?.reInit(); }, [task, emblaApiRef]); + useEffect(() => { + getAllDayPlans(); + }, [getAllDayPlans]); + const tags = useMemo(() => { return ( task?.tags @@ -86,7 +94,12 @@ export function TaskAllStatusTypes({ titleClassName={'text-[0.625rem] font-[500]'} /> )} - + {planBadgeContent(dailyPlan.items, task?.id ?? '') && ( +
+ + {planBadgeContent(dailyPlan.items, task?.id ?? '')} +
+ )} {tags.map((tag, i) => { return ( ; disabled: boolean; + iconClassName?: string } & IClassName; -export function TaskAssignButton({ onClick, disabled, className }: Props) { +export function TaskAssignButton({ onClick, disabled, className, iconClassName }: Props) { return ( ); } diff --git a/apps/web/lib/features/task/task-assign-popover.tsx b/apps/web/lib/features/task/task-assign-popover.tsx index 59c4f68ab..79c0a440b 100644 --- a/apps/web/lib/features/task/task-assign-popover.tsx +++ b/apps/web/lib/features/task/task-assign-popover.tsx @@ -75,6 +75,7 @@ export function TaskUnOrAssignPopover({ fullWidthCombobox fullHeightCombobox autoFocus + assignTaskPopup={true} /> diff --git a/apps/web/lib/features/task/task-card.tsx b/apps/web/lib/features/task/task-card.tsx index 73087c029..d06e77ed9 100644 --- a/apps/web/lib/features/task/task-card.tsx +++ b/apps/web/lib/features/task/task-card.tsx @@ -4,6 +4,9 @@ import { secondsToTime } from '@app/helpers'; import { I_TeamMemberCardHook, I_UserProfilePage, + useCanSeeActivityScreen, + useDailyPlan, + useModal, useOrganizationEmployeeTeams, useOrganizationTeams, useTMCardTaskEdit, @@ -12,12 +15,23 @@ import { useTeamTasks, useTimerView } from '@app/hooks'; -import { IClassName, IOrganizationTeamList, ITeamTask, Nullable, OT_Member } from '@app/interfaces'; +import ImageComponent, { ImageOverlapperProps } from 'lib/components/image-overlapper'; +import { + IClassName, + IDailyPlan, + IDailyPlanMode, + IDailyPlanTasksUpdate, + IOrganizationTeamList, + ITeamTask, + Nullable, + OT_Member +} from '@app/interfaces'; import { timerSecondsState } from '@app/stores'; import { clsxm } from '@app/utils'; import { Popover, Transition } from '@headlessui/react'; import { Card, + Divider, // ConfirmDropdown, SpinnerLoader, Text, @@ -30,27 +44,32 @@ import { SetterOrUpdater, useRecoilValue } from 'recoil'; import { TaskEstimateInfo } from '../team/user-team-card/task-estimate'; import { TimerButton } from '../timer/timer-button'; import { TaskAllStatusTypes } from './task-all-status-type'; -import { TaskAssignButton } from './task-assign-button'; import { TaskNameInfoDisplay } from './task-displays'; import { TaskAvatars } from './task-item'; import { ActiveTaskStatusDropdown } from './task-status'; import { TaskTimes } from './task-times'; import { useTranslations } from 'next-intl'; import { SixSquareGridIcon, ThreeCircleOutlineVerticalIcon } from 'assets/svg'; +import { CreateDailyPlanFormModal } from '../daily-plan/create-daily-plan-form-modal'; +import { AddTaskToPlan } from '../daily-plan/add-task-to-plan'; type Props = { active?: boolean; task?: Nullable; isAuthUser: boolean; activeAuthTask: boolean; - viewType?: 'default' | 'unassign'; + viewType?: 'default' | 'unassign' | 'dailyplan'; profile?: I_UserProfilePage; editTaskId?: string | null; setEditTaskId?: SetterOrUpdater; taskBadgeClassName?: string; taskTitleClassName?: string; + plan?: IDailyPlan; + planMode?: FilterTabs; } & IClassName; +type FilterTabs = 'Today Tasks' | 'Future Tasks' | 'Past Tasks' | 'All Tasks' | 'Outstanding'; + export function TaskCard(props: Props) { const { active, @@ -61,7 +80,9 @@ export function TaskCard(props: Props) { viewType = 'default', profile, taskBadgeClassName, - taskTitleClassName + taskTitleClassName, + plan, + planMode } = props; const t = useTranslations(); const [loading, setLoading] = useState(false); @@ -102,6 +123,16 @@ export function TaskCard(props: Props) { const memberInfo = useTeamMemberCard(currentMember || undefined); const taskEdition = useTMCardTaskEdit(task); + const activeMembers = task != null && task?.members?.length > 0; + const hasMembers = task?.members && task?.members?.length > 0 ; + const taskAssignee: ImageOverlapperProps[] = + task?.members?.map((member: any) => { + return { + id: member.user.id, + url: member.user.imageUrl, + alt: member.user.firstName + }; + }) || []; return ( <> @@ -128,7 +159,7 @@ export function TaskCard(props: Props) { />
- {viewType === 'default' && ( + {(viewType === 'default' || viewType === 'dailyplan') && ( <> {/* TaskEstimateInfo */}
@@ -138,8 +169,15 @@ export function TaskCard(props: Props) { )} {viewType === 'unassign' && ( -
+
+
)} @@ -162,13 +200,7 @@ export function TaskCard(props: Props) { className="w-11 h-11" /> )} - {!isAuthUser && task && viewType === 'unassign' && ( - - )} +
@@ -184,7 +216,15 @@ export function TaskCard(props: Props) { {/* TaskCardMenu */} {task && currentMember && ( - + )}
@@ -236,7 +276,13 @@ export function TaskCard(props: Props) { setLoading(load)} /> {task && currentMember && ( - + )}
@@ -338,37 +384,7 @@ function TimerButtonCall({ ); } -function AssignTaskButtonCall({ - task, - assignTask, - className -}: { - task: ITeamTask; - assignTask: (task: ITeamTask) => Promise; - className?: string; -}) { - const { - disabled, - - timerStatus, - activeTeamTask - } = useTimerView(); - - const activeTaskStatus = activeTeamTask?.id === task.id ? timerStatus : undefined; - - return ( - { - assignTask(task); - }} - disabled={activeTaskStatus ? disabled : task.status === 'closed'} - className={clsxm('h-9 w-9', className)} - /> - ); -} - //* Task Estimate info * - //* Task Info FC * function TaskInfo({ className, @@ -416,12 +432,18 @@ function TaskCardMenu({ task, loading, memberInfo, - viewType + viewType, + profile, + plan, + planMode }: { task: ITeamTask; loading?: boolean; memberInfo?: I_TeamMemberCardHook; - viewType: 'default' | 'unassign'; + viewType: 'default' | 'unassign' | 'dailyplan'; + profile?: I_UserProfilePage; + plan?: IDailyPlan; + planMode?: FilterTabs; }) { const t = useTranslations(); const handleAssignment = useCallback(() => { @@ -432,6 +454,8 @@ function TaskCardMenu({ } }, [memberInfo, task, viewType]); + const canSeeActivity = useCanSeeActivityScreen(); + return ( @@ -451,7 +475,7 @@ function TaskCardMenu({ {() => { return ( - +
  • -
  • +
  • + {viewType == 'default' && ( + <> + +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
    + + )} + + {viewType === 'dailyplan' && planMode === 'Outstanding' && ( + <> + {canSeeActivity ? ( + + ) : ( + <> + )} + + )} + + {viewType === 'dailyplan' && + (planMode === 'Today Tasks' || planMode === 'Future Tasks') && ( + <> + {canSeeActivity ? ( +
    + +
    + +
    +
    + ) : ( + <> + )} + + )} {/*
  • ); } + +export function PlanTask({ + planMode, + taskId, + employeeId, + chooseMember +}: { + taskId: string; + planMode: IDailyPlanMode; + employeeId?: string; + chooseMember?: boolean; +}) { + const { closeModal, isOpen, openModal } = useModal(); + + return ( + <> + + + {planMode === 'today' && 'Plan for today'} + {planMode === 'tomorow' && 'Plan for tomorow'} + {planMode === 'custom' && 'Plan for some day'} + + + ); +} + +export function AddTaskToPlanComponent({ task, employee }: { task: ITeamTask; employee?: OT_Member }) { + const { closeModal, isOpen, openModal } = useModal(); + return ( + + + Add this task to a plan + + ); +} + +export function RemoveTaskFromPlan({ task, plan, member }: { task: ITeamTask; member?: OT_Member; plan?: IDailyPlan }) { + const { removeTaskFromPlan } = useDailyPlan(); + const data: IDailyPlanTasksUpdate = { taskId: task.id, employeeId: member?.employeeId }; + const onClick = () => { + removeTaskFromPlan(data, plan?.id ?? ''); + }; + return ( + + Remove from this plan + + ); +} diff --git a/apps/web/lib/features/task/task-filters.tsx b/apps/web/lib/features/task/task-filters.tsx index bf70e7db8..852151902 100644 --- a/apps/web/lib/features/task/task-filters.tsx +++ b/apps/web/lib/features/task/task-filters.tsx @@ -1,7 +1,7 @@ 'use client'; /* eslint-disable no-mixed-spaces-and-tabs */ -import { I_UserProfilePage, useOutsideClick } from '@app/hooks'; +import { I_UserProfilePage, useAuthenticateUser, useOrganizationTeams, useOutsideClick } from '@app/hooks'; import { IClassName, ITeamTask } from '@app/interfaces'; import { clsxm } from '@app/utils'; import { Transition } from '@headlessui/react'; @@ -14,7 +14,7 @@ import { TaskLabelsDropdown, TaskPropertiesDropdown, TaskSizesDropdown, TaskStat import { useTranslations } from 'next-intl'; import { SettingFilterIcon } from 'assets/svg'; -type ITab = 'worked' | 'assigned' | 'unassigned'; +type ITab = 'worked' | 'assigned' | 'unassigned' | 'dailyplan'; type ITabs = { tab: ITab; name: string; @@ -33,10 +33,15 @@ type StatusFilter = { [x in IStatusType]: string[] }; */ export function useTaskFilter(profile: I_UserProfilePage) { const t = useTranslations(); - const defaultValue = typeof window !== 'undefined' ? (window.localStorage.getItem('task-tab') as ITab) || null : 'worked'; + const { activeTeamManagers, activeTeam } = useOrganizationTeams(); + const { user } = useAuthenticateUser(); + + const isManagerConnectedUser = activeTeamManagers.findIndex((member) => member.employee?.user?.id == user?.id); + const canSeeActivity = profile.userProfile?.id === user?.id || isManagerConnectedUser != -1; + const [tab, setTab] = useState(defaultValue || 'worked'); const [filterType, setFilterType] = useState(undefined); @@ -49,7 +54,8 @@ export function useTaskFilter(profile: I_UserProfilePage) { const tasksFiltered: { [x in ITab]: ITeamTask[] } = { unassigned: profile.tasksGrouped.unassignedTasks, assigned: profile.tasksGrouped.assignedTasks, - worked: profile.tasksGrouped.workedTasks + worked: profile.tasksGrouped.workedTasks, + dailyplan: [] // Change this soon }; const tasks = tasksFiltered[tab]; @@ -66,12 +72,6 @@ export function useTaskFilter(profile: I_UserProfilePage) { }); const tabs: ITabs[] = [ - { - tab: 'worked', - name: t('common.WORKED'), - description: t('task.tabFilter.WORKED_DESCRIPTION'), - count: profile.tasksGrouped.workedTasks.length - }, { tab: 'assigned', name: t('common.ASSIGNED'), @@ -86,6 +86,22 @@ export function useTaskFilter(profile: I_UserProfilePage) { } ]; + // For tabs on profile page, display "Worked" and "Daily Plan" only for the logged in user or managers + if (activeTeam?.shareProfileView || canSeeActivity) { + tabs.push({ + tab: 'dailyplan', + name: 'Daily Plan', + description: 'This tab shows all yours tasks planned', + count: profile.tasksGrouped.dailyplan?.length + }); + tabs.unshift({ + tab: 'worked', + name: t('common.WORKED'), + description: t('task.tabFilter.WORKED_DESCRIPTION'), + count: profile.tasksGrouped.workedTasks.length + }); + } + useEffect(() => { window.localStorage.setItem('task-tab', tab); }, [tab]); @@ -152,7 +168,7 @@ export function useTaskFilter(profile: I_UserProfilePage) { ? intersection( statusFilters[k], task['tags'].map((item) => item.name) - ).length === statusFilters[k].length + ).length === statusFilters[k].length : statusFilters[k].includes(task[k]); }); }); @@ -346,7 +362,7 @@ export function TaskStatusFilter({ hook }: { hook: I_TaskFilter }) { const t = useTranslations(); return ( -
    +
    void; cardWithoutShadow?: boolean; + onClose: any; forParentChildRelationship?: boolean; } & PropsWithChildren; @@ -73,13 +70,8 @@ export function TaskInputKanban(props: Props) { tasks: props.tasks }); - const { updateOrganizationTeamEmployee } = useOrganizationEmployeeTeams(); - const { activeTeam } = useOrganizationTeams(); - const { user } = useAuthenticateUser(); - const onCloseComboboxRef = useCallbackRef(props.onCloseCombobox); const closeable_fcRef = useCallbackRef(props.closeable_fc); - const $onTaskClick = useCallbackRef(props.onTaskClick); const $onTaskCreated = useCallbackRef(props.onTaskCreated); const inputRef = useRef(null); const timerStatus = useRecoilValue(timerStatusState); @@ -92,13 +84,16 @@ export function TaskInputKanban(props: Props) { [$onTaskCreated] ); - const onTaskClick = useCallback( - (task: ITeamTask) => $onTaskClick.current && $onTaskClick.current(task), - [$onTaskClick] - ); - - const { inputTask, editMode, setEditMode, setQuery, updateLoading, updateTaskTitleHandler, setFilter, taskIssue } = - datas; + const { + inputTask, + setTaskIssue, + editMode, + setEditMode, + setQuery, + updateLoading, + updateTaskTitleHandler, + setFilter + } = datas; const inputTaskTitle = useMemo(() => inputTask?.title || '', [inputTask?.title]); @@ -123,32 +118,6 @@ export function TaskInputKanban(props: Props) { !editMode && onCloseComboboxRef.current && onCloseComboboxRef.current(); }, [editMode, onCloseComboboxRef]); - /** - * set the active task for the authenticated user - */ - const setAuthActiveTask = useCallback( - (task: ITeamTask) => { - if (datas.setActiveTask) { - datas.setActiveTask(task); - - // Update Current user's active task to sync across multiple devices - const currentEmployeeDetails = activeTeam?.members.find( - (member) => member.employeeId === user?.employee?.id - ); - if (currentEmployeeDetails && currentEmployeeDetails.id) { - updateOrganizationTeamEmployee(currentEmployeeDetails.id, { - organizationId: task.organizationId, - activeTaskId: task.id, - organizationTeamId: activeTeam?.id, - tenantId: activeTeam?.tenantId - }); - } - } - setEditMode(false); - }, - [datas, setEditMode, activeTeam, user, updateOrganizationTeamEmployee] - ); - /** * On update task name */ @@ -183,7 +152,6 @@ export function TaskInputKanban(props: Props) { If task is passed then we don't want to set the active task for the authenticated user. after task creation */ - const autoActiveTask = props.task !== undefined ? false : true; const handleTaskCreation = useCallback(async () => { /* Checking if the `handleTaskCreation` is available and if the `hasCreateForm` is true. */ datas && @@ -191,15 +159,17 @@ export function TaskInputKanban(props: Props) { datas.hasCreateForm && datas .handleTaskCreation({ - autoActiveTask, + autoActiveTask: true, autoAssignTaskAuth: props.autoAssignTaskAuth, assignToUsers: props.usersTaskCreatedAssignTo || [] }) ?.then(onTaskCreated) .finally(async () => { setTaskName(''); + + props.onClose && props.onClose(); }); - }, [datas, autoActiveTask, props.autoAssignTaskAuth, props.usersTaskCreatedAssignTo, onTaskCreated]); + }, [datas, props, onTaskCreated]); let updatedTaskList: ITeamTask[] = []; if (props.forParentChildRelationship) { @@ -231,7 +201,6 @@ export function TaskInputKanban(props: Props) { const handleClickOutside = (event: MouseEvent) => { if (inputRef.current && !inputRef.current.contains(event.target as Node) && editMode) { inputTask && updateTaskNameHandler(inputTask, taskName); - // console.log('func active'); } }; @@ -313,9 +282,7 @@ export function TaskInputKanban(props: Props) { { - taskIssue.current = v; - }} + onValueChange={(v) => setTaskIssue(v)} />
    } @@ -325,7 +292,6 @@ export function TaskInputKanban(props: Props) { const taskCard = ( ); @@ -345,21 +310,17 @@ export function TaskInputKanban(props: Props) { */ function TaskCard({ datas, - onItemClick, inputField, kanbanTitle, - handleTaskCreation, - forParentChildRelationship + handleTaskCreation }: { datas: Partial; - onItemClick?: (task: ITeamTask) => void; inputField?: JSX.Element; kanbanTitle: string; fullWidth?: boolean; fullHeight?: boolean; handleTaskCreation: () => void; cardWithoutShadow?: boolean; - forParentChildRelationship?: boolean; updatedTaskList?: ITeamTask[]; }) { const t = useTranslations(); @@ -383,7 +344,6 @@ function TaskCard({ } }, [datas.editMode]); const taskStatusHook = useTaskStatus(); - return ( <> @@ -473,26 +433,6 @@ function TaskCard({
    - - - {!forParentChildRelationship && - datas.filteredTasks?.map((task, i) => { - const last = (datas.filteredTasks?.length || 0) - 1 === i; - const active = datas.inputTask === task; - - return ( -
  • - - - {!last && } -
  • - ); - })} {/* Just some spaces at the end */} diff --git a/apps/web/lib/features/task/task-input.tsx b/apps/web/lib/features/task/task-input.tsx index 495328456..0a320fb9a 100644 --- a/apps/web/lib/features/task/task-input.tsx +++ b/apps/web/lib/features/task/task-input.tsx @@ -6,21 +6,30 @@ import { useAuthenticateUser, useCallbackRef, useHotkeys, + useIssueType, useOrganizationEmployeeTeams, useOrganizationTeams, useOutsideClick, useTaskInput, useTaskLabels } from '@app/hooks'; -import { ITaskPriority, ITaskSize, ITaskStatus, ITeamTask, Nullable } from '@app/interfaces'; -import { timerStatusState } from '@app/stores'; +import { + IIssueTypesItemList, + ITaskIssue, + ITaskPriority, + ITaskSize, + ITaskStatus, + ITeamTask, + Nullable +} from '@app/interfaces'; +import { activeTeamTaskId, timerStatusState } from '@app/stores'; import { clsxm } from '@app/utils'; import { Popover, Transition } from '@headlessui/react'; import { PlusIcon } from '@heroicons/react/20/solid'; import { Button, Card, Divider, InputField, OutlineBadge, SpinnerLoader, Tooltip } from 'lib/components'; import { CheckCircleTickIcon as TickCircleIcon } from 'assets/svg'; import { MutableRefObject, PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { useRecoilValue } from 'recoil'; +import { useRecoilValue, useSetRecoilState } from 'recoil'; import { ActiveTaskIssuesDropdown, TaskIssuesDropdown } from './task-issue'; import { TaskItem } from './task-item'; import { TaskLabels } from './task-labels'; @@ -44,6 +53,7 @@ type Props = { createOnEnterClick?: boolean; showTaskNumber?: boolean; showCombobox?: boolean; + showEmoji?: boolean; autoAssignTaskAuth?: boolean; fullWidthCombobox?: boolean; fullHeightCombobox?: boolean; @@ -53,6 +63,7 @@ type Props = { usersTaskCreatedAssignTo?: { id: string }[]; onTaskCreated?: (task: ITeamTask | undefined) => void; cardWithoutShadow?: boolean; + assignTaskPopup?: boolean; forParentChildRelationship?: boolean; } & PropsWithChildren; @@ -66,6 +77,8 @@ type Props = { export function TaskInput(props: Props) { const t = useTranslations(); + const { issueTypes } = useIssueType(); + const defaultIssueType: IIssueTypesItemList | undefined = issueTypes.find((issue) => issue.isDefault); const { viewType = 'input-trigger', showTaskNumber = false, showCombobox = true } = props; @@ -99,8 +112,17 @@ export function TaskInput(props: Props) { [$onTaskClick] ); - const { inputTask, editMode, setEditMode, setQuery, updateLoading, updateTaskTitleHandler, setFilter, taskIssue } = - datas; + const { + inputTask, + setTaskIssue, + editMode, + setEditMode, + setQuery, + updateLoading, + updateTaskTitleHandler, + setFilter + } = datas; + const setActiveTask = useSetRecoilState(activeTeamTaskId); const inputTaskTitle = useMemo(() => inputTask?.title || '', [inputTask?.title]); @@ -186,7 +208,6 @@ export function TaskInput(props: Props) { after task creation */ const autoActiveTask = props.task !== undefined ? false : true; - const handleTaskCreation = useCallback(() => { /* Checking if the `handleTaskCreation` is available and if the `hasCreateForm` is true. */ datas && @@ -233,8 +254,13 @@ export function TaskInput(props: Props) { useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (inputRef.current && !inputRef.current.contains(event.target as Node) && editMode) { - inputTask && updateTaskNameHandler(inputTask, taskName); - // console.log('func active'); + // inputTask && updateTaskNameHandler(inputTask, taskName); + if (taskName == inputTaskTitle) { + setEditMode(false); + setActiveTask({ + id: '' + }); + } } }; @@ -245,7 +271,7 @@ export function TaskInput(props: Props) { return () => { document.removeEventListener('mousedown', handleClickOutside); }; - }, [inputTask, taskName, updateTaskNameHandler, editMode]); + }, [inputTask, taskName, setActiveTask, updateTaskNameHandler, editMode, inputTaskTitle, setEditMode]); // Handling Hotkeys const handleCommandKeySequence = useCallback(() => { @@ -258,6 +284,7 @@ export function TaskInput(props: Props) { setEditMode(false); } }, [setEditMode, editMode, targetEl]); + useHotkeys(HostKeys.CREATE_TASK, handleCommandKeySequence); useEffect(() => { @@ -266,11 +293,16 @@ export function TaskInput(props: Props) { } }, [props.autoFocus, targetEl]); + // const savedIssueType : string | null = localStorage.getItem('savedIssueType') as string && null; + const inputField = ( } autoFocus={props.autoFocus} wrapperClassName={`rounded-lg dark:bg-[#1B1D22]`} placeholder={props.placeholder || t('form.TASK_INPUT_PLACEHOLDER')} @@ -308,7 +340,7 @@ export function TaskInput(props: Props) { 'dark:bg-[#1B1D22]', props.initEditMode && 'h-10' )} - /* Showing the task number. */ + /* Showing the task number and issue type */ leadingNode={ // showTaskNumber && // inputTask && @@ -319,11 +351,9 @@ export function TaskInput(props: Props) { task={inputTask} forParentChildRelationship={true} taskStatusClassName={clsxm( - `${ - inputTask && inputTask.issueType === 'Bug' - ? '!px-[0.3312rem] py-[0.2875rem] rounded-sm' - : '!px-[0.375rem] py-[0.375rem] rounded-sm' - } `, + inputTask && inputTask.issueType === 'Bug' + ? '!px-[0.3312rem] py-[0.2875rem] rounded-sm' + : '!px-[0.375rem] py-[0.375rem] rounded-sm', 'border-none' )} /> @@ -331,9 +361,12 @@ export function TaskInput(props: Props) { { - taskIssue.current = v; - }} + onValueChange={(v) => setTaskIssue(v)} + defaultValue={ + defaultIssueType + ? defaultIssueType.name + : (localStorage.getItem('lastTaskIssue') as ITaskIssue) || null + } /> )} @@ -354,6 +387,7 @@ export function TaskInput(props: Props) { fullHeight={props.fullHeightCombobox} handleTaskCreation={handleTaskCreation} cardWithoutShadow={props.cardWithoutShadow} + assignTaskPopup={props.assignTaskPopup} updatedTaskList={updatedTaskList} forParentChildRelationship={props.forParentChildRelationship} /> @@ -362,7 +396,7 @@ export function TaskInput(props: Props) { return viewType === 'one-view' ? ( taskCard ) : ( - + ; onItemClick?: (task: ITeamTask) => void; @@ -415,7 +450,9 @@ function TaskCard({ cardWithoutShadow?: boolean; forParentChildRelationship?: boolean; updatedTaskList?: ITeamTask[]; + assignTaskPopup?: boolean; }) { + const [, setCount] = useState(0); const t = useTranslations(); const activeTaskEl = useRef(null); const { taskLabels: taskLabelsData } = useTaskLabels(); @@ -440,20 +477,20 @@ function TaskCard({ shadow="custom" className={clsxm( 'rounded-xl md:px-4 md:py-4', - 'overflow-hidden', !cardWithoutShadow && ['shadow-xlcard'], fullWidth ? ['w-full'] : ['md:w-[500px]'], fullHeight ? 'h-full' : 'max-h-96' )} > {inputField} -
    +
    {/* Create team button */}
    {datas.hasCreateForm && (
    { if (taskDescription) { taskDescription.current = e.target.value; @@ -470,6 +507,7 @@ function TaskCard({ if (v && taskStatus) { taskStatus.current = v; } + setCount((c) => c + 1); }} defaultValue={taskStatus?.current as ITaskStatus} task={null} @@ -482,6 +520,7 @@ function TaskCard({ if (v && taskPriority) { taskPriority.current = v; } + setCount((c) => c + 1); }} defaultValue={taskPriority?.current as ITaskPriority} task={null} @@ -494,6 +533,7 @@ function TaskCard({ if (v && taskSize) { taskSize.current = v; } + setCount((c) => c + 1); }} defaultValue={taskSize?.current as ITaskSize} task={null} @@ -573,7 +613,7 @@ function TaskCard({ {/* Task list */} -
      +
        {forParentChildRelationship && data?.map((task, i) => { const last = (datas.filteredTasks?.length || 0) - 1 === i; diff --git a/apps/web/lib/features/task/task-issue.tsx b/apps/web/lib/features/task/task-issue.tsx index 2925df597..c68719934 100644 --- a/apps/web/lib/features/task/task-issue.tsx +++ b/apps/web/lib/features/task/task-issue.tsx @@ -19,22 +19,26 @@ export const taskIssues: TStatus = { Bug: { icon: , name: 'Bug', - bgColor: '#923535' + bgColor: '#923535', + className: 'min-w-[5rem]' }, Task: { icon: , name: 'Task', - bgColor: '#5483BA' + bgColor: '#5483BA', + className: 'min-w-[5rem]' }, Story: { icon: , name: 'Story', - bgColor: '#66BB97' + bgColor: '#66BB97', + className: 'min-w-[5rem]' }, Epic: { icon: , name: 'Custom', - bgColor: '#8154BA' + bgColor: '#8154BA', + className: 'min-w-[5rem]' } }; @@ -103,6 +107,7 @@ export function ActiveTaskIssuesDropdown({ ...props }: IActiveTaskStatuses<'issu [IssueType.BUG]: items.filter((it) => [IssueType.STORY, IssueType.TASK].includes(it.value as IssueType)) }; + let updatedItemsBasedOnTaskIssueType: TStatusItem[] = []; if (props.task && props.task?.issueType && props.task.parent) { diff --git a/apps/web/lib/features/task/task-item.tsx b/apps/web/lib/features/task/task-item.tsx index a0f735665..f84d3323f 100644 --- a/apps/web/lib/features/task/task-item.tsx +++ b/apps/web/lib/features/task/task-item.tsx @@ -1,9 +1,10 @@ import { imgTitle } from '@app/helpers'; import { useTeamTasks } from '@app/hooks'; -import { IClassName, ITaskStatus, ITeamTask } from '@app/interfaces'; +import { IClassName, ITaskStatus, IEmployee, ITeamTask } from '@app/interfaces'; import { clsxm, isValidUrl } from '@app/utils'; import clsx from 'clsx'; import { Avatar, ConfirmDropdown, SpinnerLoader, Tooltip } from 'lib/components'; +import ImageComponent, { ImageOverlapperProps } from 'lib/components/image-overlapper'; import { CrossIcon, RefreshIcon } from 'assets/svg'; import Link from 'next/link'; import { useCallback } from 'react'; @@ -117,8 +118,25 @@ export function TaskItem({ task, selected, onClick, className }: Props) { ); } -export function TaskAvatars({ task, limit = 2 }: { task: ITeamTask; limit?: number }) { +type PartialITeamTask = Partial & { members: IEmployee[] }; + +export function TaskAvatars({ task, limit = 2 }: { task: PartialITeamTask; limit?: number }) { const members = task.members; + const taskAssignee: ImageOverlapperProps[] = members.map((member: any) => { + return { + id: member.user.id, + url: member.user.imageUrl, + alt: member.user.firstName + }; + }); + + if (!members.length) { + return ( +
        + +
        + ); + } return (
        e.stopPropagation()}> @@ -129,7 +147,7 @@ export function TaskAvatars({ task, limit = 2 }: { task: ITeamTask; limit?: numb const size = 30; return ( - +
        = { @@ -824,11 +825,12 @@ export function TaskStatus({ {name && (issueType !== 'issue' || showIssueLabels) && (
        @@ -985,8 +987,7 @@ export function StatusDropdown({ 'text-dark dark:text-white bg-[#F2F2F2] dark:bg-dark--theme-light', forDetails && 'bg-transparent border dark:border-[#FFFFFF33] dark:bg-[#1B1D22]', - taskStatusClassName, - 'max-w-10' + taskStatusClassName )} name={ values.length > 0 @@ -1023,6 +1024,7 @@ export function StatusDropdown({ > {items.map((item, i) => { const item_value = item.value || item.name; + return ( ({ issueType === 'issue' && [ 'rounded-md px-2 text-white' ], - `${sidebarUI ? 'rounded-[4px]' : ''}`, - `${bordered ? 'input-border' : ''}`, - (isVersion || isEpic) && 'dark:text-white' + sidebarUI && 'rounded-[4px]', + bordered && 'input-border', + (isVersion || isEpic) && 'dark:text-white', + item?.className )} /> diff --git a/apps/web/lib/features/team-members-block-view.tsx b/apps/web/lib/features/team-members-block-view.tsx index 0ef7bad86..0643621eb 100644 --- a/apps/web/lib/features/team-members-block-view.tsx +++ b/apps/web/lib/features/team-members-block-view.tsx @@ -5,6 +5,7 @@ import { UserTeamBlock } from './team/user-team-block'; import { useRecoilValue } from 'recoil'; import { taskBlockFilterState } from '@app/stores/task-filter'; import { UserTeamCardSkeleton } from './team/user-team-card/task-skeleton'; +import { useTranslations } from 'next-intl'; interface Props { teamMembers: OT_Member[]; @@ -22,19 +23,20 @@ const TeamMembersBlockView: React.FC = ({ const activeFilter = useRecoilValue(taskBlockFilterState); let emptyMessage = ''; + const t = useTranslations(); switch (activeFilter) { case 'online': - emptyMessage = 'There are no users online.'; + emptyMessage = t('common.NO_USERS_ONLINE'); break; case 'running': - emptyMessage = 'No users are currently working.'; + emptyMessage = t('common.NO_USERS_WORKING'); break; case 'pause': - emptyMessage = 'No users are paused work at the moment.'; + emptyMessage = t('common.NO_USERS_PAUSED_WORK'); break; case 'idle': - emptyMessage = 'No users are idle right now.'; + emptyMessage = t('common.NO_USERS_IDLE'); break; } diff --git a/apps/web/lib/features/team-members-card-view.tsx b/apps/web/lib/features/team-members-card-view.tsx index 6411f4d8c..38f0ad379 100644 --- a/apps/web/lib/features/team-members-card-view.tsx +++ b/apps/web/lib/features/team-members-card-view.tsx @@ -4,7 +4,7 @@ import { InviteFormModal } from './team/invite/invite-form-modal'; import { InvitedCard, InviteUserTeamCard } from './team/invite/user-invite-card'; import { InviteUserTeamSkeleton, UserTeamCard, UserTeamCardSkeleton } from '.'; import { OT_Member } from '@app/interfaces'; -import React from 'react'; +import React, { useEffect } from 'react'; interface Props { teamMembers: OT_Member[]; @@ -30,6 +30,8 @@ const TeamMembersCardView: React.FC = ({ const dragTeamMember = React.useRef(0); const draggedOverTeamMember = React.useRef(0); + useEffect(() => setMemberOrdereds(members), [members]); + function handleSort() { const peopleClone = [...memberOrdereds]; const temp = peopleClone[dragTeamMember.current]; diff --git a/apps/web/lib/features/team-members-kanban-view.tsx b/apps/web/lib/features/team-members-kanban-view.tsx index f17aa6de4..3433236d7 100644 --- a/apps/web/lib/features/team-members-kanban-view.tsx +++ b/apps/web/lib/features/team-members-kanban-view.tsx @@ -2,6 +2,7 @@ import { useTaskStatus } from '@app/hooks'; import { useKanban } from '@app/hooks/features/useKanban'; import { ITaskStatusItemList, ITeamTask } from '@app/interfaces'; import { IKanban } from '@app/interfaces/IKanban'; +import { fullWidthState } from '@app/stores/fullWidth'; import { clsxm } from '@app/utils'; import KanbanDraggable, { EmptyKanbanDroppable } from 'lib/components/Kanban'; import React from 'react'; @@ -14,6 +15,7 @@ import { DroppableProvided, DroppableStateSnapshot } from 'react-beautiful-dnd'; +import { useRecoilValue } from 'recoil'; export const KanbanView = ({ kanbanBoardTasks, isLoading }: { kanbanBoardTasks: IKanban; isLoading: boolean }) => { const { @@ -25,13 +27,14 @@ export const KanbanView = ({ kanbanBoardTasks, isLoading }: { kanbanBoardTasks: reorderStatus, addNewTask } = useKanban(); - const [columns, setColumn] = useState( Object.keys(kanbanBoardTasks).map((key) => { const columnInfo = kanbanColumns.find((item) => item.name === key); - return { name: key, icon: columnInfo ? columnInfo.fullIconUrl : '' }; + return { id: columnInfo?.id, name: key, icon: columnInfo ? columnInfo.fullIconUrl : '',color: columnInfo?.color }; }) ); + const fullWidth = useRecoilValue(fullWidthState); + const { taskStatus: ts } = useTaskStatus(); const reorderTask = (list: ITeamTask[], startIndex: number, endIndex: number) => { const tasks = Array.from(list); @@ -73,14 +76,14 @@ export const KanbanView = ({ kanbanBoardTasks, isLoading }: { kanbanBoardTasks: currentTaskStatus.splice(sourceIndex, 1); const taskstatus = destinationDroppableID as any; - + const updateTaskStatusData = { ...targetStatus, status: taskstatus, taskStatusId: ts.find((v) => v.name?.toLowerCase() == taskstatus.toLowerCase())?.id }; - // update task status on the server + // update task status on the server updateTaskStatus(updateTaskStatusData); // insert into next @@ -98,11 +101,11 @@ export const KanbanView = ({ kanbanBoardTasks, isLoading }: { kanbanBoardTasks: }; const getHeaderBackground = (columns: ITaskStatusItemList[], column: string) => { - const selectState = columns.filter((item: ITaskStatusItemList) => { + const selectState = columns.find((item: ITaskStatusItemList) => { return item.name === column; }); - return selectState[0].color; + return selectState?.color ?? 'white'; }; const reorderColumn = (column: any[], sourceIndex: number, destinationIndex: number) => { @@ -122,7 +125,6 @@ export const KanbanView = ({ kanbanBoardTasks, isLoading }: { kanbanBoardTasks: const onDragEnd = (result: DropResult) => { if (result.combine) { if (result.type === 'COLUMN') { - console.log('re-order-column'); const shallow = [...columns]; shallow.splice(result.source.index, 1); setColumn(shallow); @@ -160,7 +162,7 @@ export const KanbanView = ({ kanbanBoardTasks, isLoading }: { kanbanBoardTasks: if (result.type === 'COLUMN') { const reorderedItem = reorderColumn(columns, source.index, destination.index); - // Update column order on the server side + // Update column order on the server side reorderedItem.map((item: string, index: number) => { return reorderStatus(item, index); }); @@ -193,16 +195,17 @@ export const KanbanView = ({ kanbanBoardTasks, isLoading }: { kanbanBoardTasks: if (!enabled) return null; // ['open','close'] return ( - <> + <> - {columns.length > 0 && ( + {Array.isArray(columns) && columns.length > 0 && ( {(provided: DroppableProvided, snapshot: DroppableStateSnapshot) => ( -
        +
        { return ( -
        +
        {isColumnCollapse(column.name) ? ( ) : ( <> - []} - data={sortedTeamMembers} - noResultsMessage={{ - heading: 'No team members found', - content: 'Try adjusting your search or filter to find what you’re looking for.' - }} - /> + + []} + data={sortedTeamMembers} + noResultsMessage={{ + heading: 'No team members found', + content: 'Try adjusting your search or filter to find what you’re looking for.' + }} + /> ); diff --git a/apps/web/lib/features/team-members.tsx b/apps/web/lib/features/team-members.tsx index e23dea7c5..76d82e9b1 100644 --- a/apps/web/lib/features/team-members.tsx +++ b/apps/web/lib/features/team-members.tsx @@ -24,15 +24,15 @@ export function TeamMembers({ publicTeam = false, kanbanView: view = IssuesView. const fullWidth = useRecoilValue(fullWidthState); const { activeTeam } = useOrganizationTeams(); const { teamsFetching } = useOrganizationTeams(); - const members = activeTeam?.members || []; + const members = (activeTeam?.members || []).filter(member => member.employee !== null); const orderedMembers = [...members].sort((a, b) => (sortByWorkStatus(a, b) ? -1 : 1)); const blockViewMembers = activeFilter == 'all' ? orderedMembers : activeFilter == 'idle' - ? orderedMembers.filter((m: OT_Member) => m.timerStatus == undefined || m.timerStatus == 'idle') - : orderedMembers.filter((m) => m.timerStatus === activeFilter); + ? orderedMembers.filter((m: OT_Member) => m.timerStatus == undefined || m.timerStatus == 'idle') + : orderedMembers.filter((m) => m.timerStatus === activeFilter); const currentUser = members.find((m) => m.employee.userId === user?.id); const $members = members @@ -63,14 +63,17 @@ export function TeamMembers({ publicTeam = false, kanbanView: view = IssuesView. break; case view === IssuesView.CARDS: teamMembersView = ( - - - + <> + {/* */} + + + + ); break; case view === IssuesView.TABLE: diff --git a/apps/web/lib/features/team/user-team-block/task-info.tsx b/apps/web/lib/features/team/user-team-block/task-info.tsx index ddeb69ec2..b92fd4543 100644 --- a/apps/web/lib/features/team/user-team-block/task-info.tsx +++ b/apps/web/lib/features/team/user-team-block/task-info.tsx @@ -4,6 +4,7 @@ import { IClassName } from '@app/interfaces'; import { clsxm } from '@app/utils'; import { TaskAllStatusTypes, TaskInput, TaskNameInfoDisplay } from 'lib/features'; import { useRouter } from 'next/navigation'; +import { useTranslations } from 'next-intl'; type Props = IClassName & { edition: I_TMCardTaskEditHook; @@ -29,6 +30,7 @@ export function TaskInfo({ className, memberInfo, edition, publicTeam }: Props) } export function TaskBlockInfo({ className, memberInfo, edition, publicTeam }: Props) { + const t = useTranslations(); return (
        {/* task */} @@ -38,7 +40,7 @@ export function TaskBlockInfo({ className, memberInfo, edition, publicTeam }: Pr )} {!edition.task && (
        -

        There is no task assigned

        +

        {t('common.THERE_IS_NO_TASK_ASSIGNED')}

        )}
        diff --git a/apps/web/lib/features/team/user-team-block/user-info.tsx b/apps/web/lib/features/team/user-team-block/user-info.tsx index 4b7cfbc2f..b02e27b22 100644 --- a/apps/web/lib/features/team/user-team-block/user-info.tsx +++ b/apps/web/lib/features/team/user-team-block/user-info.tsx @@ -30,7 +30,7 @@ export function UserBoxInfo({ className, memberInfo, publicTeam = false }: Props return (
        -
        +
        -

        All members

        +

        {t('common.ALL_MEMBERS')}

        -

        Not working

        +

        {t('common.NOT_WORKING')}

        -

        Working

        +

        {t('common.WORKING')}

        -

        Paused

        +

        {t('common.PAUSED')}

        -

        Online

        +

        {t('common.ONLINE')}

        {({ close }) => { diff --git a/apps/web/lib/features/team/user-team-card/index.tsx b/apps/web/lib/features/team/user-team-card/index.tsx index 1b631a1dd..5dbcb5f38 100644 --- a/apps/web/lib/features/team/user-team-card/index.tsx +++ b/apps/web/lib/features/team/user-team-card/index.tsx @@ -7,24 +7,32 @@ import { useTaskStatistics, useOrganizationTeams, useAuthenticateUser, - useTeamMemberCard + useTeamMemberCard, + useUserProfilePage } from '@app/hooks'; import { IClassName, IOrganizationTeamList, OT_Member } from '@app/interfaces'; -import { timerSecondsState } from '@app/stores'; +import { timerSecondsState, userDetailAccordion as userAccordion } from '@app/stores'; import { clsxm } from '@app/utils'; -import { Card, InputField, Text, VerticalSeparator } from 'lib/components'; -import { TaskTimes, TodayWorkedTime } from 'lib/features'; +import { Card, Container, InputField, Text, VerticalSeparator } from 'lib/components'; +import { TaskTimes, TodayWorkedTime, UserProfileTask, useTaskFilter } from 'lib/features'; import { useTranslations } from 'next-intl'; -import { useRecoilValue, useSetRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'; import { TaskEstimateInfo } from './task-estimate'; import { TaskInfo } from './task-info'; import { UserInfo } from './user-info'; import { UserTeamCardMenu } from './user-team-card-menu'; -import React from 'react'; +import React, { useCallback, useState } from 'react'; import UserTeamActivity from './user-team-card-activity'; import { CollapseUpIcon, ExpandIcon } from '@components/ui/svgs/expand'; import { activityTypeState } from '@app/stores/activity-type'; import { SixSquareGridIcon } from 'assets/svg'; +import { ChevronDoubleDownIcon } from '@heroicons/react/20/solid'; +import { ScreenshootTab } from 'lib/features/activity/screenshoots'; +import { AppsTab } from 'lib/features/activity/apps'; +import { VisitedSitesTab } from 'lib/features/activity/visited-sites'; +import { FilterTab } from '@app/[locale]/profile/[memberId]/page'; +import { Loader } from 'lucide-react'; +import { fullWidthState } from '@app/stores/fullWidth'; type IUserTeamCard = { active?: boolean; @@ -51,10 +59,13 @@ export function UserTeamCard({ onDragOver = () => null }: IUserTeamCard) { const t = useTranslations(); + const profile = useUserProfilePage(); + const [userDetailAccordion, setUserDetailAccordion] = useRecoilState(userAccordion); + const hook = useTaskFilter(profile); const memberInfo = useTeamMemberCard(member); const taskEdition = useTMCardTaskEdit(memberInfo.memberTask); - const { collaborativeSelect, user_selected, onUserSelect } = useCollaborative(memberInfo.memberUser); + const fullWidth = useRecoilValue(fullWidthState); const seconds = useRecoilValue(timerSecondsState); const setActivityFilter = useSetRecoilState(activityTypeState); @@ -67,6 +78,7 @@ export function UserTeamCard({ const showActivityFilter = (type: 'DATE' | 'TICKET', member: OT_Member | null) => { setShowActivity((prev) => !prev); + setUserDetailAccordion(''); setActivityFilter((prev) => ({ ...prev, type, @@ -111,6 +123,21 @@ export function UserTeamCard({ )} ); + const [activityFilter, setActivity] = useState('Tasks'); + + const activityScreens = { + Tasks: , + Screenshots: , + Apps: , + 'Visited Sites': + }; + const changeActivityFilter = useCallback( + (filter: FilterTab) => { + setActivity(filter); + }, + [setActivity] + ); + const canSeeActivity = profile.userProfile?.id === user?.id || isManagerConnectedUser != -1; return ( + {userDetailAccordion == memberInfo.memberUser?.id && + memberInfo.memberUser.id == profile.userProfile?.id && !showActivity? ( +
        + {canSeeActivity && ( + +
        + {Object.keys(activityScreens).map((filter, i) => ( +
        + {i !== 0 && } +
        changeActivityFilter(filter as FilterTab)} + > + {filter} +
        +
        + ))} +
        +
        + )} + {activityScreens[activityFilter] ?? null} +
        + ) : userDetailAccordion == memberInfo.memberUser?.id ? ( +
        + +
        + ) : null} task && edition.setEstimateEditMode(true)} > - + {loadingRef.current ? ( +
        + +
        + ) : ( + + )} )}
        diff --git a/apps/web/lib/features/team/user-team-card/task-info.tsx b/apps/web/lib/features/team/user-team-card/task-info.tsx index 627409551..b96965fe4 100644 --- a/apps/web/lib/features/team/user-team-card/task-info.tsx +++ b/apps/web/lib/features/team/user-team-card/task-info.tsx @@ -12,28 +12,32 @@ type Props = IClassName & { export function TaskInfo({ className, memberInfo, edition, publicTeam }: Props) { return ( -
        - {/* task */} + <> + {!edition.task &&
        --
        } +
        - {edition.task && ( - - )} - {!edition.task &&
        --
        } -
        + {/* task */} +
        + {edition.task && ( + + )} +
        - {edition.task && } - {!edition.task &&
        --
        } -
        + {edition.task && } +
        + {!edition.task &&
        --
        } + ); } @@ -62,9 +66,10 @@ function TaskDetailAndEdition({ edition, publicTeam }: Props) { >
        @@ -78,6 +83,7 @@ function TaskDetailAndEdition({ edition, publicTeam }: Props) { keepOpen={true} showCombobox={false} autoFocus={true} + showEmoji={false} autoInputSelectText={true} onTaskClick={(e) => { console.log(e); diff --git a/apps/web/lib/features/team/user-team-card/task-skeleton.tsx b/apps/web/lib/features/team/user-team-card/task-skeleton.tsx index e914f6b31..d568d956e 100644 --- a/apps/web/lib/features/team/user-team-card/task-skeleton.tsx +++ b/apps/web/lib/features/team/user-team-card/task-skeleton.tsx @@ -1,8 +1,5 @@ -import { fullWidthState } from '@app/stores/fullWidth'; -import { clsxm } from '@app/utils'; import { Tooltip } from 'lib/components'; import { useTranslations } from 'next-intl'; -import { useRecoilValue } from 'recoil'; export function UserTeamCardSkeleton() { return ( @@ -44,50 +41,38 @@ export function InviteUserTeamSkeleton() { } export function UserTeamCardHeader() { - const fullWidth = useRecoilValue(fullWidthState); const t = useTranslations(); return ( -
        -
        -
        -

        {t('common.NAME')}

        -
        - -
        {t('common.TASK')}
        - - {/*
        */} - -
        -
        +
        +
        +
        + +
        +
        + {t('common.TEAM')} {t('common.MEMBER')} +
        +
        +
        +
        +
        + {t('common.TASK')} +
        +
        +
        +
        + + {t('task.taskTableHead.TASK_WORK.TITLE')}
        {t('common.TASK')} +
        +
        +
        +
        {t('common.ESTIMATE')}
        +
        +
        -
        - {t('task.taskTableHead.TASK_WORK.TITLE')} -
        - {t('common.TASK')} -
        + {t('task.taskTableHead.TOTAL_WORK.TITLE')}
        {t('common.TODAY')}
        -
        - {t('common.ESTIMATE')} -
        -
        - - {t('task.taskTableHead.TOTAL_WORK.TITLE')} -
        - {t('common.TODAY')} -
        -
        ); diff --git a/apps/web/lib/features/team/user-team-card/user-info.tsx b/apps/web/lib/features/team/user-team-card/user-info.tsx index 8ffa15686..3860a3e4b 100644 --- a/apps/web/lib/features/team/user-team-card/user-info.tsx +++ b/apps/web/lib/features/team/user-team-card/user-info.tsx @@ -32,7 +32,7 @@ export function UserInfo({ className, memberInfo, publicTeam = false }: Props) { return (
        - {publicTeam ? {fullname.slice(0, 1)} : fullname} - +
        + {publicTeam ? {fullname.slice(0, 1)} : fullname} +
        {(member?.role?.name === 'MANAGER' || member?.role?.name === 'SUPER_ADMIN' || member?.role?.name === 'ADMIN') && ( diff --git a/apps/web/lib/features/team/user-team-card/user-team-card-menu.tsx b/apps/web/lib/features/team/user-team-card/user-team-card-menu.tsx index 358c4ac20..a6dc4c52d 100644 --- a/apps/web/lib/features/team/user-team-card/user-team-card-menu.tsx +++ b/apps/web/lib/features/team/user-team-card/user-team-card-menu.tsx @@ -103,7 +103,7 @@ function DropdownMenu({ edition, memberInfo }: Props) { leave="transition duration-75 ease-out" leaveFrom="transform scale-100 opacity-100" leaveTo="transform scale-95 opacity-0" - className="absolute z-10 -right-5 min-w-[13.125rem]" + className="absolute z-30 -right-5 min-w-[13.125rem]" > {({ close }) => { diff --git a/apps/web/lib/features/team/user-team-table/user-team-table-header.tsx b/apps/web/lib/features/team/user-team-table/user-team-table-header.tsx index 981864526..f84b5e44f 100644 --- a/apps/web/lib/features/team/user-team-table/user-team-table-header.tsx +++ b/apps/web/lib/features/team/user-team-table/user-team-table-header.tsx @@ -1,20 +1,25 @@ -import { fullWidthState } from '@app/stores/fullWidth'; -import { clsxm } from '@app/utils'; +import { Tooltip } from 'lib/components'; +import { useTranslations } from 'next-intl'; import React from 'react'; -import { useRecoilValue } from 'recoil'; function UserTeamTableHeader() { - const fullWidth = useRecoilValue(fullWidthState); + const t = useTranslations(); return ( -
        -

        Name

        -

        Task

        -

        - Worked on Task -

        -

        Estimate

        -

        Action

        -
        + + + + {t('common.TEAM')} {t('common.MEMBER')} + + {t('common.TASK')} + + + {t('task.taskTableHead.TASK_WORK.TITLE')}
        {t('common.TASK')} +
        + + {t('common.ESTIMATE')} + {t('common.ACTION')} + + ); } diff --git a/apps/web/lib/features/timer/timer-status.tsx b/apps/web/lib/features/timer/timer-status.tsx index 258af4023..95be0e0b0 100644 --- a/apps/web/lib/features/timer/timer-status.tsx +++ b/apps/web/lib/features/timer/timer-status.tsx @@ -53,20 +53,33 @@ export function getTimerStatusValue( member: OT_Member | undefined, publicTeam?: boolean ): ITimerStatusEnum { - return !member?.employee?.isActive && !publicTeam - ? 'suspended' - : member?.timerStatus === 'pause' - ? 'pause' - : !timerStatus?.running && - timerStatus?.lastLog && - timerStatus?.lastLog?.startedAt && - timerStatus?.lastLog?.employeeId === member?.employeeId && - moment().diff(moment(timerStatus?.lastLog?.startedAt), 'hours') < 24 && - timerStatus?.lastLog?.source !== 'TEAMS' - ? 'pause' - : member?.employee?.isOnline && member?.timerStatus === 'running' - ? 'online' - : !member?.totalTodayTasks?.length - ? 'idle' - : member?.timerStatus || 'idle'; + const isSuspended = () => !member?.employee?.isActive && !publicTeam; + const isPaused = () => member?.timerStatus === 'pause'; + const shouldPauseDueToTimerStatus = () => { + return ( + !timerStatus?.running && + timerStatus?.lastLog?.startedAt && + timerStatus?.lastLog?.employeeId === member?.employeeId && + moment().diff(moment(timerStatus?.lastLog?.startedAt), 'hours') < 24 && + timerStatus?.lastLog?.source !== 'TEAMS' + ); + }; + const isOnline = () => member?.employee?.isOnline && member?.employee?.isTrackingTime; + const isIdle = () => !member?.totalTodayTasks?.length; + + let status: ITimerStatusEnum; + + if (isOnline()) { + status = 'online'; + } else if (isIdle()) { + status = 'idle'; + } else if (isPaused() || shouldPauseDueToTimerStatus()) { + status = 'pause'; + } else if (isSuspended()) { + status = 'suspended'; + } else { + status = member?.timerStatus || 'idle'; + } + + return status; } diff --git a/apps/web/lib/features/unverified-email.tsx b/apps/web/lib/features/unverified-email.tsx index 104c6a73c..dab1cf4e5 100644 --- a/apps/web/lib/features/unverified-email.tsx +++ b/apps/web/lib/features/unverified-email.tsx @@ -45,7 +45,7 @@ export function UnverifiedEmail() { 'border dark:border-[#28292F] dark:shadow-lg dark:bg-[#1B1D22]' )} > - + {t('pages.home.SENT_EMAIL_VERIFICATION_YOU_NEED_TO')} {t('common.VERIFY')} diff --git a/apps/web/lib/features/user-nav-menu.tsx b/apps/web/lib/features/user-nav-menu.tsx index 15212e46c..ec04d693d 100644 --- a/apps/web/lib/features/user-nav-menu.tsx +++ b/apps/web/lib/features/user-nav-menu.tsx @@ -26,6 +26,9 @@ import { KeyboardShortcuts } from 'lib/components/keyboard-shortcuts'; import { usePathname } from 'next/navigation'; import { useTranslations } from 'next-intl'; import { AllSidesIcon } from '@radix-ui/react-icons'; +import { Globe2Icon } from 'lucide-react'; +import { LanguageDropDownWithFlags } from 'lib/settings/language-dropdown-flags'; +import { signOutFunction } from '@app/[locale]/auth/social-logins'; export function UserNavAvatar() { const { user } = useAuthenticateUser(); @@ -189,7 +192,6 @@ function UserNavMenu() { )}
        - - -
          {/* Task menu */}
        • {t('common.MY_TASKS')} @@ -250,12 +250,18 @@ function UserNavMenu() {
        • {/* Darkmode menu */} -
        • +
        • {t('common.DARK_MODE')}
        • +
        • +
          + {t('common.LANGUAGE')} +
          + +
        • {/* 3D Mode menu */} {/* TODO @@ -291,7 +297,10 @@ function UserNavMenu() {
        • diff --git a/apps/web/lib/features/user-profile-plans.tsx b/apps/web/lib/features/user-profile-plans.tsx new file mode 100644 index 000000000..84af5bb96 --- /dev/null +++ b/apps/web/lib/features/user-profile-plans.tsx @@ -0,0 +1,321 @@ +'use client'; + +import { useState } from 'react'; +import { useRecoilValue } from 'recoil'; +import { useCanSeeActivityScreen, useDailyPlan, useUserProfilePage } from '@app/hooks'; +import { TaskCard } from './task/task-card'; +import { IDailyPlan } from '@app/interfaces'; +import { Container, NoData, ProgressBar, VerticalSeparator } from 'lib/components'; +import { clsxm } from '@app/utils'; +import { fullWidthState } from '@app/stores/fullWidth'; +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@components/ui/accordion'; +import { formatDayPlanDate, formatIntegerToHour } from '@app/helpers'; +import { EditPenBoxIcon, CheckCircleTickIcon as TickSaveIcon } from 'assets/svg'; +import { ReaderIcon, ReloadIcon } from '@radix-ui/react-icons'; +import { Outstanding, PastTasks } from './task/daily-plan'; +import { FutureTasks } from './task/daily-plan/future-tasks'; +import { Button } from '@components/ui/button'; + +type FilterTabs = 'Today Tasks' | 'Future Tasks' | 'Past Tasks' | 'All Tasks' | 'Outstanding'; + +export function UserProfilePlans() { + const profile = useUserProfilePage(); + const { profileDailyPlans } = useDailyPlan(); + const fullWidth = useRecoilValue(fullWidthState); + + const [currentTab, setCurrentTab] = useState('Today Tasks'); + + const tabsScreens = { + 'Today Tasks': , + 'Future Tasks': , + 'Past Tasks': , + 'All Tasks': , + Outstanding: + }; + + return ( +
          + + <> + {profileDailyPlans?.items?.length > 0 ? ( +
          +
          + {Object.keys(tabsScreens).map((filter, i) => ( +
          + {i !== 0 && } +
          setCurrentTab(filter as FilterTabs)} + > + {filter} +
          +
          + ))} +
          + {tabsScreens[currentTab]} +
          + ) : ( + + )} + +
          +
          + ); +} + +function AllPlans({ + plans, + profile, + currentTab = 'All Tasks' +}: { + plans: IDailyPlan[]; + profile: any; + currentTab?: FilterTabs; +}) { + // Filter plans + let filteredPlans: IDailyPlan[] = []; + + filteredPlans = [...plans].sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); + + if (currentTab === 'Today Tasks') + filteredPlans = [...plans].filter((plan) => + plan.date?.toString()?.startsWith(new Date()?.toISOString().split('T')[0]) + ); + + const { deleteDailyPlan, deleteDailyPlanLoading } = useDailyPlan(); + + const canSeeActivity = useCanSeeActivityScreen(); + + return ( +
          + {filteredPlans?.length > 0 ? ( + new Date(plan.date).toISOString().split('T')[0])[0]] + } + > + {filteredPlans?.map((plan) => ( + + +
          + {formatDayPlanDate(plan.date.toString())} ({plan.tasks?.length}) +
          +
          + + {/* Plan header */} + + + {/* Plan tasks list */} +
            + {plan.tasks?.map((task) => ( + + ))} +
          + + {/* Delete Plan */} + {currentTab === 'Today Tasks' && ( + <> + {canSeeActivity ? ( +
          + +
          + ) : ( + <> + )} + + )} +
          +
          + ))} +
          + ) : ( + + )} +
          + ); +} + +export function PlanHeader({ plan, planMode }: { plan: IDailyPlan; planMode: FilterTabs }) { + const [editTime, setEditTime] = useState(false); + const [time, setTime] = useState(0); + + const { updateDailyPlan, updateDailyPlanLoading } = useDailyPlan(); + + // Get all tasks's estimations time + const times = + plan.tasks?.map((task) => task.estimate).filter((time): time is number => typeof time === 'number') ?? []; + let estimatedTime = 0; + if (times.length > 0) estimatedTime = times.reduce((acc, cur) => acc + cur, 0) ?? 0; + + // Get all tasks's worked time + const workedTimes = + plan.tasks?.map((task) => task.totalWorkedTime).filter((time): time is number => typeof time === 'number') ?? + []; + let totalWorkTime = 0; + if (workedTimes.length > 0) totalWorkTime = workedTimes.reduce((acc, cur) => acc + cur, 0) ?? 0; + + // Get completed tasks from a plan + const completedTasks = plan.tasks?.filter((task) => task.status === 'completed' && task.status).length ?? 0; + + // Get ready tasks from a plan + const readyTasks = plan.tasks?.filter((task) => task.status === 'ready').length ?? 0; + + // Total tasks for plan + const totalTasks = plan.tasks?.length ?? 0; + + // Completion percent + const completionPercent = ((completedTasks * 100) / totalTasks).toFixed(2); + + return ( +
          + {/* Planned Time */} + +
          + {!editTime && !updateDailyPlanLoading ? ( + <> +
          + Planned time: + {formatIntegerToHour(plan.workTimePlanned)} +
          + {planMode !== 'Past Tasks' && ( + setEditTime(true)} + /> + )} + + ) : ( +
          + setTime(parseFloat(e.target.value))} + /> + + {updateDailyPlanLoading ? ( + + ) : ( + { + updateDailyPlan({ workTimePlanned: time }, plan.id ?? ''); + setEditTime(false); + }} + /> + )} + +
          + )} +
          + + {/* Total estimated time based on tasks */} + + +
          + Estimated time: + {formatIntegerToHour(estimatedTime / 3600)} +
          + + {planMode !== 'Future Tasks' && } + + {/* Total worked time for the plan */} + {planMode !== 'Future Tasks' && ( +
          + Total time worked: + {formatIntegerToHour(totalWorkTime / 3600)} +
          + )} + + {planMode !== 'Future Tasks' && } + + {/* Completed tasks */} + {planMode !== 'Future Tasks' && ( +
          +
          + Completed tasks: + {completedTasks} +
          +
          + Ready: + {readyTasks} +
          +
          + Left: + {totalTasks - completedTasks - readyTasks} +
          +
          + )} + + + + {/* Completion progress */} + {planMode !== 'Future Tasks' && ( +
          +
          + Completion: + {completionPercent}% +
          + +
          + )} + + {/* Future tasks total plan */} + {planMode === 'Future Tasks' && ( +
          +
          + Planned tasks: + {totalTasks} +
          +
          + )} +
          + ); +} + +export function EmptyPlans({ planMode }: { planMode?: FilterTabs }) { + return ( +
          + } + /> +
          + ); +} diff --git a/apps/web/lib/features/user-profile-tasks.tsx b/apps/web/lib/features/user-profile-tasks.tsx index 1e46c4d38..027b545fa 100644 --- a/apps/web/lib/features/user-profile-tasks.tsx +++ b/apps/web/lib/features/user-profile-tasks.tsx @@ -1,11 +1,9 @@ import { I_UserProfilePage, useLiveTimerStatus } from '@app/hooks'; import { Divider, Text } from 'lib/components'; +import { UserProfilePlans } from 'lib/features'; import { TaskCard } from './task/task-card'; import { I_TaskFilter } from './task/task-filters'; import { useTranslations } from 'next-intl'; -import { ObserverComponent } from '@components/shared/Observer'; -import { useInfinityScrolling } from '@app/hooks/useInfinityFetch'; - type Props = { tabFiltered: I_TaskFilter; profile: I_UserProfilePage; @@ -30,7 +28,6 @@ export function UserProfileTask({ profile, tabFiltered }: Props) { const otherTasks = tasks.filter((t) => profile.member?.running == true ? t.id !== profile.activeUserTeamTask?.id : t ); - const { nextOffset, data } = useInfinityScrolling(otherTasks); // const data = otherTasks.length < 10 ? otherTasks : data; // const { total, onPageChange, itemsPerPage, itemOffset, endOffset, setItemsPerPage, currentItems } = @@ -39,7 +36,7 @@ export function UserProfileTask({ profile, tabFiltered }: Props) { return (
          {tabFiltered.tab === 'worked' && - (profile.member?.timerStatus === 'running' || (profile.isAuthUser && timerStatus?.running)) && + (profile.member?.employee?.isTrackingTime || (profile.isAuthUser && timerStatus?.running)) && otherTasks.length > 0 && ( /* Displaying the current time. */
          @@ -47,7 +44,6 @@ export function UserProfileTask({ profile, tabFiltered }: Props) {
          {t('common.TOTAL_TIME')}: - {profile.isAuthUser ? ( {time.h}h : {time.m}m @@ -60,7 +56,7 @@ export function UserProfileTask({ profile, tabFiltered }: Props) { )} {tabFiltered.tab === 'worked' && - (profile.member?.timerStatus === 'running' || (profile.isAuthUser && timerStatus?.running)) && ( + (profile.member?.employee?.isTrackingTime || (profile.isAuthUser && timerStatus?.running)) && ( )} + {tabFiltered.tab === 'dailyplan' && } + {tabFiltered.tab === 'worked' && otherTasks.length > 0 && (
          @@ -85,28 +83,29 @@ export function UserProfileTask({ profile, tabFiltered }: Props) {
          )} -
            - {data.map((task, index) => { - return ( -
          • - - -
          • - ); - })} -
          + {tabFiltered.tab !== 'dailyplan' && ( +
            + {otherTasks.map((task) => { + return ( +
          • + +
          • + ); + })} +
          + )}
          ); } diff --git a/apps/web/lib/i18n/en.ts b/apps/web/lib/i18n/en.ts index 72764e8da..cb39f37fb 100644 --- a/apps/web/lib/i18n/en.ts +++ b/apps/web/lib/i18n/en.ts @@ -163,6 +163,8 @@ export const en = { auth: { SEND_CODE: 'send code', + RESEND_CODE: 'Resend Code', + RESEND_CODE_IN: 'Resend Code in', JOIN: 'Join', UNRECEIVED_CODE: "Didn't receive code ?", JOIN_TEAM: 'Join Team', @@ -300,6 +302,7 @@ export const en = { VERSIONS: 'Versions', LIST_OF_VERSONS: 'List of Versions', ISSUETYPE: 'Issue Types', + DEFAULT_ISSUE_TYPE: 'Default Issue Type', LIST_OF_ISSUES: 'List of Issues', RELATED_ISSUE_TYPE: 'Related Issue Types', LIST_OF_RELATED_TYPE: 'List of Related Types', diff --git a/apps/web/lib/layout/auth-layout.tsx b/apps/web/lib/layout/auth-layout.tsx index 827c4709b..15a6dc1aa 100644 --- a/apps/web/lib/layout/auth-layout.tsx +++ b/apps/web/lib/layout/auth-layout.tsx @@ -1,5 +1,5 @@ import { clsxm } from '@app/utils'; -import { Meta, Text } from 'lib/components'; +import { Text } from 'lib/components'; import { EverTeamsLogo } from 'lib/components/svgs'; import Image from 'next/legacy/image'; import { PropsWithChildren, ReactNode } from 'react'; @@ -14,9 +14,9 @@ type Props = { export function AuthLayout({ children, title, description, isAuthPage = true }: Props) { const t = useTranslations(); + return ( <> -
          {/* Bg Cover side */}
          - + {t('pages.auth.COVER_DESCRIPTION')} - +
          - {/* Content side */}
          {isAuthPage && ( -
          +
          {title && ( - + {title} )} - {description && ( - - {description} - +

          {description}

          )}
          )} diff --git a/apps/web/lib/layout/footer.tsx b/apps/web/lib/layout/footer.tsx index ad122eabc..4f9a9f7c7 100644 --- a/apps/web/lib/layout/footer.tsx +++ b/apps/web/lib/layout/footer.tsx @@ -1,11 +1,25 @@ +import { CHATWOOT_API_KEY } from '@app/constants'; import { IClassName } from '@app/interfaces'; +import { fullWidthState } from '@app/stores/fullWidth'; import { clsxm } from '@app/utils'; import { Text, ThemeToggler } from 'lib/components'; +import { LanguageDropDownWithFlags } from 'lib/settings/language-dropdown-flags'; import { useTranslations } from 'next-intl'; +import { useEffect, useState } from 'react'; +import { useRecoilValue } from 'recoil'; export function Footer({ className }: IClassName) { const t = useTranslations(); + const [showChatwoot, setShowChatwoot] = useState(false); + const fullWidth = useRecoilValue(fullWidthState); + useEffect(() => { + const websiteToken = CHATWOOT_API_KEY.value; + if (websiteToken) { + setShowChatwoot(true); + } + }, []); + return (

          @@ -14,8 +28,8 @@ export function Footer({ className }: IClassName) { {t('layout.footer.COPY_RIGHT4')}{' '} {t('layout.footer.RIGHTS_RESERVED')}

          - -
          +
          +
          diff --git a/apps/web/lib/layout/main-layout.tsx b/apps/web/lib/layout/main-layout.tsx index 2d808af8f..90ac1696e 100644 --- a/apps/web/lib/layout/main-layout.tsx +++ b/apps/web/lib/layout/main-layout.tsx @@ -36,6 +36,20 @@ export function MainLayout({ :root { --tw-color-dark--theme: #191a20; } + .mx-8-container { + ${fullWidth + ? ` + margin-left: 2rem; + margin-right: 2rem; + ` : ` --tblr-gutter-x: 1.5rem; + --tblr-gutter-y: 0; + width: 100%; + padding-right: calc(var(--tblr-gutter-x) * 0.5); + padding-left: calc(var(--tblr-gutter-x) * 0.5); + margin-right: auto; + margin-left: auto;` + } + } `} @@ -54,13 +68,12 @@ export function MainLayout({ )} >
          {children}
          - -
          +
          diff --git a/apps/web/lib/layout/next-auth-provider.tsx b/apps/web/lib/layout/next-auth-provider.tsx new file mode 100644 index 000000000..35e16d839 --- /dev/null +++ b/apps/web/lib/layout/next-auth-provider.tsx @@ -0,0 +1,11 @@ +'use client'; + +import { SessionProvider } from 'next-auth/react'; + +type Props = { + children: React.ReactNode; +}; + +export default function NextAuthSessionProvider({ children }: Props) { + return {children}; +} diff --git a/apps/web/lib/settings/default-issue-type-form.tsx b/apps/web/lib/settings/default-issue-type-form.tsx new file mode 100644 index 000000000..b1b185399 --- /dev/null +++ b/apps/web/lib/settings/default-issue-type-form.tsx @@ -0,0 +1,161 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ +import { SpinnerLoader, Text, Tooltip } from 'lib/components'; + +import { useTranslations } from 'next-intl'; +import { useIssueType } from '@app/hooks'; +import { IIssueTypesItemList } from '@app/interfaces'; +import { getTextColor } from '@app/helpers'; +import { StatusesListCard } from './list-card'; +import { EditPenUnderlineIcon } from 'assets/svg'; +import { clsxm } from '@app/utils'; +import Image from 'next/image'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger +} from '../../components/ui/dropdown-menu'; + +export const DefaultIssueTypeForm = () => { + const t = useTranslations(); + const { issueTypes, editIssueType, editIssueTypeLoading } = useIssueType(); + const defaultIssueType: IIssueTypesItemList | undefined = issueTypes.find((issue) => issue.isDefault); + const textColor = defaultIssueType?.color ? getTextColor(defaultIssueType.color) : '#cdd1d8'; + + return ( + <> +
          +
          +
          + + {t('pages.settingsTeam.DEFAULT_ISSUE_TYPE')} + + +
          +
          + {defaultIssueType ? ( +
          +
          + {defaultIssueType.icon && ( + {defaultIssueType.name} + )} + = CHARACTER_LIMIT_TO_SHOW} + placement="auto" + className={clsxm( + 'overflow-hidden text-ellipsis whitespace-nowrap w-full' + )} + > + + {defaultIssueType.name} + + +
          +
          + {editIssueTypeLoading ? ( + + ) : ( + + + + + + + {issueTypes.map((issue, index) => { + return ( + !issue.isDefault && ( + { + await editIssueType(issue.id, { + ...issue, + isDefault: true + }); + issueTypes.forEach(async (is) => { + issue.id != is.id && + (await editIssueType(is.id, { + ...is, + isDefault: false + })); + }); + }} + className={clsxm( + 'flex gap-2 rounded-lg cursor-pointer p-2 text-black/70 hover:text-black/70' + )} + style={{ background: issue.color }} + key={index} + > + {issue.name} +
          {issue.name}
          +
          + ) + ); + })} +
          +
          +
          + )} +
          +
          + ) : ( + { + // await editIssueType(defaultIssueType.id); + }} + onDelete={() => { + console.log('click delete'); + }} + /> + )} +
          +
          +
          +
          +
          + + ); +}; diff --git a/apps/web/lib/settings/integration-setting.tsx b/apps/web/lib/settings/integration-setting.tsx index 647bdbc83..926e55207 100644 --- a/apps/web/lib/settings/integration-setting.tsx +++ b/apps/web/lib/settings/integration-setting.tsx @@ -307,7 +307,7 @@ export const IntegrationSetting = () => { {selectedRepo && ( )}
          diff --git a/apps/web/lib/settings/issues-settings.tsx b/apps/web/lib/settings/issues-settings.tsx index 0715ac8e7..99baef11c 100644 --- a/apps/web/lib/settings/issues-settings.tsx +++ b/apps/web/lib/settings/issues-settings.tsx @@ -8,8 +8,13 @@ import { TaskLabelForm } from './task-labels-form'; import { TaskPrioritiesForm } from './task-priorities-form'; import { TaskSizesForm } from './task-sizes-form'; import { TaskStatusesForm } from './task-statuses-form'; +import { DefaultIssueTypeForm } from './default-issue-type-form'; +import { useSetRecoilState } from 'recoil'; +import { activeSettingTeamTab } from '@app/stores/setting'; +import { InteractionObserverVisible } from '@components/pages/setting/interaction-observer'; export const IssuesSettings = () => { + const setActiveTeam = useSetRecoilState(activeSettingTeamTab); const t = useTranslations(); return (
          @@ -162,19 +167,30 @@ export const IssuesSettings = () => { {/*
          */} - -
          - -
          -
          - -
          -
          - -
          -
          - +
          +
          + +
          + +
          +
          + +
          + +
          +
          + +
          + +
          +
          + +
          + +
          +
          + {/* ); }; diff --git a/apps/web/lib/settings/list-card.tsx b/apps/web/lib/settings/list-card.tsx index 3811cba1d..f07ef63b0 100644 --- a/apps/web/lib/settings/list-card.tsx +++ b/apps/web/lib/settings/list-card.tsx @@ -5,6 +5,7 @@ import { CHARACTER_LIMIT_TO_SHOW } from '@app/constants'; import { IClassName } from '@app/interfaces'; import { clsxm } from '@app/utils'; import { getTextColor } from '@app/helpers'; +import { useTranslations } from 'next-intl'; export const StatusesListCard = ({ statusIcon, @@ -12,6 +13,7 @@ export const StatusesListCard = ({ bgColor, onEdit, onDelete, + showDeleteButton = true, isStatus }: IClassName<{ statusIcon: string; @@ -19,9 +21,11 @@ export const StatusesListCard = ({ bgColor: string; onEdit: any; onDelete: any; + showDeleteButton?: boolean; isStatus?: boolean; }>) => { const textColor = getTextColor(bgColor); + const t = useTranslations(); return (
          @@ -53,9 +57,10 @@ export const StatusesListCard = ({ > @@ -64,12 +69,17 @@ export const StatusesListCard = ({
          - - + + + + + {showDeleteButton && ( + + )}
          ); diff --git a/apps/web/lib/settings/member-setting.tsx b/apps/web/lib/settings/member-setting.tsx index 8f8fe8427..247edc5c8 100644 --- a/apps/web/lib/settings/member-setting.tsx +++ b/apps/web/lib/settings/member-setting.tsx @@ -46,7 +46,7 @@ export const MemberSetting = () => {
          {members.length > 0 ? ( -
          +
          ) : ( diff --git a/apps/web/lib/settings/personal-setting-form.tsx b/apps/web/lib/settings/personal-setting-form.tsx index 5c9deb968..3009aa1fb 100644 --- a/apps/web/lib/settings/personal-setting-form.tsx +++ b/apps/web/lib/settings/personal-setting-form.tsx @@ -308,7 +308,7 @@ export const PersonalSettingForm = () => {
          - + {theme === 'light' ? 'Light' : 'Dark'} Mode
          @@ -320,7 +320,7 @@ export const PersonalSettingForm = () => { {t('common.LANGUAGE')} -
          +
          { @@ -336,7 +336,7 @@ export const PersonalSettingForm = () => { {t('common.TIME_ZONE')} -
          +
          { diff --git a/apps/web/lib/settings/table-action-popover.tsx b/apps/web/lib/settings/table-action-popover.tsx index 037af0b19..12fcd3118 100644 --- a/apps/web/lib/settings/table-action-popover.tsx +++ b/apps/web/lib/settings/table-action-popover.tsx @@ -33,7 +33,7 @@ export const TableActionPopover = ({ member, handleEdit }: Props) => { // setIsOpen(!isOpen); // }; return ( - + {() => ( <> { leaveFrom="opacity-100 translate-y-0" leaveTo="opacity-0 translate-y-1" > - + {/* TODO Dynamic */} {/* Edit */}
          { - + if (createNew) { createTaskStatus({ name: values.name, + value: values.name.split(' ').join('-').toLowerCase(), color: values.color, // description: '', organizationId: user?.employee?.organizationId, diff --git a/apps/web/lib/settings/team-setting-form.tsx b/apps/web/lib/settings/team-setting-form.tsx index 6a12e600e..f29d908c5 100644 --- a/apps/web/lib/settings/team-setting-form.tsx +++ b/apps/web/lib/settings/team-setting-form.tsx @@ -3,7 +3,7 @@ import { RoleNameEnum } from '@app/interfaces'; import { userState } from '@app/stores'; import { Button, ColorPicker, InputField, Text, Tooltip } from 'lib/components'; import { EmojiPicker } from 'lib/components/emoji-picker'; -import TimeTrackingToggle from 'lib/components/switch'; +import TimeTrackingToggle, { ShareProfileViewsToggle } from 'lib/components/switch'; import debounce from 'lodash/debounce'; import isEqual from 'lodash/isEqual'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; @@ -93,6 +93,7 @@ export const TeamSettingForm = () => { public: values.teamType === 'PUBLIC' ? true : false, color: values.color, emoji: values.emoji, + shareProfileView: activeTeam.shareProfileView, teamSize: values.teamSize, memberIds: activeTeam.members .map((t) => t.employee.id) @@ -211,11 +212,11 @@ export const TeamSettingForm = () => {
          {/* Team Color */} -
          +
          {t('pages.settingsTeam.TEAM_COLOR')} -
          +
          { @@ -359,14 +360,24 @@ export const TeamSettingForm = () => { {/* Time Tracking */} {isTeamManager ? ( -
          - - {t('pages.settingsTeam.TIME_TRACKING')} - -
          - + <> +
          + + {t('pages.settingsTeam.TIME_TRACKING')} + +
          + +
          -
          +
          + + Share members profile views + +
          + +
          +
          + ) : ( <> )} diff --git a/apps/web/lib/settings/timezone-dropdown.tsx b/apps/web/lib/settings/timezone-dropdown.tsx index 389f13fc7..afbe0df7f 100644 --- a/apps/web/lib/settings/timezone-dropdown.tsx +++ b/apps/web/lib/settings/timezone-dropdown.tsx @@ -76,8 +76,9 @@ export const TimezoneDropDown = ({ buttonClassName={clsxm( 'py-0 font-medium h-[54px]', items.length === 0 && ['py-2'], - 'bg-light--theme-light dark:bg-dark--theme-light dark:text-white font-normal' + 'bg-light--theme-light dark:bg-dark--theme-light dark:text-white font-normal ' )} + cardClassName='h-40' value={timezoneItem as any} onChange={(e: any) => onChange(e)} items={items as any} diff --git a/apps/web/lib/settings/version-form.tsx b/apps/web/lib/settings/version-form.tsx index f97e82671..feaf8b2f0 100644 --- a/apps/web/lib/settings/version-form.tsx +++ b/apps/web/lib/settings/version-form.tsx @@ -1,7 +1,7 @@ import { Button, InputField, Text } from 'lib/components'; import { StatusesListCard } from './list-card'; -import { useTaskVersion } from '@app/hooks'; +import { useCallbackRef, useTaskVersion } from '@app/hooks'; import { ITaskVersionCreate, ITaskVersionItemList } from '@app/interfaces'; import { userState } from '@app/stores'; import { Spinner } from '@components/ui/loaders/spinner'; @@ -27,6 +27,7 @@ export const VersionForm = ({ formOnly = false, onCreated, onVersionCreated }: S const { register, setValue, handleSubmit, reset, getValues } = useForm(); const [createNew, setCreateNew] = useState(formOnly); const [edit, setEdit] = useState(null); + const $onVersionCreated = useCallbackRef(onVersionCreated); const { loading, @@ -36,7 +37,7 @@ export const VersionForm = ({ formOnly = false, onCreated, onVersionCreated }: S editTaskVersion, createTaskVersionLoading, editTaskVersionLoading - } = useTaskVersion(onVersionCreated); + } = useTaskVersion(); const { refetch } = useRefetchData(); useEffect(() => { @@ -64,10 +65,11 @@ export const VersionForm = ({ formOnly = false, onCreated, onVersionCreated }: S tenantId: user?.tenantId // icon: values.icon, // projectId: '', - })?.then(() => { + })?.then(({ data }) => { !formOnly && setCreateNew(false); onCreated && onCreated(); + $onVersionCreated.current && $onVersionCreated.current(data); refetch(); reset(); }); diff --git a/apps/web/messages/ar.json b/apps/web/messages/ar.json index 20f0937f3..160c18824 100644 --- a/apps/web/messages/ar.json +++ b/apps/web/messages/ar.json @@ -4,6 +4,8 @@ "ACCEPT": "قبول", "ACCEPTED": "مقبول", "REJECT": "رفض", + "MEMBER": "عضو", + "ACTION": "إجراء", "REJECTED": "مرفوض", "VERIFY": "تحقق", "CARDS": "بطاقات", @@ -179,7 +181,30 @@ "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "قم بمزامنة المهام تلقائيًا في تطبيقك لتحديثات سلسة وفعّالة.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "تزامن المهام بشكل انتقائي عن طريق ربطها بتصنيف معين.", "GITHUB_AUTO_SYNC_LABEL": "اختر تسمية التزامن التلقائي", - "GITHUB_INTEGRATION_SUBTITLE_TEXT": "قم بتفعيل تكامل GitHub لمزامنة المشروع والمستودع" + "GITHUB_INTEGRATION_SUBTITLE_TEXT": "قم بتفعيل تكامل GitHub لمزامنة المشروع والمستودع", + "THERE_IS_NO_TASK_ASSIGNED": "لا توجد مهام معينة", + "NO_USERS_ONLINE": "لا يوجد مستخدمين على الانترنت", + "NOT_FOUND": "الصفحة غير موجودة", + "PAGE_NOT_FOUND": "غير معثور عليه", + "NO_USERS_WORKING": "لا يوجد مستخدمين يعملون حاليا", + "NO_USERS_PAUSED_WORK": "لم يتم إيقاف أي مستخدم مؤقتًا عن العمل في الوقت الحالي", + "NO_USERS_IDLE": "لا يوجد مستخدمين خاملين في الوقت الحالي", + "SELECT_TEAM_MEMBER": "اختيار عضو الفريق", + "ALL_MEMBERS": "جميع الأعضاء", + "NOT_WORKING": "غير عامل", + "WORKING": "يعمل", + "PAUSED": "متوقف", + "ONLINE": "متصل" + }, + "hotkeys": { + "HELP": "مساعدة", + "TO_OPEN_SHORTCUT_LIST": "لفتح قائمة الاختصارات", + "TIMER": "المؤقت", + "START_TIMER": "بدء المؤقت", + "STOP_TIMER": "إيقاف المؤقت", + "TASK": "المهمة", + "ASSIGN_TASK": "تعيين المهمة", + "CREATE_TASK": "إنشاء مهمة" }, "alerts": { "REAL_TIME_ON_WORKING": "نحن نعمل على المزامنة في الوقت الحقيقي في الوقت الحالي، يرجى التحقق من هذه الميزة لاحقًا", @@ -204,8 +229,11 @@ "KANBAN_BOARD": "لوحة كانبان" }, "profile": { - "BREADCRUMB": "[\"مهام العضو\"]" - }, + "BREADCRUMB": "[\"مهام العضو\"]", + "MEMBER_NOT_FOUND_MSG_1": "العضو الذي تبحث عنه غير موجود في الفريق، يرجى المحاولة مرة أخرى ببحث مختلف.", + "MEMBER_NOT_FOUND_MSG_2": "إذا كنت تبحث عن عضو في فريق مختلف، يرجى تحديد الفريق من القائمة المنسدلة أعلاه.", + "GO_TO_HOME": "الذهاب إلى الصفحة الرئيسية" + }, "taskDetails": { "BREADCRUMB": "[\"تفاصيل المهمة\"]", "DESCRIPTION": "الوصف", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "إرسال الرمز", + "RESEND_CODE": "إعادة إرسال الرمز", + "RESEND_CODE_IN": "إعادة إرسال الرمز في", "JOIN": "انضمام", "UNRECEIVED_CODE": "لم تتلقى الرمز؟", "JOIN_TEAM": "انضمام للفريق", @@ -375,6 +405,7 @@ "VERSIONS": "الإصدارات", "LIST_OF_VERSONS": "قائمة الإصدارات", "ISSUETYPE": "أنواع القضايا", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "قائمة القضايا", "RELATED_ISSUE_TYPE": "أنواع القضايا ذات الصلة", "LIST_OF_RELATED_TYPE": "قائمة الأنواع ذات الصلة", diff --git a/apps/web/messages/bg.json b/apps/web/messages/bg.json index 9f57f782d..099e740ae 100644 --- a/apps/web/messages/bg.json +++ b/apps/web/messages/bg.json @@ -4,6 +4,8 @@ "ACCEPT": "Приемам", "ACCEPTED": "Приет", "REJECT": "Отхвърлям", + "MEMBER": "Член", + "ACTION": "Действие", "TOMORROW": "Утре", "YESTERDAY": "Вчера", "REJECTED": "Отхвърлен", @@ -179,7 +181,30 @@ "GITHUB_LOADING_TEXT": "В момента инсталираме вашия GitHub интеграция, изчакайте...", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Автоматично синхронизирайте задачите в приложението си за безпроблемни и ефективни актуализации.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Синхронизирайте задачите избирателно, като ги свържете с конкретен етикет.", - "GITHUB_AUTO_SYNC_LABEL": "Изберете етикет за автоматична синхронизация" + "GITHUB_AUTO_SYNC_LABEL": "Изберете етикет за автоматична синхронизация", + "THERE_IS_NO_TASK_ASSIGNED": "Няма възложени задачи", + "NO_USERS_ONLINE": "Няма потребители онлайн", + "NOT_FOUND": "не е намерено", + "PAGE_NOT_FOUND": "Страницата не е намерена", + "NO_USERS_WORKING": "В момента няма активни потребители", + "NO_USERS_PAUSED_WORK": "В момента няма потребители, които да са спрели работата си", + "NO_USERS_IDLE": "В момента няма неактивни потребители", + "SELECT_TEAM_MEMBER": "изберете член на екипа", + "ALL_MEMBERS": "Всички членове", + "NOT_WORKING": "Не работи", + "WORKING": "Работи", + "PAUSED": "Пауза", + "ONLINE": "Онлайн" + }, + "hotkeys": { + "HELP": "Помощ", + "TO_OPEN_SHORTCUT_LIST": "за да отворите списъка с клавишни комбинации", + "TIMER": "Таймер", + "START_TIMER": "Старт на таймера", + "STOP_TIMER": "Спиране на таймера", + "TASK": "Задача", + "ASSIGN_TASK": "Възлагане на задача", + "CREATE_TASK": "Създаване на задача" }, "alerts": { "REAL_TIME_ON_WORKING": "В момента работим върху синхронизирането в реално време, моля, проверете тази функция по-късно.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "Канбан дъска" }, "profile": { - "BREADCRUMB": "[\"Задачи за член\"]" + "BREADCRUMB": "[\"Задачи за член\"]", + "MEMBER_NOT_FOUND_MSG_1": "Членът, когото търсите, не съществува в отбора, моля опитайте да търсите с различен заявка.", + "MEMBER_NOT_FOUND_MSG_2": "Ако търсите член в различен отбор, моля изберете отбора от падащото меню по-горе.", + "GO_TO_HOME": "Отиди в началото" }, "taskDetails": { "BREADCRUMB": "[\"Детайли за задачата\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "изпрати код", + "RESEND_CODE": "Изпрати код отново", + "RESEND_CODE_IN": "Изпрати код отново след", "JOIN": "Присъединяване", "UNRECEIVED_CODE": "Не получихте код?", "JOIN_TEAM": "Присъединяване към отбор", @@ -375,6 +405,7 @@ "VERSIONS": "Версии", "LIST_OF_VERSONS": "Списък с версии", "ISSUETYPE": "Типове проблеми", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "Списък с проблеми", "RELATED_ISSUE_TYPE": "Свързани типове проблеми", "LIST_OF_RELATED_TYPE": "Списък със свързани типове", diff --git a/apps/web/messages/de.json b/apps/web/messages/de.json index eb303b8e4..0ccb799f0 100644 --- a/apps/web/messages/de.json +++ b/apps/web/messages/de.json @@ -4,6 +4,8 @@ "ACCEPT": "Akzeptieren", "ACCEPTED": "Akzeptiert", "REJECT": "Ablehnen", + "MEMBER": "Mitglied", + "ACTION": "Aktion", "TOMORROW": "Morgen", "CARDS": "Karten", "TABLE": "Tabelle", @@ -179,7 +181,30 @@ "GITHUB_INTEGRATION_SUBTITLE_TEXT": "Activate GitHub Integration for project & repository sync", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Synchronisieren Sie Aufgaben in Ihrer Anwendung automatisch für nahtlose und effiziente Aktualisierungen.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchronisieren Sie Aufgaben selektiv, indem Sie sie mit einem bestimmten Label verknüpfen.", - "GITHUB_AUTO_SYNC_LABEL": "Auto-Sync-Label auswählen" + "GITHUB_AUTO_SYNC_LABEL": "Auto-Sync-Label auswählen", + "THERE_IS_NO_TASK_ASSIGNED": "Es ist keine Aufgabe zugewiesen", + "NO_USERS_ONLINE": "Es sind keine Benutzer online", + "NOT_FOUND": "nicht gefunden", + "PAGE_NOT_FOUND": "Seite nicht gefunden", + "NO_USERS_WORKING": "Derzeit gibt es keine aktiven Benutzer", + "NO_USERS_PAUSED_WORK": "Derzeit gibt es keine Benutzer, die ihre Arbeit eingestellt haben", + "NO_USERS_IDLE": "Derzeit gibt es keine inaktiven Benutzer.", + "SELECT_TEAM_MEMBER": "Teammitglied auswählen", + "ALL_MEMBERS": "Alle Mitglieder", + "NOT_WORKING": "Nicht arbeiten", + "WORKING": "Arbeiten", + "PAUSED": "Pausiert", + "ONLINE": "Online" + }, + "hotkeys": { + "HELP": "Hilfe", + "TO_OPEN_SHORTCUT_LIST": "Um die Liste der Tastenkombinationen zu öffnen", + "TIMER": "Timer", + "START_TIMER": "Timer starten", + "STOP_TIMER": "Timer stoppen", + "TASK": "Aufgabe", + "ASSIGN_TASK": "Aufgabe zuweisen", + "CREATE_TASK": "Neue Aufgabe erstellen" }, "alerts": { "REAL_TIME_ON_WORKING": "Wir arbeiten derzeit an der Echtzeitsynchronisierung. Bitte überprüfen Sie diese Funktion später.", @@ -204,7 +229,11 @@ "KANBAN_BOARD": "Kanban-Board" }, "profile": { - "BREADCRUMB": "[\"Aufgaben des Mitglieds\"]" + "BREADCRUMB": "[\"Aufgaben des Mitglieds\"]", + "MEMBER_NOT_FOUND_MSG_1": "Das gesuchte Mitglied existiert nicht in einem Team. Bitte versuchen Sie, mit einer anderen Abfrage zu suchen.", + "MEMBER_NOT_FOUND_MSG_2": "Wenn Sie nach einem Mitglied in einem anderen Team suchen, wählen Sie bitte das Team aus dem Dropdown-Menü oben aus.", + "GO_TO_HOME": "Zur Startseite" + }, "taskDetails": { "BREADCRUMB": "[\"Aufgabendetails\"]", @@ -239,6 +268,8 @@ }, "auth": { "SEND_CODE": "Code senden", + "RESEND_CODE": "Code erneut senden", + "RESEND_CODE_IN": "Code in", "JOIN": "Beitreten", "UNRECEIVED_CODE": "Keinen Code erhalten?", "JOIN_TEAM": "Team beitreten", @@ -375,6 +406,7 @@ "VERSIONS": "Versionen", "LIST_OF_VERSONS": "Liste der Versionen", "ISSUETYPE": "Tickettypen", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "Liste der Tickets", "RELATED_ISSUE_TYPE": "Verwandte Tickettypen", "LIST_OF_RELATED_TYPE": "Liste verwandter Typen", diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 7d972b5ab..46fd065a9 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -4,6 +4,8 @@ "ACCEPT": "Accept", "ACCEPTED": "Accepted", "REJECT": "Reject", + "MEMBER": "Member", + "ACTION": "Action", "TOMORROW": "Tomorrow", "YESTERDAY": "Yesterday", "REJECTED": "Rejected", @@ -179,7 +181,30 @@ "GITHUB_INTEGRATION_SUBTITLE_TEXT": "Activate GitHub Integration for project & repository sync", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Automatically synchronize tasks in your application for seamless and efficient updates.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchronize tasks selectively by associating them with specific label.", - "GITHUB_AUTO_SYNC_LABEL": "Select Auto-Sync Label" + "GITHUB_AUTO_SYNC_LABEL": "Select Auto-Sync Label", + "THERE_IS_NO_TASK_ASSIGNED": "There is no task assigned", + "NO_USERS_ONLINE": "There are no users online", + "NOT_FOUND": "Not Found", + "PAGE_NOT_FOUND": "Page not found", + "NO_USERS_WORKING": "There are currently no active users", + "NO_USERS_PAUSED_WORK": "There are currently no users who have paused their work", + "NO_USERS_IDLE": "There are currently no inactive users", + "SELECT_TEAM_MEMBER": "Select team member", + "ALL_MEMBERS": "All Members", + "NOT_WORKING": "Not Working", + "WORKING": "Working", + "PAUSED": "Paused", + "ONLINE": "Online" + }, + "hotkeys": { + "HELP": "Help", + "TO_OPEN_SHORTCUT_LIST": "To open the shortcut list", + "TIMER": "Timer", + "START_TIMER": "Start Timer", + "STOP_TIMER": "Stop Timer", + "TASK": "Task", + "ASSIGN_TASK": "Assign Task", + "CREATE_TASK": "Create Task" }, "alerts": { "REAL_TIME_ON_WORKING": "We are working on Real-Time Sync at the moment, please check on this feature later.", @@ -201,7 +226,10 @@ "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" }, "profile": { - "BREADCRUMB": "[\"Member Tasks\"]" + "BREADCRUMB": "[\"Member Tasks\"]", + "MEMBER_NOT_FOUND_MSG_1": "Member you are looking is not exist in a team please try to search with different query.", + "MEMBER_NOT_FOUND_MSG_2": "If you are looking for a member in a different team, please select the team from the dropdown above.", + "GO_TO_HOME": "Go to Home" }, "kanban": { "KANBAN_BOARD": "Kanban Board" @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "send code", + "RESEND_CODE": "Resend Code", + "RESEND_CODE_IN": "Resend Code in", "JOIN": "Join", "UNRECEIVED_CODE": "Didn't receive code ?", "JOIN_TEAM": "Join Team", @@ -316,6 +346,7 @@ "TASK_SIZES": "Task Sizes", "TASK_LABELS": "Task Labels", "ISSUE_TYPES": "Issue Types", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "RELATED_TYPE": "Related Type", "INVITATION_HEADING_TITLE": "Invitations", "CREATE_NEW_STATUSES": "Create new Statuses", diff --git a/apps/web/messages/es.json b/apps/web/messages/es.json index 722ab17d6..35b544ab4 100644 --- a/apps/web/messages/es.json +++ b/apps/web/messages/es.json @@ -5,6 +5,8 @@ "ACCEPTED": "Aceptado", "REJECT": "Rechazar", "TOMORROW": "Mañana", + "ACTION": "Acción", + "MEMBER": "Miembro", "YESTERDAY": "Ayer", "REJECTED": "Rechazado", "VERIFY": "verificar", @@ -179,7 +181,30 @@ "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Sincronice automáticamente tareas en su aplicación para actualizaciones fluidas y eficientes.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Sincronice tareas de manera selectiva asociándolas con una etiqueta específica.", "GITHUB_AUTO_SYNC_LABEL": "Seleccionar etiqueta de sincronización automática", - "GITHUB_INTEGRATION_SUBTITLE_TEXT": "Activa la integración de GitHub para la sincronización de proyectos y repositorios" + "GITHUB_INTEGRATION_SUBTITLE_TEXT": "Activa la integración de GitHub para la sincronización de proyectos y repositorios", + "THERE_IS_NO_TASK_ASSIGNED": "No hay tareas asignadas", + "NO_USERS_ONLINE": "No hay usuarios en línea", + "NOT_FOUND": "No encontrado", + "PAGE_NOT_FOUND": "Página no encontrada", + "NO_USERS_WORKING": "Actualmente no hay usuarios activos", + "NO_USERS_PAUSED_WORK": "Actualmente no hay usuarios que hayan dejado de trabajar", + "NO_USERS_IDLE": "Actualmente no hay usuarios inactivos", + "SELECT_TEAM_MEMBER": "seleccionar miembro del equipo", + "ALL_MEMBERS": "Todos los miembros", + "NOT_WORKING": "No trabajando", + "WORKING": "Trabajando", + "PAUSED": "Pausado", + "ONLINE": "En línea" + }, + "hotkeys": { + "HELP": "Ayuda", + "TO_OPEN_SHORTCUT_LIST": "Para abrir la lista de atajos", + "TIMER": "Temporizador", + "START_TIMER": "Iniciar temporizador", + "STOP_TIMER": "Detener temporizador", + "TASK": "Tarea", + "ASSIGN_TASK": "Asignar tarea", + "CREATE_TASK": "Crear tarea" }, "alerts": { "REAL_TIME_ON_WORKING": "Estamos trabajando en la sincronización en tiempo real en este momento; verifique esta función más adelante.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "tablero kanban" }, "profile": { - "BREADCRUMB": "[\"Tareas de miembro\"]" + "BREADCRUMB": "[\"Tareas de miembro\"]", + "MEMBER_NOT_FOUND_MSG_1": "El miembro que estás buscando no existe en un equipo, por favor intenta buscar con una consulta diferente.", + "MEMBER_NOT_FOUND_MSG_2": "Si estás buscando un miembro en un equipo diferente, por favor selecciona el equipo del menú desplegable de arriba.", + "GO_TO_HOME": "Ir a la página de inicio" }, "taskDetails": { "BREADCRUMB": "[\"Detalles de la tarea\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "enviar código", + "RESEND_CODE": "Reenviar código", + "RESEND_CODE_IN": "Reenviar código en", "JOIN": "Unirse", "UNRECEIVED_CODE": "¿No recibiste el código?", "JOIN_TEAM": "Unirse al equipo", @@ -375,6 +405,7 @@ "VERSIONS": "Versiones", "LIST_OF_VERSONS": "Lista de versiones", "ISSUETYPE": "Tipos de problemas", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "Lista de problemas", "RELATED_ISSUE_TYPE": "Tipos de problemas relacionados", "LIST_OF_RELATED_TYPE": "Lista de tipos relacionados", diff --git a/apps/web/messages/fr.json b/apps/web/messages/fr.json index 136cf0b6d..315a10d0e 100644 --- a/apps/web/messages/fr.json +++ b/apps/web/messages/fr.json @@ -5,6 +5,8 @@ "ACCEPTED": "Accepté", "REJECT": "Rejeter", "TOMORROW": "Demain", + "MEMBER": "Membre", + "ACTION": "Action", "YESTERDAY": "Hier", "REJECTED": "Rejeté", "VERIFY": "Vérifier", @@ -179,7 +181,30 @@ "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Synchronisez automatiquement les tâches dans votre application pour des mises à jour fluides et efficaces.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchronisez sélectivement les tâches en les associant à une étiquette spécifique.", "GITHUB_AUTO_SYNC_LABEL": "Sélectionner l'étiquette de synchronisation automatique", - "GITHUB_INTEGRATION_SUBTITLE_TEXT": "Activez l'intégration GitHub pour la synchronisation des projets et des dépôts" + "GITHUB_INTEGRATION_SUBTITLE_TEXT": "Activez l'intégration GitHub pour la synchronisation des projets et des dépôts", + "THERE_IS_NO_TASK_ASSIGNED": "Aucune tâche n'est assignée", + "NO_USERS_ONLINE": "Aucun utilisateur en ligne", + "NOT_FOUND": "Non trouvé", + "PAGE_NOT_FOUND": "Page non trouvée", + "NO_USERS_WORKING": "Il n'y a actuellement aucun utilisateur actif", + "NO_USERS_PAUSED_WORK": "Il n'y a actuellement aucun utilisateur qui a mis en pause son travail", + "NO_USERS_IDLE": "Il n'y a actuellement aucun utilisateur inactif", + "SELECT_TEAM_MEMBER": "Sélectionner un membre", + "ALL_MEMBERS": "Tous les membres", + "NOT_WORKING": "Non actif", + "WORKING": "Actif", + "PAUSED": "En pause", + "ONLINE": "En ligne" + }, + "hotkeys": { + "HELP": "Aide", + "TO_OPEN_SHORTCUT_LIST": "Pour ouvrir la liste des raccourcis", + "TIMER": "Chronomètre", + "START_TIMER": "Démarrer le chronomètre", + "STOP_TIMER": "Arrêter le chronomètre", + "TASK": "Tâche", + "ASSIGN_TASK": "Assigner la tâche", + "CREATE_TASK": "Créer une tâche" }, "alerts": { "REAL_TIME_ON_WORKING": "Nous travaillons actuellement sur la synchronisation en temps réel, veuillez vérifier cette fonctionnalité plus tard.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "Tableau Kanban" }, "profile": { - "BREADCRUMB": "[\"Tâches du membre\"]" + "BREADCRUMB": "[\"Tâches du membre\"]", + "MEMBER_NOT_FOUND_MSG_1": "Le membre que vous recherchez n'existe pas dans une équipe, veuillez essayer de rechercher avec une requête différente.", + "MEMBER_NOT_FOUND_MSG_2": "Si vous recherchez un membre dans une équipe différente, veuillez sélectionner l'équipe dans le menu déroulant ci-dessus.", + "GO_TO_HOME": "Aller à la page d'accueil" }, "taskDetails": { "BREADCRUMB": "[\"Détails de la tâche\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "envoyer le code", + "RESEND_CODE": "Renvoyer le code", + "RESEND_CODE_IN": "Renvoyer le code dans", "JOIN": "Joindre", "UNRECEIVED_CODE": "Vous n'avez pas reçu de code ?", "JOIN_TEAM": "Rejoindre l'équipe", @@ -317,6 +347,7 @@ "TASK_SIZES": "Tailles des tâches", "TASK_LABELS": "Étiquettes des tâches", "ISSUE_TYPES": "Types de problèmes", + "DEFAULT_ISSUE_TYPE": "Type de problèmes par defaut", "RELATED_TYPE": "Type connexe", "INVITATION_HEADING_TITLE": "Invitations", "CREATE_NEW_STATUSES": "Créer de nouveaux statuts", diff --git a/apps/web/messages/he.json b/apps/web/messages/he.json index a305a8936..503557f9f 100644 --- a/apps/web/messages/he.json +++ b/apps/web/messages/he.json @@ -5,6 +5,8 @@ "ACCEPTED": "התקבל", "REJECT": "דחה", "TOMORROW": "מחר", + "MEMBER": "חבר", + "ACTION": "פעולה", "YESTERDAY": "אתמול", "REJECTED": "נדחה", "CARDS": "כרטיסים", @@ -179,7 +181,30 @@ "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "סנכרן משימות באופן אוטומטי באפליקציה שלך לעדכונים חלקים ויעילים.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "סנכרן משימות באופן בררני על ידי הקשרתן לתג מסוים.", "GITHUB_AUTO_SYNC_LABEL": "בחר תגית אוטומטית לסנכרון", - "GITHUB_INTEGRATION_SUBTITLE_TEXT": "הפעל אינטגרציה של GitHub עבור סנכרון פרויקטים ומאגרים" + "GITHUB_INTEGRATION_SUBTITLE_TEXT": "הפעל אינטגרציה של GitHub עבור סנכרון פרויקטים ומאגרים", + "THERE_IS_NO_TASK_ASSIGNED": "אין משימות מוקצות", + "NO_USERS_ONLINE": "אין משתמשים מחוברים", + "NOT_FOUND": "לא נמצא", + "PAGE_NOT_FOUND": "הדף לא נמצא", + "NO_USERS_WORKING": "כרגע אין משתמשים פעילים", + "NO_USERS_PAUSED_WORK": "כרגע אין משתמשים שהפסיקו את עבודתם", + "NO_USERS_IDLE": "כרגע אין משתמשים לא פעילים", + "SELECT_TEAM_MEMBER": "בחר חבר צוות", + "ALL_MEMBERS": "כל החברים", + "NOT_WORKING": "לא עובד", + "WORKING": "עובד", + "PAUSED": "מושהה", + "ONLINE": "מחובר" + }, + "hotkeys": { + "HELP": "עזרה", + "TO_OPEN_SHORTCUT_LIST": "כדי לפתוח את רשימת הקיצורים", + "TIMER": "טיימר", + "START_TIMER": "התחל טיימר", + "STOP_TIMER": "עצור טיימר", + "TASK": "משימה", + "ASSIGN_TASK": "הקצה משימה", + "CREATE_TASK": "צור משימה" }, "alerts": { "REAL_TIME_ON_WORKING": "אנחנו עובדים על סנכרון בזמן אמת כרגע, אנא בדוק את התכונה הזו מאוחר יותר.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "לוח Kanban" }, "profile": { - "BREADCRUMB": "[\"משימות חבר\"]" + "BREADCRUMB": "[\"משימות חבר\"]", + "MEMBER_NOT_FOUND_MSG_1": "החבר שאתה מחפש לא קיים בצוות, אנא נסה לחפש עם שאילתת חיפוש שונה.", + "MEMBER_NOT_FOUND_MSG_2": "אם אתה מחפש חבר בצוות שונה, אנא בחר את הצוות מהתפריט הנפתח למעלה.", + "GO_TO_HOME": "עבור לדף הבית" }, "taskDetails": { "BREADCRUMB": "[\"פרטי משימה\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "שלח קוד", + "RESEND_CODE": "שלח קוד מחדש", + "RESEND_CODE_IN": "שלח קוד מחדש ב-", "JOIN": "הצטרף", "UNRECEIVED_CODE": "לא קיבלת קוד?", "JOIN_TEAM": "הצטרף לצוות", @@ -375,6 +405,7 @@ "VERSIONS": "גרסאות", "LIST_OF_VERSONS": "רשימת גרסאות", "ISSUETYPE": "סוגי בעיות", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "רשימת בעיות", "RELATED_ISSUE_TYPE": "סוגי בעיות קשורות", "LIST_OF_RELATED_TYPE": "רשימת סוגים קשורים", diff --git a/apps/web/messages/it.json b/apps/web/messages/it.json index bd761c028..b444bb84b 100644 --- a/apps/web/messages/it.json +++ b/apps/web/messages/it.json @@ -4,6 +4,8 @@ "ACCEPT": "Accept", "ACCEPTED": "Accepted", "REJECT": "Reject", + "MEMBER": "Member", + "ACTION": "Action", "TOMORROW": "Domani", "YESTERDAY": "Ieri", "REJECTED": "Rifiutato", @@ -179,7 +181,30 @@ "GITHUB_LOADING_TEXT": "Stiamo installando la tua integrazione GitHub, attendi...", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Sincronizza automaticamente le attività nella tua applicazione per aggiornamenti senza intoppi ed efficienti.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Sincronizza le attività in modo selettivo associandole a un'etichetta specifica.", - "GITHUB_AUTO_SYNC_LABEL": "Seleziona etichetta di sincronizzazione automatica" + "GITHUB_AUTO_SYNC_LABEL": "Seleziona etichetta di sincronizzazione automatica", + "THERE_IS_NO_TASK_ASSIGNED": "Non è stato assegnato alcun compito", + "NO_USERS_ONLINE": "Nessun utente online", + "NOT_FOUND": "Non Trovato", + "PAGE_NOT_FOUND": "Pagina non trovata", + "NO_USERS_WORKING": "Al momento non ci sono utenti attivi", + "NO_USERS_PAUSED_WORK": "Al momento non ci sono utenti che hanno interrotto il proprio lavoro", + "NO_USERS_IDLE": "Al momento non ci sono utenti inattivi", + "SELECT_TEAM_MEMBER": "Seleziona il membro della squadra", + "ALL_MEMBERS": "Tutti i membri", + "NOT_WORKING": "Non Lavora", + "WORKING": "Lavora", + "PAUSED": "In Pausa", + "ONLINE": "Online" + }, + "hotkeys": { + "HELP": "Aiuto", + "TO_OPEN_SHORTCUT_LIST": "Per aprire la lista delle scorciatoie", + "TIMER": "Timer", + "START_TIMER": "Avvia Timer", + "STOP_TIMER": "Ferma Timer", + "TASK": "Compito", + "ASSIGN_TASK": "Assegna Compito", + "CREATE_TASK": "Crea Compito" }, "alerts": { "REAL_TIME_ON_WORKING": "Stiamo lavorando alla sincronizzazione in tempo reale al momento, controlla questa funzionalità più tardi.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "Tabellone Kanban" }, "profile": { - "BREADCRUMB": "[\"Compiti dei membri\"]" + "BREADCRUMB": "[\"Compiti dei membri\"]", + "MEMBER_NOT_FOUND_MSG_1": "Il membro che stai cercando non esiste in un team, prova a cercare con una query diversa.", + "MEMBER_NOT_FOUND_MSG_2": "Se stai cercando un membro in un team diverso, seleziona il team dal menu a discesa sopra.", + "GO_TO_HOME": "Vai alla Home" }, "taskDetails": { "BREADCRUMB": "[\"Dettagli attività\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "Invia Codice", + "RESEND_CODE": "Reinvia Codice", + "RESEND_CODE_IN": "Invia nuovamente il codice", "JOIN": "Unisciti", "UNRECEIVED_CODE": "Non hai ricevuto il codice?", "JOIN_TEAM": "Unisciti al Team", @@ -375,6 +405,7 @@ "VERSIONS": "Versioni", "LIST_OF_VERSONS": "Elenco delle Versioni", "ISSUETYPE": "Tipi di Problema", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "Elenco dei Problemi", "RELATED_ISSUE_TYPE": "Tipi di Problema Collegati", "LIST_OF_RELATED_TYPE": "Elenco dei Tipi Collegati", diff --git a/apps/web/messages/nl.json b/apps/web/messages/nl.json index 4d58b45d3..24296ad19 100644 --- a/apps/web/messages/nl.json +++ b/apps/web/messages/nl.json @@ -4,6 +4,8 @@ "ACCEPT": "Accepteren", "ACCEPTED": "Geaccepteerd", "REJECT": "Afwijzen", + "MEMBER": "Lid", + "ACTION": "Actie", "TOMORROW": "Morgen", "YESTERDAY": "Gisteren", "CARDS": "Kaarten", @@ -179,7 +181,30 @@ "GITHUB_LOADING_TEXT": "We zijn nu uw GitHub-integratie aan het installeren, even geduld...", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Synchroniseer taken automatisch in uw applicatie voor naadloze en efficiënte updates.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchroniseer taken selectief door ze te koppelen aan een specifiek label.", - "GITHUB_AUTO_SYNC_LABEL": "Selecteer Auto-Sync-label" + "GITHUB_AUTO_SYNC_LABEL": "Selecteer Auto-Sync-label", + "THERE_IS_NO_TASK_ASSIGNED": "Er is geen taak toegewezen", + "NO_USERS_ONLINE": "Geen gebruiker online", + "NOT_FOUND": "Niet gevonden", + "PAGE_NOT_FOUND": "Pagina niet gevonden", + "NO_USERS_WORKING": "Er zijn momenteel geen actieve gebruikers", + "NO_USERS_PAUSED_WORK": "Er zijn momenteel geen gebruikers die hun werk hebben stopgezet", + "NO_USERS_IDLE": "Er zijn momenteel geen inactieve gebruikers", + "SELECT_TEAM_MEMBER": "Selecteer teamlid", + "ALL_MEMBERS": "Alle leden", + "NOT_WORKING": "Niet aan het werk", + "WORKING": "Aan het werk", + "PAUSED": "Gepauzeerd", + "ONLINE": "Online" + }, + "hotkeys": { + "HELP": "Help", + "TO_OPEN_SHORTCUT_LIST": "Om de sneltoetsenlijst te openen", + "TIMER": "Timer", + "START_TIMER": "Start de timer", + "STOP_TIMER": "Stop de timer", + "TASK": "Taak", + "ASSIGN_TASK": "Taak toewijzen", + "CREATE_TASK": "Nieuwe taak maken" }, "alerts": { "REAL_TIME_ON_WORKING": "We werken momenteel aan Real-Time Sync. Bekijk deze functie later opnieuw.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "Kanban-bord" }, "profile": { - "BREADCRUMB": "[\"Taken teamlid\"]" + "BREADCRUMB": "[\"Taken teamlid\"]", + "MEMBER_NOT_FOUND_MSG_1": "Het lid dat u zoekt, bestaat niet in een team, probeer te zoeken met een andere query.", + "MEMBER_NOT_FOUND_MSG_2": "Als u op zoek bent naar een lid in een ander team, selecteert u het team uit de vervolgkeuzelijst hierboven.", + "GO_TO_HOME": "Ga naar de startpagina" }, "taskDetails": { "BREADCRUMB": "[\"Taakdetails\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "code verzenden", + "RESEND_CODE": "Code opnieuw verzenden", + "RESEND_CODE_IN": "Code opnieuw verzenden in", "JOIN": "Word lid", "UNRECEIVED_CODE": "Geen code ontvangen?", "JOIN_TEAM": "Word lid van team", @@ -375,6 +405,7 @@ "VERSIONS": "Versies", "LIST_OF_VERSONS": "Lijst met versies", "ISSUETYPE": "Probleemtypen", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "Lijst met problemen", "RELATED_ISSUE_TYPE": "Gerelateerde probleemtypen", "LIST_OF_RELATED_TYPE": "Lijst met gerelateerde typen", diff --git a/apps/web/messages/pl.json b/apps/web/messages/pl.json index 9498d3adb..28f3f0a5a 100644 --- a/apps/web/messages/pl.json +++ b/apps/web/messages/pl.json @@ -5,6 +5,8 @@ "ACCEPTED": "Zaakceptowane", "REJECT": "Odrzuć", "TOMORROW": "Jutro", + "MEMBER": "Członek", + "ACTION": "Akcja", "YESTERDAY": "Wczoraj", "REJECTED": "Odrzucone", "VERIFY": "weryfikuj", @@ -179,7 +181,30 @@ "GITHUB_LOADING_TEXT": "Aktualnie instalujemy integrację GitHub, proszę czekać...", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Automatycznie synchronizuj zadania w swojej aplikacji, aby uzyskać płynne i efektywne aktualizacje.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchronizuj zadania selektywnie, łącząc je z konkretną etykietą.", - "GITHUB_AUTO_SYNC_LABEL": "Wybierz etykietę automatycznej synchronizacji" + "GITHUB_AUTO_SYNC_LABEL": "Wybierz etykietę automatycznej synchronizacji", + "THERE_IS_NO_TASK_ASSIGNED": "Nie ma przypisanego zadania", + "NO_USERS_ONLINE": "Brak użytkowników online", + "NOT_FOUND": "Nie znaleziono", + "PAGE_NOT_FOUND": "Strona nie znaleziona", + "NO_USERS_WORKING": "Obecnie nie ma aktywnych użytkowników", + "NO_USERS_PAUSED_WORK": "Obecnie nie ma użytkowników, którzy przerwali pracę", + "NO_USERS_IDLE": "Obecnie nie ma nieaktywnych użytkowników", + "SELECT_TEAM_MEMBER": "Wybierz członka zespołu", + "ALL_MEMBERS": "Wszyscy członkowie", + "NOT_WORKING": "Niepracujący", + "WORKING": "Pracujący", + "PAUSED": "Wstrzymany", + "ONLINE": "Online" + }, + "hotkeys": { + "HELP": "Pomoc", + "TO_OPEN_SHORTCUT_LIST": "Aby otworzyć listę skrótów", + "TIMER": "Timer", + "START_TIMER": "Rozpocznij Timer", + "STOP_TIMER": "Zatrzymaj Timer", + "TASK": "Zadanie", + "ASSIGN_TASK": "Przypisz Zadanie", + "CREATE_TASK": "Utwórz Zadanie" }, "alerts": { "REAL_TIME_ON_WORKING": "W tej chwili pracujemy nad synchronizacją w czasie rzeczywistym. Sprawdź tę funkcję później.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "Tablica Kanbana" }, "profile": { - "BREADCRUMB": "[\"Member Tasks\"]" + "BREADCRUMB": "[\"Member Tasks\"]", + "MEMBER_NOT_FOUND_MSG_1": "Członek, którego szukasz, nie istnieje w zespole, spróbuj wyszukać z innym zapytaniem.", + "MEMBER_NOT_FOUND_MSG_2": "Jeśli szukasz członka w innym zespole, wybierz zespół z listy rozwijanej powyżej.", + "GO_TO_HOME": "Przejdź do strony głównej" }, "taskDetails": { "BREADCRUMB": "[\"Task Details\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "wyślij kod", + "RESEND_CODE": "Wyślij ponownie kod", + "RESEND_CODE_IN": "Wyślij ponownie kod w", "JOIN": "Dołącz", "UNRECEIVED_CODE": "Nie otrzymałeś kodu?", "JOIN_TEAM": "Dołącz do Zespołu", @@ -375,6 +405,7 @@ "VERSIONS": "Wersje", "LIST_OF_VERSONS": "Lista Wersji", "ISSUETYPE": "Typy Problemów", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "Lista Problemów", "RELATED_ISSUE_TYPE": "Powiązane Typy Problemów", "LIST_OF_RELATED_TYPE": "Lista Powiązanych Typów", diff --git a/apps/web/messages/pt.json b/apps/web/messages/pt.json index 3e1ef687f..d8e2d55ed 100644 --- a/apps/web/messages/pt.json +++ b/apps/web/messages/pt.json @@ -6,6 +6,8 @@ "REJECT": "Rejeitar", "YESTERDAY": "Ontem", "TOMORROW": "Amanhã", + "MEMBER": "Membro", + "ACTION": "Ação", "REJECTED": "Rejeitado", "VERIFY": "Verificar", "INVITE": "Convidar", @@ -179,7 +181,30 @@ "GITHUB_LOADING_TEXT": "Estamos agora a instalar a sua integração do GitHub, aguarde...", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Sincronize automaticamente tarefas em seu aplicativo para atualizações sem interrupções e eficientes.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Sincronize tarefas seletivamente associando-as a uma etiqueta específica.", - "GITHUB_AUTO_SYNC_LABEL": "Selecionar rótulo de sincronização automática" + "GITHUB_AUTO_SYNC_LABEL": "Selecionar rótulo de sincronização automática", + "THERE_IS_NO_TASK_ASSIGNED": "Não há tarefas atribuídas", + "NO_USERS_ONLINE": "Nenhum usuário online", + "NO_USERS_WORKING": "Atualmente não há usuários ativos", + "NO_USERS_PAUSED_WORK": "Atualmente não há usuários que interromperam seu trabalho", + "NO_USERS_IDLE": "Atualmente não há usuários inativos", + "NOT_FOUND": "Não encontrado", + "PAGE_NOT_FOUND": "Página não encontrada", + "SELECT_TEAM_MEMBER": "Selecione o membro da equipe", + "ALL_MEMBERS": "Todos os Membros", + "NOT_WORKING": "Não Trabalhando", + "WORKING": "Trabalhando", + "PAUSED": "Pausado", + "ONLINE": "Online" + }, + "hotkeys": { + "HELP": "Ajuda", + "TO_OPEN_SHORTCUT_LIST": "Para abrir a lista de atalhos", + "TIMER": "Temporizador", + "START_TIMER": "Iniciar Temporizador", + "STOP_TIMER": "Parar Temporizador", + "TASK": "Tarefa", + "ASSIGN_TASK": "Atribuir Tarefa", + "CREATE_TASK": "Criar Tarefa" }, "alerts": { "REAL_TIME_ON_WORKING": "Estamos trabalhando na sincronização em tempo real no momento. Verifique esse recurso mais tarde.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "Quadro Kanban" }, "profile": { - "BREADCRUMB": "[\"Tarefas do Membro\"]" + "BREADCRUMB": "[\"Tarefas do Membro\"]", + "MEMBER_NOT_FOUND_MSG_1": "O membro que você está procurando não existe em uma equipe, tente pesquisar com uma consulta diferente.", + "MEMBER_NOT_FOUND_MSG_2": "Se você está procurando um membro em uma equipe diferente, selecione a equipe no menu suspenso acima.", + "GO_TO_HOME": "Ir para a página inicial" }, "taskDetails": { "BREADCRUMB": "[\"Detalhes da Tarefa\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "enviar código", + "RESEND_CODE": "Reenviar Código", + "RESEND_CODE_IN": "Reenviar Código em", "JOIN": "Participar", "UNRECEIVED_CODE": "Não recebeu o código?", "JOIN_TEAM": "Participar da Equipe", @@ -375,6 +405,7 @@ "VERSIONS": "Versões", "LIST_OF_VERSONS": "Lista de Versões", "ISSUETYPE": "Tipos de Problema", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "Lista de Problemas", "RELATED_ISSUE_TYPE": "Tipos de Problema Relacionados", "LIST_OF_RELATED_TYPE": "Lista de Tipos Relacionados", diff --git a/apps/web/messages/ru.json b/apps/web/messages/ru.json index e3bd44fcf..b74bc44d0 100644 --- a/apps/web/messages/ru.json +++ b/apps/web/messages/ru.json @@ -5,6 +5,8 @@ "ACCEPTED": "Принято", "REJECT": "Отклонить", "TOMORROW": "Завтра", + "MEMBER": "Участник", + "ACTION": "Действие", "YESTERDAY": "Вчера", "REJECTED": "Отклонено", "VERIFY": "Проверить", @@ -179,7 +181,30 @@ "GITHUB_LOADING_TEXT": "Мы сейчас устанавливаем вашу интеграцию GitHub, подождите...", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Автоматическая синхронизация задач в вашем приложении для бесперебойных и эффективных обновлений.", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Синхронизация задач выборочно путем ассоциирования их с конкретной меткой.", - "GITHUB_AUTO_SYNC_LABEL": "Выберите метку автосинхронизации" + "GITHUB_AUTO_SYNC_LABEL": "Выберите метку автосинхронизации", + "THERE_IS_NO_TASK_ASSIGNED": "НЕТ ЗАДАЧИ НАЗНАЧЕНО", + "NO_USERS_ONLINE": "Нет пользователей онлайн", + "NOT_FOUND": "Не найдено", + "PAGE_NOT_FOUND": "Страница не найдена", + "NO_USERS_WORKING": "На данный момент нет активных пользователей", + "NO_USERS_PAUSED_WORK": "На данный момент нет пользователей, прекративших свою работу", + "NO_USERS_IDLE": "На данный момент неактивных пользователей нет", + "SELECT_TEAM_MEMBER": "Выберите члена команды", + "ALL_MEMBERS": "Все участники", + "NOT_WORKING": "Не работает", + "WORKING": "Работает", + "PAUSED": "Приостановлено", + "ONLINE": "Онлайн" + }, + "hotkeys": { + "HELP": "Помощь", + "TO_OPEN_SHORTCUT_LIST": "Чтобы открыть список горячих клавиш", + "TIMER": "Таймер", + "START_TIMER": "Запустить таймер", + "STOP_TIMER": "Остановить таймер", + "TASK": "Задача", + "ASSIGN_TASK": "Назначить задачу", + "CREATE_TASK": "Создать задачу" }, "alerts": { "REAL_TIME_ON_WORKING": "В настоящее время мы работаем над синхронизацией в реальном времени, пожалуйста, проверьте эту функцию позже.", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "Канбан-доска" }, "profile": { - "BREADCRUMB": "[\"Member Tasks\"]" + "BREADCRUMB": "[\"Member Tasks\"]", + "MEMBER_NOT_FOUND_MSG_1": "Участник, которого вы ищете, не существует в команде, попробуйте выполнить поиск с другим запросом.", + "MEMBER_NOT_FOUND_MSG_2": "Если вы ищете участника в другой команде, выберите команду из выпадающего списка выше.", + "GO_TO_HOME": "Перейти на главную страницу" }, "taskDetails": { "BREADCRUMB": "[\"Task Details\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "отправить код", + "RESEND_CODE": "Отправить код повторно", + "RESEND_CODE_IN": "Отправить код повторно через", "JOIN": "Присоединиться", "UNRECEIVED_CODE": "Не получили код?", "JOIN_TEAM": "Присоединиться к команде", @@ -375,6 +405,7 @@ "VERSIONS": "Версии", "LIST_OF_VERSONS": "Список версий", "ISSUETYPE": "Типы задач", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "Список задач", "RELATED_ISSUE_TYPE": "Связанные типы задач", "LIST_OF_RELATED_TYPE": "Список связанных типов", diff --git a/apps/web/messages/zh.json b/apps/web/messages/zh.json index e7366080b..dd84cb0ad 100644 --- a/apps/web/messages/zh.json +++ b/apps/web/messages/zh.json @@ -4,6 +4,8 @@ "ACCEPT": "接受", "ACCEPTED": "已接受", "REJECT": "拒绝", + "ACTION": "操作", + "MEMBER": "成员", "TOMORROW": "明天", "YESTERDAY": "昨天", "REJECTED": "已拒绝", @@ -179,7 +181,30 @@ "GITHUB_LOADING_TEXT": "我们正在安装您的 GitHub 集成,请稍等...", "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "在您的应用程序中自动同步任务,实现无缝和高效的更新。", "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "通过将任务与特定标签关联,有选择地进行同步。", - "GITHUB_AUTO_SYNC_LABEL": "选择自动同步标签" + "GITHUB_AUTO_SYNC_LABEL": "选择自动同步标签", + "THERE_IS_NO_TASK_ASSIGNED": "没有分配任务", + "NO_USERS_ONLINE": "没有在线用户", + "NOT_FOUND": "未找到", + "PAGE_NOT_FOUND": "页面未找到", + "NO_USERS_WORKING": "目前没有活跃用户", + "NO_USERS_PAUSED_WORK": "目前还没有用户停止工作", + "NO_USERS_IDLE": "目前没有不活跃用户", + "SELECT_TEAM_MEMBER": "选择团队成员", + "ALL_MEMBERS": "所有成员", + "NOT_WORKING": "不工作", + "WORKING": "工作", + "PAUSED": "暂停", + "ONLINE": "在线" + }, + "hotkeys": { + "HELP": "帮助", + "TO_OPEN_SHORTCUT_LIST": "打开快捷键列表", + "TIMER": "计时器", + "START_TIMER": "开始计时", + "STOP_TIMER": "停止计时", + "TASK": "任务", + "ASSIGN_TASK": "分配任务", + "CREATE_TASK": "创建任务" }, "alerts": { "REAL_TIME_ON_WORKING": "我們目前正在開發即時同步功能,請稍後查看此功能。", @@ -204,7 +229,10 @@ "KANBAN_BOARD": "看板" }, "profile": { - "BREADCRUMB": "[\"成员任务\"]" + "BREADCRUMB": "[\"成员任务\"]", + "MEMBER_NOT_FOUND_MSG_1": "您正在寻找的成员在团队中不存在,请尝试使用不同的查询进行搜索。", + "MEMBER_NOT_FOUND_MSG_2": "如果您正在寻找不同团队中的成员,请从上面的下拉菜单中选择团队。", + "GO_TO_HOME": "返回主页" }, "taskDetails": { "BREADCRUMB": "[\"任务详情\"]", @@ -239,6 +267,8 @@ }, "auth": { "SEND_CODE": "发送验证码", + "RESEND_CODE": "重新发送验证码", + "RESEND_CODE_IN": "重新发送验证码", "JOIN": "加入", "UNRECEIVED_CODE": "未收到验证码?", "JOIN_TEAM": "加入团队", @@ -375,6 +405,7 @@ "VERSIONS": "版本", "LIST_OF_VERSONS": "版本列表", "ISSUETYPE": "议题类型", + "DEFAULT_ISSUE_TYPE": "Default Issue Type", "LIST_OF_ISSUES": "议题列表", "RELATED_ISSUE_TYPE": "相关议题类型", "LIST_OF_RELATED_TYPE": "相关类型列表", diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index cb062985c..ec3b297ff 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -29,6 +29,8 @@ export const config = { ] }; +export { auth as authMiddleware } from './auth'; + export async function middleware(request: NextRequest) { const nextIntlMiddleware = createMiddleware({ defaultLocale: APPLICATION_DEFAULT_LANGUAGE, diff --git a/apps/web/next.config.js b/apps/web/next.config.js index b9b820640..6bc0ba0d5 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -74,6 +74,7 @@ const nextConfig = { domains: [ 'dummyimage.com', 'res.cloudinary.com', + 'gauzy.sfo2.digitaloceanspaces.com', 'localhost', '127.0.0.1', 'cdn-icons-png.flaticon.com', // Remove this domain once the Backend Icons list is added diff --git a/apps/web/ni18n.config.ts b/apps/web/ni18n.config.ts deleted file mode 100644 index 1c8600021..000000000 --- a/apps/web/ni18n.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; -const supportedLngs = ['en', 'fr', 'ar', 'bg', 'zh', 'nl', 'de', 'he', 'it', 'pl', 'pt', 'ru', 'es']; - -i18n.use(initReactI18next).init({ - lng: 'en', - fallbackLng: 'en', - ns: ['common'], - defaultNS: 'common', - supportedLngs, - interpolation: { - escapeValue: false - } -}); - -supportedLngs.forEach((lang) => { - i18n.addResourceBundle(lang, 'common', require(`/public/locales/${lang}/common.json`)); -}); - -export default i18n; diff --git a/apps/web/package.json b/apps/web/package.json index 4908ee9bb..f148d12da 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -16,6 +16,7 @@ "format": "prettier --ignore-path .gitignore \"./**/*.+(ts|js|tsx)\" --write" }, "dependencies": { + "@auth/core": "^0.31.0", "@emoji-mart/data": "^1.1.2", "@emoji-mart/react": "^1.1.1", "@excalidraw/excalidraw": "^0.15.3", @@ -30,11 +31,14 @@ "@opentelemetry/sdk-node": "^0.45.1", "@opentelemetry/semantic-conventions": "^1.18.1", "@popperjs/core": "^2.11.6", + "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-avatar": "^1.0.3", "@radix-ui/react-dialog": "^1.0.4", + "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-hover-card": "^1.0.6", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-popover": "^1.0.6", + "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.4", @@ -50,7 +54,8 @@ "clsx": "^2.0.0", "cmdk": "^0.2.0", "cookie": "^0.5.0", - "cookies-next": "^4.1.0", + "cookies-next": "^4.1.1", + "country-flag-icons": "^1.5.11", "date-fns": "^2.30.0", "domhandler": "^5.0.3", "embla-carousel-react": "^8.0.0-rc11", @@ -67,7 +72,8 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.42", "nanoid": "5.0.1", - "next": "^14.0.4", + "next": "^14.2.3", + "next-auth": "^5.0.0-beta.18", "next-intl": "^3.3.2", "next-themes": "^0.2.1", "ni18n": "^1.1.0", @@ -83,7 +89,7 @@ "react-dom": "^18.2.0", "react-google-recaptcha": "^2.1.0", "react-hook-form": "^7.42.1", - "react-i18next": "^13.3.1", + "react-icons": "^5.2.0", "react-loading-skeleton": "^3.1.1", "react-paginate": "^8.2.0", "react-popper": "^2.3.0", @@ -101,8 +107,10 @@ "tailwindcss-animate": "^1.0.6" }, "devDependencies": { + "@svgr/webpack": "^8.1.0", "@tailwindcss/typography": "^0.5.9", "@types/cookie": "^0.5.1", + "@types/country-flag-icons": "^1.2.2", "@types/js-cookie": "^3.0.2", "@types/jsonwebtoken": "^9.0.2", "@types/node": "^20.12.2", @@ -111,11 +119,10 @@ "@types/react-beautiful-dnd": "^13.1.6", "@types/react-dom": "18.0.6", "@types/react-google-recaptcha": "^2.1.5", - "@svgr/webpack": "^8.1.0", + "dotenv": "^16.4.1", "eslint": "^8.28.0", - "eslint-plugin-unused-imports": "^3.0.0", "eslint-config-next": "^14.0.4", - "dotenv": "^16.4.1", + "eslint-plugin-unused-imports": "^3.0.0", "typescript": "^4.9.4" }, "prettier": { diff --git a/apps/web/pages/api/auth/signin-workspace.ts b/apps/web/pages/api/auth/signin-workspace.ts index 4319ef6a4..2cf7a3691 100644 --- a/apps/web/pages/api/auth/signin-workspace.ts +++ b/apps/web/pages/api/auth/signin-workspace.ts @@ -22,8 +22,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) code: string; }; - let loginResponse: ILoginResponse | null = null; - const { errors, valid: formValid } = authFormValidate(['email'], body as any); if (!formValid) { @@ -31,100 +29,117 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } // Accept Invite Flow Start - /** - * Verify first if match with invite code - */ - const inviteReq = await verifyInviteCodeRequest({ - email: body.email, - code: body.code - }).catch(() => void 0); - - // General a random password with 8 chars - if (inviteReq && inviteReq.data.fullName) { - const password = generateToken(8); - - const names = inviteReq.data.fullName.split(' '); - const acceptInviteRes = await acceptInviteRequest({ - code: body.code, - email: body.email, - password: password, - user: { - firstName: names[0], - lastName: names[1] || '', - email: body.email - } - }).catch(() => void 0); - - if ( - !acceptInviteRes || - !acceptInviteRes.response.ok || - acceptInviteRes.response.status === 401 || - acceptInviteRes.response.status === 400 || - (acceptInviteRes?.data as any).response?.statusCode - ) { - return res.status(400).json({ - errors: { - email: 'Authentication code or email address invalid' - } - }); + const loginWithCode = async () => { + if (!body.code) { + return; } - loginResponse = acceptInviteRes.data; - if (!loginResponse) { - return res.status(400).json({ - errors: { - email: 'Authentication code or email address invalid' - } - }); - } - } - if (loginResponse) { - console.log('loginResponse>>>', loginResponse); + let loginResponse: ILoginResponse | null = null; /** - * Get the first team from first organization + * Verify first if match with invite code */ - const tenantId = loginResponse.user?.tenantId || ''; - const access_token = loginResponse.token; - const userId = loginResponse.user?.id; - - const { data: organizations } = await getUserOrganizationsRequest({ tenantId, userId }, access_token); - const organization = organizations?.items[0]; + const inviteReq = await verifyInviteCodeRequest({ + email: body.email, + code: body.code + }).catch(() => void 0); - if (!organization) { - return res.status(400).json({ - errors: { - email: 'Your account is not yet ready to be used on the Ever Teams Platform' + // General a random password with 8 chars + if (inviteReq && inviteReq.data.fullName) { + const password = generateToken(8); + + const names = inviteReq.data.fullName.split(' '); + const acceptInviteRes = await acceptInviteRequest({ + code: body.code, + email: body.email, + password: password, + user: { + firstName: names[0], + lastName: names[1] || '', + email: body.email } - }); - } - const { data: teams } = await getAllOrganizationTeamRequest( - { tenantId, organizationId: organization.organizationId }, - access_token - ); - - const team = teams.items[0]; - if (!team) { - setNoTeamPopupShowCookie(true); + }).catch(() => void 0); + + if ( + !acceptInviteRes || + !acceptInviteRes.response.ok || + acceptInviteRes.response.status === 401 || + acceptInviteRes.response.status === 400 || + (acceptInviteRes?.data as any).response?.statusCode + ) { + return res.status(400).json({ + errors: { + email: 'Authentication code or email address invalid' + } + }); + } + loginResponse = acceptInviteRes.data; + + if (!loginResponse) { + return res.status(400).json({ + errors: { + email: 'Authentication code or email address invalid' + } + }); + } } - setAuthCookies( - { - access_token: loginResponse.token, - refresh_token: { - token: loginResponse.refresh_token + if (loginResponse) { + console.log('loginResponse>>>', loginResponse); + + /** + * Get the first team from first organization + */ + const tenantId = loginResponse.user?.tenantId || ''; + const access_token = loginResponse.token; + const userId = loginResponse.user?.id; + + const { data: organizations } = await getUserOrganizationsRequest({ tenantId, userId }, access_token); + const organization = organizations?.items[0]; + + if (!organization) { + return res.status(400).json({ + errors: { + email: 'Your account is not yet ready to be used on the Ever Teams Platform' + } + }); + } + const { data: teams } = await getAllOrganizationTeamRequest( + { tenantId, organizationId: organization.organizationId }, + access_token + ); + + const team = teams.items[0]; + if (!team) { + setNoTeamPopupShowCookie(true); + } + + setAuthCookies( + { + access_token: loginResponse.token, + refresh_token: { + token: loginResponse.refresh_token + }, + teamId: team?.id, + tenantId, + organizationId: organization?.organizationId, + languageId: 'en', // TODO: not sure what should be here + noTeamPopup: true, + userId }, - teamId: team?.id, - tenantId, - organizationId: organization?.organizationId, - languageId: 'en', // TODO: not sure what should be here - noTeamPopup: true, - userId - }, - { req, res } - ); + { req, res } + ); + + return res.status(200).json({ team, loginResponse }); + } + + return null; + }; + + const loginCode = await loginWithCode(); - return res.status(200).json({ team, loginResponse }); + if (loginCode) { + return loginCode; } // Accept Invite Flow End diff --git a/apps/web/public/locales/ar/common.json b/apps/web/public/locales/ar/common.json deleted file mode 100644 index d9af0a499..000000000 --- a/apps/web/public/locales/ar/common.json +++ /dev/null @@ -1,571 +0,0 @@ -{ - "TITLE": "إيفر تيمز", - "common": { - "ACCEPT": "قبول", - "ACCEPTED": "مقبول", - "REJECT": "رفض", - "REJECTED": "مرفوض", - "VERIFY": "تحقق", - - "INVITE": "دعوة", - "INVITED": "مدعو", - "EXPIRE": "انتهاء الصلاحية", - "EXPIRED": "منتهي الصلاحية", - "REQUEST": "طلب", - "REQUESTED": "مطلوب", - "LABEL": "تصنيف", - "LABELS": "تصنيفات", - "POSITION": "منصب", - "ROLES": "أدوار", - "JOIN_OR_LEFT": "انضم / غادر", - "PLEASE": "من فضلك", - "HERE": "هنا", - "PEOPLE": "أشخاص", - "COLLABORATE": "تعاون", - "NO": "لا", - "ONLY_ME": "أنا فقط", - "YES": "نعم", - "BASIC": "أساسي", - "DELETE": "حذف", - "MEET": "اجتماع", - "BOARD": "لوحة", - "SECURITY_CODE": "رمز الأمان", - "CONFIRM": "تأكيد", - "YOUR_EMAIL": "بريدك الإلكتروني", - "CONTINUE": "متابعة", - "EDIT_TASK": "تعديل المهمة", - "ASSIGN_TASK": "تعيين مهمة", - - "ASSIGN_TASK_TO": "تعيين المهمة إلى", - "REMOVE_ACCOUNT": "إزالة الحساب", - "REMOVE_EVERYWHERE": "إزالة من كل مكان", - "DELETE_ACCOUNT": "حذف هذا الحساب", - "UNASSIGN_TASK": "إلغاء تعيين المهمة", - "MAKE_A_MANAGER": "جعل مدير", - "UNMAKE_A_MANAGER": "إلغاء جعل مدير", - "TRANSFERT_OWNERSHIP": "نقل الملكية", - "TRANSFERT_OWNERSHIP_TO": "نقل الملكية الكاملة للفريق إلى مستخدم آخر", - "REMOVE": "إزالة", - "REMOVE_TEAM": "إزالة الفريق", - "DISPOSE_TEAM": "التخلص من الفريق", - "QUIT_TEAM": "مغادرة الفريق", - "QUIT": "مغادرة", - "STATUSES": "الحالات", - "RESEND_INVITATION": "إعادة إرسال الدعوة", - "TODAY": "اليوم", - "TOTAL": "المجموع", - "ESTIMATED": "التقديري", - "ESTIMATE": "تقدير", - "STATUS": "الحالة", - "NAME": "الاسم", - "TASK": "المهمة", - "MY_TASKS": "مهامي", - "WORKED_ON_TASK": "عمل على المهمة", - "TOTAL_WORKED_TODAY": "إجمالي العمل اليوم", - "TOTAL_WORK": "عمل اليوم", - "OPEN": "فتح", - "NOW": "الآن", - "NEXT": "التالي", - "PREV": "السابق", - "DETAILS": "التفاصيل", - "CLOSED": "مغلق", - "CLOSE": "إغلاق", - "USER_NOT_FOUND": "لم يتم العثور على مستخدمين.", - "TASK_TITTLE": "عنوان المهمة", - "PUBLIC_TASK": "هذه المهمة عامة", - "PRIVATE_TASK": "هذه المهمة خاصة", - "PUBLIC_TASK_LABEL": "جعل عامة", - "PRIVATE_TASK_LABEL": "جعل خاصة", - "CREATE_TASK": "إنشاء مهمة جديدة", - "LINK_TASK": "تحديد القضية ذات الصلة", - "LINK": "رابط", - "LINKS": "روابط", - "SHOW": "عرض", - "ADD_LINK": "إضافة روابط", - "COMMENT": "تعليق", - "DESCRIPTION": "وصف", - "CHILD_ISSUE_TASK": "تحديد القضية الفرعية", - "CREATE_TEAM": "إنشاء فريق جديد", - "VERIFY_ACCOUNT_MSG": "يرجى التحقق من حسابك قبل البدء في استخدام التطبيق", - "CREATE_ROLE": "إنشاء دور", - "CREATE": "إنشاء", - "CREATE_ISSUE": "إنشاء قضية", - "NEW_ISSUE": "قضية جديدة", - "ACTIVATED": "مفعل", - "DEACTIVATED": "غير مفعل", - "PERIOD": "فترة", - "NEW": "جديد", - "CREATE_VERSION": "إنشاء إصدار", - "VERSION": "الإصدار", - "LOADING": "جاري التحميل", - "TOTAL_TIME": "إجمالي الوقت", - "LAST_24_HOURS": "آخر 24 ساعة", - "WORKED": "عمل", - "ASSIGNED": "معين", - "SELECT_STATUS": "تحديد الحالة", - "SELECT_ISSUE": "تحديد القضية", - "UNASSIGNED": "غير معين", - "TASK_DETAILS": "تفاصيل المهمة", - "TYPE_SOMETHING": "اكتب شيئًا ما", - "FILTER": "تصفية", - "APPLY": "تطبيق", - "RESET": "إعادة تعيين", - "LOGOUT": "تسجيل خروج", - "THEMES": "المواضيع", - "3D_MODE": "الوضع ثلاثي الأبعاد", - "DARK_MODE": "الوضع الداكن", - "SETTINGS": "الإعدادات", - "PERSONAL": "شخصي", - "USE_SETTING": "استخدام الإعداد", - "TEAM": "الفريق", - "MY_TEAM": "فريقي", - "FULL_NAME": "الاسم الكامل", - "USER_AVATAR": "صورة المستخدم", - "CONTACT": "جهة الاتصال", - "ENABLED": "يُمكَِن", - "DISABLED": "إبطال", - "THEME": "الموضوع", - "TIME_ZONE": "المنطقة الزمنية", - "EDIT": "تعديل", - "SAVE": "حفظ", - "LANGUAGE": "اللغة", - "DETECT": "كشف", - "TRANSFER": "نقل", - "TRANSFER_TEAM": "نقل الفريق", - "TEAM_MEMBERS": "أعضاء الفريق", - "NO_TEAM": "أنشئ فريقك الخاص أو انضم إلى فريق موجود", - "NO_TEAM_SUB": "من الرائع العمل مع الآخرين، لذا قم بإنشاء فريق وادعو الجميع للتعاون!", - "NO_TEAM_TOOLTIP": "تحتاج إلى التحقق من عنوان بريدك الإلكتروني", - "CANCEL": "إلغاء", - "DISCARD": "تجاهل", - "EXISTING_MEMBER": "عضو بالفعل", - "NEW_MEMBER": "أصبح عضوًا", - "BACK": "رجوع", - "JOIN_REQUEST": "طلب الانضمام", - "PERMISSION": "الإذن", - "SEARCH": "بحث", - "ADD_PARENT": "إضافة أصل", - "BLOCKS": "يحجب", - "CLONES": "نسخ", - "DUPLICATES": "مكررات", - "IS_BLOCKED_BY": "محجوب بواسطة", - "IS_CLONED_BY": "منسوخ بواسطة", - "IS_DUPLICATED_BY": "مكرر بواسطة", - "RELATES_TO": "يتعلق بـ", - "CHANGE_PARENT": "تغيير الأصل", - "RELATED_ISSUES": "القضايا ذات الصلة", - "CHILD_ISSUES": "القضايا الفرعية", - "REOPEN": "إعادة فتح", - "NO_TASKS": "لا توجد مهام", - "FULL_WIDTH": "العرض الكامل", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "يرجى إيقاف المؤقت قبل تغيير المهمة", - - "COLLABORATE_DIALOG_TITLE": "بدء التعاون", - "COLLABORATE_DIALOG_SUB_TITLE": "ادعُ عضوًا (أعضاء) وابدأ التعاون", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "بدء اجتماع أو تعاون لوحة", - "ISSUE_TYPE": "نوع القضية", - "ACTIVITY": "النشاط", - "FILTER_ALL": "الكل", - "FILTER_COMMENTS": "التعليقات", - "FILTER_HISTORY": "التاريخ", - "FILTER_UNSUBSCRIBE": "إلغاء الاشتراك", - - "KEYBOARD_SHORTCUTS": "اختصارات لوحة المفاتيح", - "GITHUB_LOADING_TEXT": "نحن الآن في عملية تثبيت التكامل الخاص بك على GitHub، توكّل.", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "قم بمزامنة المهام تلقائيًا في تطبيقك لتحديثات سلسة وفعّالة.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "تزامن المهام بشكل انتقائي عن طريق ربطها بتصنيف معين.", - "GITHUB_AUTO_SYNC_LABEL": "اختر تسمية التزامن التلقائي" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "نحن نعمل على المزامنة في الوقت الحقيقي في الوقت الحالي، يرجى التحقق من هذه الميزة لاحقًا.", - "ALERT_DELETE_ACCOUNT": "سيتم إزالة الحساب من جميع الفرق، باستثناء حيث أنت المدير فقط", - "ALERT_ACCOUNT_PERMANENT_DELETE": "سيتم حذف حسابك نهائياً مع إزالته من جميع الفرق", - "ALERT_REMOVE_TEAM": "سيتم إزالة الفريق بالكامل من النظام وفقدان أعضاء الفريق للوصول", - "ALERT_REMOVE_ALL_DATA": "ستتم إزالة جميع بيانات الحساب من جميع الفرق التي تكون فيها مديرًا موجودًا واحدًا فقط", - "ALERT_QUIT_TEAM": "أنت على وشك مغادرة الفريق" - }, - "pages": { - "home": { - "BREADCRUMB": ["لوحة التحكم"], - "SENT_EMAIL_VERIFICATION": "تم إرسال تحقق الرمز إلى بريدك الإلكتروني", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "تحتاج إلى", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " عنوان بريدك الإلكتروني. يجب أن يكون الرمز التحقق قد أُرسل بالفعل إلى بريدك الإلكتروني، ولكن يمكنك النقر فوق", - "SENT_EMAIL_VERIFICATION_RESEND": "لإعادة إرسال الرمز إذا لم تتلقاه.", - "INVITATIONS": "لقد تمت دعوتك للانضمام إلى", - "CONFIRM_ACCEPT_INVITATION": "هل أنت متأكد من رغبتك في قبول الدعوة؟", - "CONFIRM_REJECT_INVITATION": "هل أنت متأكد من رغبتك في رفض الدعوة؟" - }, - - "profile": { - "BREADCRUMB": ["مهام العضو"] - }, - - "taskDetails": { - "BREADCRUMB": ["تفاصيل المهمة"], - "DESCRIPTION": "الوصف", - "ADD_DESCRIPTION": "أضف وصفًا هنا", - "TYPE_OF_ISSUE": "نوع القضية", - "CREATOR": "المنشئ", - "ASSIGNEES": "المعينون", - "START_DATE": "تاريخ البدء", - "DUE_DATE": "تاريخ الاستحقاق", - "DAYS_REMAINING": "الأيام المتبقية", - "VERSION": "الإصدار", - "EPIC": "الملحمي", - "STATUS": "الحالة", - "LABEL": "التصنيف", - "LABELS": "التصنيفات", - "SIZE": "الحجم", - "PRIORITY": "الأولوية", - "ESTIMATIONS": "التقديرات", - "PROGRESS": "التقدم", - "TOTAL_TIME": "إجمالي الوقت", - "TIME_TODAY": "الوقت اليوم", - "TOTAL_GROUP_TIME": "إجمالي وقت المجموعة", - "TIME_REMAINING": "الوقت المتبقي", - "CREATED": "تم الإنشاء", - "UPDATED": "تم التحديث", - "RESOLVED": "تم الحل", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "تعذر علينا تحديث عنوان المهمة.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "لا يمكن أن يتجاوز عنوان المهمة 255 حرفًا.", - - "TASK_IS_ALREADY_EPIC": "لا يمكن تغيير نوع المهمة الملحمية.", - "TASK_HAS_PARENT": "لا يمكن تغيير نوع المهمة حيث أن لديها بالفعل والد." - }, - - "auth": { - "SEND_CODE": "إرسال الرمز", - "JOIN": "انضمام", - "UNRECEIVED_CODE": "لم تتلقى الرمز؟", - "JOIN_TEAM": "انضمام للفريق", - "INPUT_INVITE_CODE": "إدخال رمز الدعوة.", - "INPUT_INVITE_CODE_DESC": "أدخل رمز الدعوة الذي أرسلناه إلى بريدك الإلكتروني.", - "INVALID_INVITE_CODE_MESSAGE": "رمز غير صالح", - "WELCOME_TEAMS": "مرحبًا بك في إيفر تيمز", - - "COVER_TITLE": "تابع تقدم عمل فرقك في الوقت الفعلي!", - "COVER_DESCRIPTION": "نص تجريبي هنا", - "LOGIN": "تسجيل الدخول", - "SELECT_WORKSPACE": "تحديد مساحة العمل", - "ENTER_EMAIL": "أدخل البريد الإلكتروني", - "WORKSPACES_NOT_FOUND": "لم يتم العثور على مساحات عمل" - }, - "authPasscode": { - "HEADING_TITLE": "الانضمام إلى فريق موجود", - "HEADING_DESCRIPTION": "يرجى إدخال البريد الإلكتروني ورمز الدعوة للانضمام إلى فريق موجود." - }, - "authLogin": { - "HEADING_TITLE": "تسجيل الدخول إلى الفريق", - "HEADING_DESCRIPTION": "يرجى إدخال البريد الإلكتروني ورمز الدعوة لتسجيل الدخول.", - - "WORKSPACE": "مساحة العمل", - "HEADING_WORKSPACE_LINE1": "البريد الإلكتروني المرتبط بمساحات عمل متعددة،", - "HEADING_WORKSPACE_LINE2": "يرجى تحديد واحدة للمتابعة" - }, - "authTeam": { - "HEADING_TITLE": "إنشاء فريق جديد", - "HEADING_DESCRIPTION": "يرجى إدخال تفاصيل فريقك لإنشاء فريق جديد.", - "LOADING_TEXT": "نحن الآن ننشئ مساحة عملك الجديدة، انتظر...", - "VERIFY_EMAIL_LOADING_TEXT": "نحن نحقق من بريدك الإلكتروني، انتظر...", - "INPUT_TEAM_NAME": "أدخل اسم فريقك", - "JOIN_EXISTING_TEAM": "الانضمام إلى فريق موجود؟", - "CREATE_FIRST_TEAM": "أنشئ أول فريق لك", - "CREATE_TEAM": "إنشاء فريق" - }, - - "settings": { - "BREADCRUMB": [{ "title": "لوحة التحكم", "href": "/" }, "الإعدادات"], - "DANDER_ZONE": "منطقة الخطر", - "HEADING_DESCRIPTION": "ضبط وإدارة لوحة التحكم الشخصية هنا", - "ARE_YOU_SURE_TO_DELETE_USER": "هل أنت متأكد من رغبتك في حذف هذا المستخدم؟" - }, - - "settingsPersonal": { - "HEADING_TITLE": "الإعدادات العامة", - "emailNotValid": "يرجى تقديم بريد إلكتروني صالح", - "phoneNotValid": "يرجى تقديم رقم هاتف صالح", - "WORK_SCHEDULE": "جدول العمل", - "SUBSCRIPTION": "الاشتراك", - "TIMEZONE_SEARCH_PLACEHOLDER": "المنطقة الزمنية الخاصة بك", - "ABOUT_TO_CHANGE_EMAIL": "أنت على وشك تغيير البريد الإلكتروني", - "ABOUT_TO_DELETE_ACCOUNT": "أنت على وشك حذف حسابك؟", - "DATA_SYNCHRONIZATION": "مزامنة البيانات", - "ABOUT_TO_REMOVE_ACCOUNT": "أنت على وشك إزالة حسابك؟", - "ABOUT_TO_REMOVE_FROM_ALL_TEAMS": "You're about to be removed from all teams, unless you're the only manager ?", - "ABOUT_TO_DELETE_ALL_ACCOUNT_DATA": "You are about to Delete your account and all your data ?" - }, - - "settingsTeam": { - "HEADING_TITLE": "الإعدادات العامة", - "MEMBER_HEADING_TITLE": "الأعضاء", - "PRIORITIES_HEADING": "الأولويات", - "NOTIFICATION_HEADING": "الإشعارات", - "SIZES_HEADING": "الأحجام", - "TEAM_NAME": "اسم الفريق", - "TEAM_TYPE": "نوع الفريق", - "TIME_TRACKING": "تتبع الوقت", - - "ADD_NEW_MEMBER": "إضافة عضو جديد", - "MANAGE_ASSIGNEES": "إدارة المعينين", - "SEARCH_MEMBER": "البحث عن عضو", - "TASK_STATUSES": "حالات المهام", - "TASK_PRIORITIES": "أولويات المهام", - "TASK_SIZES": "أحجام المهام", - "TASK_LABELS": "تصنيفات المهام", - "ISSUE_TYPES": "أنواع القضايا", - "RELATED_TYPE": "النوع ذو الصلة", - - "INVITATION_HEADING_TITLE": "الدعوات", - "CREATE_NEW_STATUSES": "إنشاء حالات جديدة", - "CREATE_NEW_STATUS": "إنشاء حالة جديدة", - "CREATE_NEW_VERSION": "إنشاء إصدار جديد", - "CREATE_NEW_PRIORITIES": "إنشاء أولويات جديدة", - "CREATE_NEW_PRIORITY": "إنشاء أولوية جديدة", - "CREATE_NEW_SIZES": "إنشاء أحجام جديدة", - "CREATE_NEW_SIZE": "إنشاء حجم جديد", - "CREATE_NEW_LABELS": "إنشاء تصنيفات جديدة", - "CREATE_NEW_LABEL": "إنشاء تصنيف جديد", - "CREATE_NEW_ISSUE_TYPES": "إنشاء قضايا جديدة", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "إخفاء معلومات الأعضاء الشخصية", - "POSITION_CUSTOM": "المناصب المخصصة", - "INVITATION_EXPIRATION": "انتهاء صلاحية الدعوة", - "NOTIFY_IF": "إشعار إذا", - "TEAM_REQUEST": "طلب الفريق", - "WORK_SCHEDULE": "جدول العمل", - "MEMBER_AND_ROLES": "الأعضاء والأدوار", - "INTEGRATIONS": "التكاملات", - "DANDER_ZONES": "مناطق الخطر", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "قم بالاتصال بـ GitHub وابدأ مزامنة قضايا GitHub مع فريقك", - "SELECT_REPOSITORY": "تحديد المستودع", - - "INSTALL": "تثبيت", - - "LIST_OF_STATUSES": "قائمة الحالات", - "LIST_OF_PRIORITIES": "قائمة الأولويات", - "LIST_OF_SIZES": "قائمة الأحجام", - "LIST_OF_LABELS": "قائمة التصنيفات", - "LIST_OF_ISSUES_TYPE": "قائمة القضايا", - - "GENERAL": "عام", - "SOUND": "الصوت", - "EMAIL": "البريد الإلكتروني", - "USERS": "المستخدمون", - "TASKS": "المهام", - "SYSTEM": "النظام", - "SECURITY": "الأمان", - "INAPP": "داخل التطبيق", - "NOTIFICATION_HEADING_TITLE": "إعدادات الإشعارات", - "ISSUE_HEADING_TITLE": "إعدادات القضايا", - - "TASK_PRIVACY": "خصوصية المهمة", - "MULTIPLE_ASSIGNEES": "متعدد المعينين", - "MANUAL_TIME": "الوقت اليدوي", - "GROUP_ESTIMATION": "تقدير المجموعة", - "ESTIMATION_IN_HOURS": "التقدير بالساعات", - "ESTIMATION_IN_STORY_POINTS": "التقدير بنقاط القصة", - "PROOF_OF_COMPLETION": "إثبات الإتمام", - "LINKED_ISSUES": "القضايا المرتبطة", - "COMMENTS": "التعليقات", - "HISTORY": "التاريخ", - "ACCEPTANCE_CRITERIA": "معايير القبول", - "DRAFT_ISSUES": "القضايا المسودة", - "AUTO_CLOSE_ISSUE": "إغلاق القضية تلقائيًا", - "AUTO_ARCHIVE_ISSUE": "أرشفة القضية تلقائيًا", - "AUTO_STATUS": "الحالة التلقائية", - "VERSIONS": "الإصدارات", - "LIST_OF_VERSONS": "قائمة الإصدارات", - "ISSUETYPE": "أنواع القضايا", - "LIST_OF_ISSUES": "قائمة القضايا", - "RELATED_ISSUE_TYPE": "أنواع القضايا ذات الصلة", - "LIST_OF_RELATED_TYPE": "قائمة الأنواع ذات الصلة", - "INITIAL": "البداية", - "COPY_NUMBER": "رقم النسخة", - "IN_PROGRESS": "قيد التقدم", - "FINAL": "النهائي", - "DISPOSE_TEAM": "أنت على وشك التخلص من الفريق؟", - "QUIT_TEAM": "أنت على وشك مغادرة الفريق؟", - "TEAM_COLOR": "لون الفريق", - "TEAM_SIZE": "حجم الفريق", - "EMOJI": "الإيموجي", - "ISSUES_HEADING_TITLE": "إعدادات القضايا", - - "TRACK_TIME": "تتبع الوقت", - "ESTIMATE_ISSUE": "تقدير القضية", - "EPICS_CREATE_CLOSE": "إنشاء/إغلاق الملاحم", - "ISSUE_CREATE_CLOSE": "إنشاء/إغلاق القضية", - "ISSUE_ASSIGN_UNASSIGN": "تعيين/إلغاء تعيين القضية", - "INVITE_MEMBERS": "دعوة أعضاء", - "REMOVE_MEMBERS": "إزالة أعضاء", - "HANDLE_REQUESTS": "التعامل مع الطلبات", - "ROLES_POSITIONS_CHANGE": "تغيير الأدوار/المناصب", - "VIEW_DETAILS": "عرض التفاصيل", - - "NO_INVITATIONS": "لا توجد دعوات حاليًا!", - "NO_MEMBERS": "لا يوجد أعضاء حاليًا!" - }, - "invite": { - "HEADING_TITLE": "دعوة عضو لفريقك", - "HEADING_DESCRIPTION": "إرسال دعوة إلى عضو الفريق عبر البريد الإلكتروني", - "TEAM_MEMBER_EMAIL": "البريد الإلكتروني لعضو الفريق", - "TEAM_MEMBER_FULLNAME": "الاسم الكامل لعضو الفريق", - "SEND_INVITE": "إرسال الدعوة", - "ERROR_WHILE_ACCEPTING_INVITATION": "حدث خطأ أثناء قبول الدعوة", - "ERROR_WHILE_REJECTING_INVITATION": "حدث خطأ أثناء رفض الدعوة", - "INVITE_LABEL_SEND": "إرسال دعوة", - "invitationTable": { - "NAME_AND_EMAIL": "الاسم والبريد الإلكتروني", - "POSITION": "المنصب", - "DATE_AND_TIME_REQUEST": "التاريخ والوقت للطلب", - "CV_OR_ATTACHMENT": "المرفقات" - } - }, - "permissions": { - "SELECT_ROLES": "تحديد الأدوار" - }, - - "unauthorized": { - "TITLE": "غير مصرح", - "HEADING_TITLE": "أنت غير مفوض لدخول هذه الصفحة", - "HEADING_DESCRIPTION": "نعتذر عن الإزعاج، لكن غير مسموح لك بالدخول إلى هذه الصفحة. إذا كنت تعتقد أن هذا خطأ. الرجاء تسجيل الدخول." - }, - "page404": { - "HEADING_TITLE": "غير موجود", - "HEADING_DESCRIPTION": "المورد الذي تبحث عنه غير موجود!", - "LINK_LABEL": "الذهاب إلى الصفحة الرئيسية" - }, - "offline": { - "HEADING_TITLE": "انقطاع الشبكة!", - "HEADING_DESCRIPTION": "أنت غير متصل حاليًا، يرجى التحقق من اتصالك بالإنترنت..." - }, - "error": { - "TITLE": "خطأ", - "HEADING_TITLE": "هناك خطأ ما ", - "HEADING_DESCRIPTION": "إذا استمرت المشكلة، قم بإرسال إشارة استغاثة إلى فريق الدعم لدينا." - }, - "maintenance": { - "HEADING_TITLE": "نحن تحت الصيانة", - "HEADING_DESCRIPTION": "نقوم حاليًا بتحديث موقعنا الإلكتروني لخدمتك بشكل أفضل. يرجى التحقق مرة أخرى في وقت لاحق." - } - }, - - "timer": { - "START_TIMER": "يرجى تحديد أو إنشاء مهمة جديدة لبدء تتبع الوقت", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "توقف المؤقت", - "STOPPED_TIMER_TOAST_DESCRIPTION": "توقف المؤقت بسبب التبديل بين الفرق" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "التقدير" - }, - "DAY_LIST": [{ "title": "7 أيام" }, { "title": "14 يوم" }] - }, - - "task": { - "TITLE": "المهمة", - "ASSIGN_NEW_TASK": "تعيين مهمة جديدة", - "ASSIGNED_BY": "تم التعيين بواسطة", - "NO_ONE_FOR_TASK": "لم يتم تعيين أحد لهذه المهمة", - "WORKED_TODAY_ON_TASK_TOOLTIP": "عمل اليوم على هذه المهمة لمدة", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "عمل على هذه المهمة لمدة إجمالية", - "WORKED_TODAY_ON_ALL_TOOLTIP": "عمل اليوم على الكل", - "TASKS_FOR_TOOLTIP": "المهام ل", - "taskLabel": { - "WORK_LABEL": "عمل", - "TASK_ASSIGNED": "معينة", - "TASK_UNASSIGNED": "غير معينة", - "BUTTON_LABEL": "تعيين مهمة" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "يعرض هذا التبويب جميع المهام التي بدأت العمل عليها", - "ASSIGNED_DESCRIPTION": "يعرض هذا التبويب جميع المهام المعينة لك", - "UNASSIGNED_DESCRIPTION": "يعرض هذا التبويب جميع المهام غير المعينة لك", - "NO_TASK_USER_ASSIGNED": "لم يتم تعيين أحد لهذه المهمة" - }, - "taskTableHead": { - "TASK_NAME": "الاسم", - "TASK_STATUS": "الحالة", - "TASK_WORK": { - "TITLE": "عمل على", - "DESCRIPTION": "المهمة", - "LABEL": "عمل على المهمة" - }, - "TASK_TIME": "التقدير", - "TOTAL_WORK": { - "TITLE": "إجمالي العمل", - "DESCRIPTION": "اليوم", - "LABEL": "إجمالي العمل اليوم" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "كم ساعة عمل الموظف اليوم والإجمالي في المهمة", - "WORKED_ON_TASK_HEADER_TOOLTIP": "كم ساعة عمل الموظف اليوم في جميع المهام للفريق المحدد" - }, - "CONFIRM_CLOSE_TASK": "يرجى تأكيد رغبتك في إغلاق المهمة" - }, - - "form": { - "NAME_PLACEHOLDER": "أدخل اسمك", - "FIRST_NAME_PLACEHOLDER": "الاسم الأول", - "LAST_NAME_PLACEHOLDER": "اسم العائلة", - "EMAIL_PLACEHOLDER": "أدخل عنوان بريدك الإلكتروني", - "PHONE_PLACEHOLDER": "رقم الهاتف", - - "ISSUE_NAME_PLACEHOLDER": "اسم القضية", - - "TEAM_NAME_PLACEHOLDER": "يرجى إدخال اسم فريقك", - "TASK_INPUT_PLACEHOLDER": "على ماذا تعمل؟", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "اسم عضو الفريق", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "عنوان بريد عضو الفريق الإلكتروني", - "COMPLETION_DESCRIPTION": "اكتب الوصف", - "UPLOAD_FILES": "تحميل الملفات", - "ATTACHMENT_FILE": "ملفات مرفقة", - "ADD_COMMENT": "أضف تعليقًا هنا", - "SET_THEME": "تعيين الموضوع", - "CHANGE_AVATAR": "تغيير الصورة الرمزية", - "SELECT_TEAM_SIZE": "حدد حجم الفريق", - "INVALID_ALLOWED_CHARACTER": "قيمة غير صالحة لـ allowedCharacters. استخدم أبجدي أو رقمي أو أبجدي رقمي" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "جميع الحقوق محفوظة.", - "COPY_RIGHT1": "© {{date}}-حاضر،", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "إيفر ش.م.م.", - "COMPANY_NAME": "إيفر ش.م.م.", - "TERMS": "شروط الخدمة", - "PRIVACY_POLICY": "سياسة الخصوصية", - "COOKIES": "سياسة ملفات تعريف الارتباط", - "BY": "من طرف" - } - }, - - "errors": { - "NETWORK_ISSUE": "مشكلة في الشبكة، يرجى إعادة المحاولة لاحقًا", - "ERROR_WHILE_VERIFY_CODE": "حدث خطأ أثناء التحقق من الرمز.", - "LENGTH_NUMBER_ERROR": "يجب أن يكون الطول رقمًا وأكبر من 0", - "INVALID_ALLOWED_CHARACTER": "قيمة غير صالحة لـ allowedCharacters. استخدم أبجدي أو رقمي أو أبجدي رقمي ", - "VALID_EMAIL": "يرجى إدخال بريد إلكتروني صالح" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "اضغط إدخال للتحقق" - }, - "team": { - "BACK_LABEL": "العودة إلى الفريق", - "PUBLIC_TEAM": "فريق عام", - "PRIVATE_TEAM": "فريق خاص", - "creation": { - "NEW": "إنشاء فريق جديد" - } - }, - "links": { - "common": { - "TASKS": "المهام", - "TEAM": "الفريق", - "SETTINGS": "الإعدادات" - } - } -} diff --git a/apps/web/public/locales/bg/common.json b/apps/web/public/locales/bg/common.json deleted file mode 100644 index 6307c39ae..000000000 --- a/apps/web/public/locales/bg/common.json +++ /dev/null @@ -1,579 +0,0 @@ -{ - "TITLE": "Ever Отбори", - "common": { - "ACCEPT": "Приемам", - "ACCEPTED": "Приет", - "REJECT": "Отхвърлям", - "REJECTED": "Отхвърлен", - "VERIFY": "провери", - "INVITE": "Покани", - "INVITED": "Поканен", - "EXPIRE": "Изтича", - "EXPIRED": "Изтекъл", - "REQUEST": "Заявка", - "REQUESTED": "Заявен", - "LABEL": "Етикет", - "LABELS": "Етикети", - "POSITION": "Позиция", - "ROLES": "Роли", - "JOIN_OR_LEFT": "Присъедини се / Напусна", - "PLEASE": "Моля", - "HERE": "тук", - "PEOPLE": "Хора", - "COLLABORATE": "Сътрудничество", - "NO": "Не", - "ONLY_ME": "Само аз", - "YES": "Да", - "BASIC": "Основен", - "DELETE": "Изтриване", - "MEET": "Среща", - "BOARD": "Дъска", - "SECURITY_CODE": "Код за сигурност", - "CONFIRM": "Потвърди", - "YOUR_EMAIL": "вашият имейл", - "CONTINUE": "Продължи", - "EDIT_TASK": "Редактиране на задача", - "ASSIGN_TASK": "Възлагане на задача", - "ASSIGN_TASK_TO": "Възлагане на задача", - "REMOVE_ACCOUNT": "Премахване на профил", - "REMOVE_EVERYWHERE": "Премахване навсякъде", - "DELETE_ACCOUNT": "Изтриване на този профил", - "UNASSIGN_TASK": "Отмяна на възлагането на задача", - "MAKE_A_MANAGER": "Направи мениджър", - "UNMAKE_A_MANAGER": "Премахни мениджъра", - "TRANSFERT_OWNERSHIP": "Прехвърляне на собствеността", - "TRANSFERT_OWNERSHIP_TO": "Прехвърляне на пълната собственост на отбора към друг потребител", - "REMOVE": "Премахване", - "REMOVE_TEAM": "Премахване на отбор", - "DISPOSE_TEAM": "Ликвидиране на отбор", - "QUIT_TEAM": "Напускане на отбора", - "QUIT": "Напускане", - "STATUSES": "Статуси", - "RESEND_INVITATION": "Повторно изпращане на поканата", - "TODAY": "Днес", - "TOTAL": "Общо", - "ESTIMATED": "Предвидено", - "ESTIMATE": "Предвиждане", - "STATUS": "Статус", - "NAME": "Име", - "TASK": "Задача", - "MY_TASKS": "Моите задачи", - "ENABLED": "активирайте", - "DISABLED": "деактивирайте", - "WORKED_ON_TASK": "Работено по задача", - "TOTAL_WORKED_TODAY": "Общо работено днес", - "TOTAL_WORK": "Работа днес", - "OPEN": "Отворен", - "NOW": "Сега", - "NEXT": "Следващ", - "PREV": "Предишен", - "DETAILS": "Детайли", - "CLOSED": "Затворен", - "CLOSE": "Затваряне", - "USER_NOT_FOUND": "Не са намерени потребители.", - "TASK_TITTLE": "Заглавие на задачата", - "PUBLIC_TASK": "Тази задача е публична", - "PRIVATE_TASK": "Тази задача е частна", - "PUBLIC_TASK_LABEL": "Направи я публична", - "PRIVATE_TASK_LABEL": "Направи я частна", - "CREATE_TASK": "Създаване на нова задача", - "LINK_TASK": "Избери свързан проблем", - "LINK": "Връзка", - "LINKS": "Връзки", - "SHOW": "Покажи", - "ADD_LINK": "Добави връзки", - "COMMENT": "Коментар", - "DESCRIPTION": "Описание", - "CHILD_ISSUE_TASK": "Избери детски проблем", - "CREATE_TEAM": "Създаване на нов отбор", - "VERIFY_ACCOUNT_MSG": "Моля, потвърдете профила си, преди да започнете да използвате приложението", - "CREATE_ROLE": "Създаване на роля", - "CREATE": "Създаване", - "CREATE_ISSUE": "Създаване на проблем", - "NEW_ISSUE": "Нов проблем", - "ACTIVATED": "Активиран", - "DEACTIVATED": "Деактивиран", - "PERIOD": "Период", - "NEW": "Нов", - "CREATE_VERSION": "Създаване на версия", - "VERSION": "Версия", - "LOADING": "Зареждане", - "TOTAL_TIME": "Общо време", - "LAST_24_HOURS": "Последните 24 часа", - "WORKED": "Работено", - "ASSIGNED": "Възложено", - "SELECT_STATUS": "Избери статус", - "SELECT_ISSUE": "Избери проблем", - "UNASSIGNED": "Невъзложено", - "TASK_DETAILS": "Детайли за задачата", - "TYPE_SOMETHING": "Напиши нещо", - "FILTER": "Филтър", - "APPLY": "Приложи", - "RESET": "Нулиране", - "LOGOUT": "Изход", - "THEMES": "Теми", - "3D_MODE": "3D режим", - "DARK_MODE": "Тъмен режим", - "SETTINGS": "Настройки", - "PERSONAL": "Лични", - "USE_SETTING": "Използвай настройка", - "TEAM": "Отбор", - "MY_TEAM": "Моят отбор", - "FULL_NAME": "Пълно име", - "USER_AVATAR": "Потребителски аватар", - "CONTACT": "Контакт", - "THEME": "Тема", - "TIME_ZONE": "Часова зона", - "EDIT": "Редактиране", - "SAVE": "Запазване", - "LANGUAGE": "Език", - "DETECT": "Открий", - "TRANSFER": "Прехвърляне", - "TRANSFER_TEAM": "Прехвърляне на отбор", - "TEAM_MEMBERS": "Членове на отбора", - "NO_TEAM": "Създайте собствен отбор или се присъединете към съществуващ", - "NO_TEAM_SUB": "Прекрасно е да се работи с други, затова създайте екип и поканете всички за сътрудничество!", - "NO_TEAM_TOOLTIP": "You need to verify your email address", - "CANCEL": "Отказ", - "DISCARD": "Изхвърляне", - "EXISTING_MEMBER": "Вече член", - "NEW_MEMBER": "Стани член", - "BACK": "Назад", - "JOIN_REQUEST": "Искане за присъединяване", - "PERMISSION": "Разрешение", - "SEARCH": "Търсене", - "ADD_PARENT": "Добави родител", - "BLOCKS": "Блокира", - "CLONES": "Клонира", - "DUPLICATES": "Дублира", - "IS_BLOCKED_BY": "Е блокирано от", - "IS_CLONED_BY": "Е клонирано от", - "IS_DUPLICATED_BY": "Е дублирано от", - "RELATES_TO": "Свързано с", - "CHANGE_PARENT": "Промени родител", - "RELATED_ISSUES": "Свързани проблеми", - "CHILD_ISSUES": "Детски проблеми", - "REOPEN": "Отваряне отново", - "NO_TASKS": "Няма задачи", - "FULL_WIDTH": "Пълна ширина", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Моля спрете таймера преди да промените задачата", - - "COLLABORATE_DIALOG_TITLE": "Стартиране на сътрудничество", - "COLLABORATE_DIALOG_SUB_TITLE": "Поканете член(ове) и започнете да си сътрудничите", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Стартиране на среща или сътрудничество с дъска", - "ISSUE_TYPE": "Тип проблем", - "ACTIVITY": "Дейност", - "FILTER_ALL": "Всички", - "FILTER_COMMENTS": "Коментари", - "FILTER_HISTORY": "История", - "FILTER_UNSUBSCRIBE": "Отпиши се", - - "KEYBOARD_SHORTCUTS": "Клавишни комбинации", - "GITHUB_LOADING_TEXT": "В момента инсталираме вашия GitHub интеграция, изчакайте...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Автоматично синхронизирайте задачите в приложението си за безпроблемни и ефективни актуализации.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Синхронизирайте задачите избирателно, като ги свържете с конкретен етикет.", - "GITHUB_AUTO_SYNC_LABEL": "Изберете етикет за автоматична синхронизация" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "В момента работим върху синхронизирането в реално време, моля, проверете тази функция по-късно.", - "ALERT_DELETE_ACCOUNT": "Профилът ще бъде премахнат от всички отбори, освен където сте само мениджър", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Вашият профил ще бъде изтрит завинаги с премахване от всички отбори", - "ALERT_REMOVE_TEAM": "Отборът ще бъде премахнат напълно от системата и членовете на отбора ще загубят достъп", - "ALERT_REMOVE_ALL_DATA": "Всички данни за акаунти ще бъдат премахнати от всички екипи, в които сте САМО един съществуващ мениджър.", - "ALERT_QUIT_TEAM": "Ще напуснете отбора" - }, - "pages": { - "home": { - "BREADCRUMB": ["Табло"], - "SENT_EMAIL_VERIFICATION": "Потвърждаващият код беше изпратен до имейла ви", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "Трябва да", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " вашия имейл адрес. Потвърждаващият код вече би трябвало да е изпратен до имейла ви, но свободно натиснете", - "SENT_EMAIL_VERIFICATION_RESEND": "за да изпратите кода отново, ако не сте го получили.", - "INVITATIONS": "Поканени сте да се присъедините към", - "CONFIRM_ACCEPT_INVITATION": "Сигурни ли сте, че искате да приемете поканата?", - "CONFIRM_REJECT_INVITATION": "Сигурни ли сте, че искате да отхвърлите поканата?", - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "How many hours employee worked for total and today on task", - "WORKED_ON_TASK_HEADER_TOOLTIP": "How many hours employee worked today on all tasks for selected Team" - }, - - "profile": { - "BREADCRUMB": ["Задачи за член"] - }, - - "taskDetails": { - "BREADCRUMB": ["Детайли за задачата"], - - "DESCRIPTION": "Описания", - "ADD_DESCRIPTION": "Добави описание тук", - "TYPE_OF_ISSUE": "Тип проблем", - "CREATOR": "Създател", - "ASSIGNEES": "Отговорници", - "START_DATE": "Начална дата", - "DUE_DATE": "Краен срок", - "DAYS_REMAINING": "Оставащи дни", - "VERSION": "Версия", - "EPIC": "Епичен", - "STATUS": "Статус", - "LABEL": "Етикет", - "LABELS": "Етикети", - "SIZE": "Големина", - "PRIORITY": "Приоритет", - "ESTIMATIONS": "Предвиждания", - "PROGRESS": "Напредък", - "TOTAL_TIME": "Общо време", - "TIME_TODAY": "Време днес", - "TOTAL_GROUP_TIME": "Общо групово време", - "TIME_REMAINING": "Оставащо време", - "CREATED": "Създадено", - "UPDATED": "Обновено", - "RESOLVED": "Разрешено", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "Не можахме да обновим заглавието на задачата.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "Заглавието на задачата не може да надвишава 255 символа.", - - "TASK_IS_ALREADY_EPIC": "Епичният тип задача не може да бъде променен.", - "TASK_HAS_PARENT": "Типът задача не може да бъде променен, тъй като задачата вече има родител." - }, - - "auth": { - "SEND_CODE": "изпрати код", - "JOIN": "Присъединяване", - "UNRECEIVED_CODE": "Не получихте код?", - "JOIN_TEAM": "Присъединяване към отбор", - "INPUT_INVITE_CODE": "Въведете код за покана.", - "INPUT_INVITE_CODE_DESC": "Въведете кода за покана, който изпратихме до имейла ви.", - "INVALID_INVITE_CODE_MESSAGE": "Невалиден код", - "WELCOME_TEAMS": "Добре дошли в Ever Teams", - - "COVER_TITLE": "Следете напредъка на работата на отборите си в реално време!", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Вход", - "SELECT_WORKSPACE": "Избери работно пространство", - "ENTER_EMAIL": "Въведи имейл", - "WORKSPACES_NOT_FOUND": "Работни пространства не са намерени" - }, - "authPasscode": { - "HEADING_TITLE": "Присъединяване към съществуващ отбор", - "HEADING_DESCRIPTION": "Моля, въведете имейл и покана за присъединяване към съществуващ отбор." - }, - "authLogin": { - "HEADING_TITLE": "Вход в отбора", - - "HEADING_DESCRIPTION": "Моля, въведете имейл и покана за вход.", - - "WORKSPACE": "Работно пространство", - "HEADING_WORKSPACE_LINE1": "Имейлът, свързан с множество работни пространства,", - "HEADING_WORKSPACE_LINE2": "моля, изберете едно за продължаване" - }, - "authTeam": { - "HEADING_TITLE": "Създаване на нов отбор", - "HEADING_DESCRIPTION": "Моля, въведете данните на вашия отбор, за да създадете нов отбор.", - "LOADING_TEXT": "В момента създаваме новото ви работно място, изчакайте...", - "VERIFY_EMAIL_LOADING_TEXT": "Проверяваме имейла ви, изчакайте...", - - "INPUT_TEAM_NAME": "Въведете име на отбора", - "JOIN_EXISTING_TEAM": "Присъединявате се към съществуващ отбор?", - "CREATE_FIRST_TEAM": "Създайте първия си отбор", - "CREATE_TEAM": "Създаване на отбор" - }, - "settings": { - "BREADCRUMB": [{ "title": "Табло", "href": "/" }, "Настройки"], - "DANDER_ZONE": "Опасна зона", - "HEADING_DESCRIPTION": "Настройване и управление на личното ви табло тук", - "ARE_YOU_SURE_TO_DELETE_USER": "Сигурни ли сте, че искате да изтриете този потребител?" - }, - "settingsPersonal": { - "HEADING_TITLE": "Основни настройки", - "emailNotValid": "Моля, въведете валиден имейл", - "phoneNotValid": "Моля, въведете валиден телефонен номер", - "WORK_SCHEDULE": "Работен график", - "SUBSCRIPTION": "Абонамент", - "TIMEZONE_SEARCH_PLACEHOLDER": "Вашата часова зона", - "ABOUT_TO_CHANGE_EMAIL": "Ще промените имейл", - "ABOUT_TO_DELETE_ACCOUNT": "Ще изтриете профила си?", - "DATA_SYNCHRONIZATION": "Синхронизиране на данни", - "ABOUT_TO_REMOVE_ACCOUNT": "Ще премахнете профила си?", - "ABOUT_TO_REMOVE_FROM_ALL_TEAMS": "You're about to be removed from all teams, unless you're the only manager ?", - "ABOUT_TO_DELETE_ALL_ACCOUNT_DATA": "You are about to Delete your account and all your data ?" - }, - "settingsTeam": { - "HEADING_TITLE": "Основни настройки", - - "MEMBER_HEADING_TITLE": "Членове", - "PRIORITIES_HEADING": "Приоритети", - "NOTIFICATION_HEADING": "Известия", - "SIZES_HEADING": "Размери", - "TEAM_NAME": "Име на отбора", - "TEAM_TYPE": "Тип отбор", - "TIME_TRACKING": "Проследяване на времето", - - "ADD_NEW_MEMBER": "Добави нов член", - "MANAGE_ASSIGNEES": "Управление на отговорници", - - "SEARCH_MEMBER": "Търсене на член", - "TASK_STATUSES": "Статуси на задачи", - "TASK_PRIORITIES": "Приоритети на задачи", - "TASK_SIZES": "Размери на задачи", - "TASK_LABELS": "Етикети на задачи", - "ISSUE_TYPES": "Типове проблеми", - "RELATED_TYPE": "Свързан тип", - - "INVITATION_HEADING_TITLE": "Покани", - "CREATE_NEW_STATUSES": "Създаване на нови статуси", - "CREATE_NEW_STATUS": "Създаване на нов статус", - "CREATE_NEW_VERSION": "Създаване на нова версия", - "CREATE_NEW_PRIORITIES": "Създаване на нови приоритети", - "CREATE_NEW_PRIORITY": "Създаване на нов приоритет", - "CREATE_NEW_SIZES": "Създаване на нови размери", - "CREATE_NEW_SIZE": "Създаване на нов размер", - "CREATE_NEW_LABELS": "Създаване на нови етикети", - "CREATE_NEW_LABEL": "Създаване на нов етикет", - "CREATE_NEW_ISSUE_TYPES": "Създаване на нови проблеми", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Скрий лична информация за членовете", - "POSITION_CUSTOM": "Персонализирани позиции", - "INVITATION_EXPIRATION": "Изтичане на поканата", - "NOTIFY_IF": "Извести ако", - "TEAM_REQUEST": "Заявка за отбор", - "WORK_SCHEDULE": "Работен график", - "MEMBER_AND_ROLES": "Членове и роли", - - "INTEGRATIONS": "Интеграции", - "DANDER_ZONES": "Опасни зони", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Свържете се с GitHub и започнете да синхронизирате проблеми от GitHub с отбора си", - "SELECT_REPOSITORY": "Избери хранилище", - - "INSTALL": "Инсталиране", - - "LIST_OF_STATUSES": "Списък със статуси", - "LIST_OF_PRIORITIES": "Списък с приоритети", - "LIST_OF_SIZES": "Списък с размери", - "LIST_OF_LABELS": "Списък с етикети", - "LIST_OF_ISSUES_TYPE": "Списък с проблеми", - - "GENERAL": "Общи", - "SOUND": "Звук", - "EMAIL": "Имейл", - - "USERS": "Потребители", - "TASKS": "Задачи", - "SYSTEM": "Система", - "SECURITY": "Сигурност", - "INAPP": "В приложението", - "NOTIFICATION_HEADING_TITLE": "Настройки за известия", - "ISSUE_HEADING_TITLE": "Настройки за проблеми", - - "TASK_PRIVACY": "Поверителност на задачата", - "MULTIPLE_ASSIGNEES": "Множество отговорници", - "MANUAL_TIME": "Ръчно време", - "GROUP_ESTIMATION": "Групова оценка", - "ESTIMATION_IN_HOURS": "Оценка в часове", - "ESTIMATION_IN_STORY_POINTS": "Оценка в точки", - "PROOF_OF_COMPLETION": "Доказателство за завършване", - "LINKED_ISSUES": "Свързани проблеми", - - "COMMENTS": "Коментари", - "HISTORY": "История", - "ACCEPTANCE_CRITERIA": "Критерии за приемане", - "DRAFT_ISSUES": "Чернови на проблеми", - "AUTO_CLOSE_ISSUE": "Автоматично затваряне на проблем", - "AUTO_ARCHIVE_ISSUE": "Автоматично архивиране на проблем", - "AUTO_STATUS": "Автоматичен статус", - "VERSIONS": "Версии", - "LIST_OF_VERSONS": "Списък с версии", - "ISSUETYPE": "Типове проблеми", - "LIST_OF_ISSUES": "Списък с проблеми", - "RELATED_ISSUE_TYPE": "Свързани типове проблеми", - "LIST_OF_RELATED_TYPE": "Списък със свързани типове", - "INITIAL": "Начален", - "COPY_NUMBER": "Копие номер", - "IN_PROGRESS": "В процес", - "FINAL": "Краен", - "DISPOSE_TEAM": "Ще ликвидирате отбора?", - "QUIT_TEAM": "Ще напуснете отбора?", - "TEAM_COLOR": "Цвят на отбора", - "TEAM_SIZE": "Размер на отбора", - "EMOJI": "Емотикон", - "ISSUES_HEADING_TITLE": "Настройки за проблеми", - - "TRACK_TIME": "Проследяване на времето", - "ESTIMATE_ISSUE": "Оценка на проблем", - "EPICS_CREATE_CLOSE": "Създаване/затваряне на епични задачи", - "ISSUE_CREATE_CLOSE": "Създаване/затваряне на проблем", - - "ISSUE_ASSIGN_UNASSIGN": "Възлагане/отмяна на възлагане на проблем", - "INVITE_MEMBERS": "Покана за членове", - "REMOVE_MEMBERS": "Премахване на членове", - "HANDLE_REQUESTS": "Обработване на заявки", - "ROLES_POSITIONS_CHANGE": "Промяна на роли/позиции", - "VIEW_DETAILS": "Преглед на детайли", - - "NO_INVITATIONS": "В момента няма покани!", - "NO_MEMBERS": "В момента няма членове!" - }, - "invite": { - "HEADING_TITLE": "Поканете член в отбора ви", - "HEADING_DESCRIPTION": "Изпратете покана до член на отбора по имейл", - "TEAM_MEMBER_EMAIL": "Имейл на члена на отбора", - "TEAM_MEMBER_FULLNAME": "Цялото име на члена на отбора", - "SEND_INVITE": "Изпрати покана", - "ERROR_WHILE_ACCEPTING_INVITATION": "Грешка при приемане на поканата", - "ERROR_WHILE_REJECTING_INVITATION": "Грешка при отхвърляне на поканата", - "INVITE_LABEL_SEND": "Изпрати покана", - "invitationTable": { - "NAME_AND_EMAIL": "Име и имейл", - "POSITION": "Позиция", - "DATE_AND_TIME_REQUEST": "Дата и час на искането", - "CV_OR_ATTACHMENT": "Автобиография / прикачен файл" - } - }, - "permissions": { - "SELECT_ROLES": "Избери роли" - }, - "unauthorized": { - "TITLE": "Неразрешено", - "HEADING_TITLE": "Нямате право за достъп до тази страница!", - "HEADING_DESCRIPTION": "Извиняваме се за неудобството, но не сте оторизирани за достъп до тази страница. Ако смятате, че това е грешка. Моля влезте." - }, - "page404": { - "HEADING_TITLE": "Ненамерено", - "HEADING_DESCRIPTION": "Търсеният ресурс не беше намерен!", - "LINK_LABEL": "Отиди на началната страница" - }, - "offline": { - "HEADING_TITLE": "Мрежата е прекъсната!", - "HEADING_DESCRIPTION": "В момента сте извън линия, моля, проверете интернет връзката си..." - }, - "error": { - "TITLE": "грешка!", - "HEADING_TITLE": "Нещо се обърка !", - "HEADING_DESCRIPTION": "Ако проблемът продължава, изпратете сигнал за помощ до нашия екип за поддръжка." - }, - "maintenance": { - "HEADING_TITLE": "Ние сме в процес на поддръжка", - "HEADING_DESCRIPTION": "В момента актуализираме нашия уебсайт, за да ви служим по-добре. Моля, проверете отново по-късно." - } - }, - - "timer": { - "START_TIMER": "Моля, изберете или създайте нова задача, за да започнете да проследявате времето", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Таймерът спря", - - "STOPPED_TIMER_TOAST_DESCRIPTION": "Таймерът спря поради смяна на отбора" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Оценка" - }, - "DAY_LIST": [{ "title": "7 дни" }, { "title": "14 дни" }] - }, - - "task": { - "TITLE": "Задача", - "ASSIGN_NEW_TASK": "Възлагане на нова задача", - "ASSIGNED_BY": "Възложено от", - "NO_ONE_FOR_TASK": "Няма отговорник за тази задача", - "WORKED_TODAY_ON_TASK_TOOLTIP": "работено днес по тази задача за", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "работено по тази задача общо за", - "WORKED_TODAY_ON_ALL_TOOLTIP": "работено днес по всички", - "TASKS_FOR_TOOLTIP": "задачи за", - - "taskLabel": { - "WORK_LABEL": "Работено", - "TASK_ASSIGNED": "Възложено", - "TASK_UNASSIGNED": "Невъзложено", - "BUTTON_LABEL": "Възлагане на задача" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "Тази раздел показва всички задачи, по които сте започнали да работите", - "ASSIGNED_DESCRIPTION": "Тази раздел показва всички задачи, които са възложени на вас", - "UNASSIGNED_DESCRIPTION": "Тази раздел показва всички задачи, които не са възложени на вас", - "NO_TASK_USER_ASSIGNED": "Никой не е възложен на тази задача" - }, - "taskTableHead": { - "TASK_NAME": "Име", - "TASK_STATUS": "Статус", - "TASK_WORK": { - "TITLE": "Работено по", - "DESCRIPTION": "Задача", - "LABEL": "Работено по задача" - }, - "TASK_TIME": "Оценка", - "TOTAL_WORK": { - "TITLE": "Общо работено", - "DESCRIPTION": "Днес", - "LABEL": "Общо работено днес" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Колко часа работил служителят общо и днес по задача", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Колко часа е работил служителят днес по всички задачи за избрания екип" - }, - "CONFIRM_CLOSE_TASK": "Моля, потвърдете ако искате да затворите задачата" - }, - - "form": { - "NAME_PLACEHOLDER": "Въведете името си", - "FIRST_NAME_PLACEHOLDER": "Собствено име", - "LAST_NAME_PLACEHOLDER": "Фамилия", - "EMAIL_PLACEHOLDER": "Въведете имейл адреса си", - "PHONE_PLACEHOLDER": "Телефонен номер", - - "ISSUE_NAME_PLACEHOLDER": "Име на проблема", - - "TEAM_NAME_PLACEHOLDER": "Моля въведете име на отбора", - "TASK_INPUT_PLACEHOLDER": "По какво работите?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "Име на члена на отбора", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "Имейл адрес на члена на отбора", - "COMPLETION_DESCRIPTION": "Напишете описание", - "UPLOAD_FILES": "Качване на файлове", - "ATTACHMENT_FILE": "Прикачени файлове", - "ADD_COMMENT": "Добавяне на коментар тук", - "SET_THEME": "Задаване на тема", - "CHANGE_AVATAR": "Смяна на аватар", - "SELECT_TEAM_SIZE": "Изберете размер на отбора", - "INVALID_ALLOWED_CHARACTER": "Невалидна стойност за allowedCharacters. Използвайте alpha, numeric или alphanumeric" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "Всички права запазени.", - "COPY_RIGHT1": "© {{date}}-настояще,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Общи условия", - "PRIVACY_POLICY": "Политика за поверителност", - "COOKIES": "Политика за бисквитки", - "BY": "От" - } - }, - - "errors": { - "NETWORK_ISSUE": "проблем с мрежата, моля опитайте по-късно", - "ERROR_WHILE_VERIFY_CODE": "Грешка при потвърждаване на кода.", - "LENGTH_NUMBER_ERROR": "Дължината трябва да е число и по-голяма от 0", - "INVALID_ALLOWED_CHARACTER": "Невалидна стойност за allowedCharacters. Използвайте alpha, numeric или alphanumeric", - "VALID_EMAIL": "Моля, въведете валиден имейл" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Натиснете Enter за валидиране" - }, - "team": { - "BACK_LABEL": "Обратно към отбора", - "PUBLIC_TEAM": "Публичен отбор", - "PRIVATE_TEAM": "Частен отбор", - "creation": { - "NEW": "Създаване на нов отбор" - } - }, - - "links": { - "common": { - "TASKS": "Задачи", - "TEAM": "Отбор", - "SETTINGS": "Настройки" - } - } -} diff --git a/apps/web/public/locales/de/common.json b/apps/web/public/locales/de/common.json deleted file mode 100644 index dec02314b..000000000 --- a/apps/web/public/locales/de/common.json +++ /dev/null @@ -1,566 +0,0 @@ -{ - "TITLE": "Ever Teams", - "common": { - "ACCEPT": "Akzeptieren", - "ACCEPTED": "Akzeptiert", - "REJECT": "Ablehnen", - "REJECTED": "Abgelehnt", - "VERIFY": "Verifizieren", - "INVITE": "Einladen", - "INVITED": "Eingeladen", - "EXPIRE": "Ablaufen", - "EXPIRED": "Abgelaufen", - "REQUEST": "Anfrage", - "REQUESTED": "Angefragt", - "LABEL": "Label", - "LABELS": "Labels", - "POSITION": "Position", - "ROLES": "Rollen", - "JOIN_OR_LEFT": "Beigetreten / Verlassen", - "PLEASE": "Bitte", - "HERE": "Hier", - "PEOPLE": "Personen", - "COLLABORATE": "Zusammenarbeiten", - "NO": "Nein", - "ONLY_ME": "Nur ich", - "YES": "Ja", - "BASIC": "Basis", - "DELETE": "Löschen", - "MEET": "Treffen", - "BOARD": "Board", - "SECURITY_CODE": "Sicherheitscode", - "CONFIRM": "Bestätigen", - "YOUR_EMAIL": "deine E-Mail", - "CONTINUE": "Weiter", - "EDIT_TASK": "Aufgabe bearbeiten", - "ASSIGN_TASK": "Aufgabe zuweisen", - "ASSIGN_TASK_TO": "Aufgabe zuweisen an", - "REMOVE_ACCOUNT": "Konto entfernen", - "REMOVE_EVERYWHERE": "Überall entfernen", - "DELETE_ACCOUNT": "Dieses Konto löschen", - "UNASSIGN_TASK": "Aufgabe entziehen", - "MAKE_A_MANAGER": "Manager erstellen", - "UNMAKE_A_MANAGER": "Manager entfernen", - "TRANSFERT_OWNERSHIP": "Eigentümerschaft übertragen", - "TRANSFERT_OWNERSHIP_TO": "Vollständige Eigentümerschaft des Teams auf einen anderen Benutzer übertragen", - "REMOVE": "Entfernen", - "REMOVE_TEAM": "Team entfernen", - "DISPOSE_TEAM": "Team auflösen", - "QUIT_TEAM": "Team verlassen", - "QUIT": "Verlassen", - "STATUSES": "Status", - "RESEND_INVITATION": "Einladung erneut senden", - "TODAY": "Heute", - "TOTAL": "Gesamt", - "ESTIMATED": "Geschätzt", - "ESTIMATE": "Schätzen", - "STATUS": "Status", - "NAME": "Name", - "TASK": "Aufgabe", - "MY_TASKS": "Meine Aufgaben", - "WORKED_ON_TASK": "An Aufgabe gearbeitet", - "TOTAL_WORKED_TODAY": "Heute insgesamt gearbeitet", - "TOTAL_WORK": "Heutige Arbeit", - "OPEN": "Offen", - "NOW": "Jetzt", - "NEXT": "Nächste", - "PREV": "Vorherige", - "DETAILS": "Details", - "CLOSED": "Geschlossen", - "CLOSE": "Schließen", - "USER_NOT_FOUND": "Keine Benutzer gefunden.", - "TASK_TITTLE": "Aufgaben Titel", - "PUBLIC_TASK": "Diese Aufgabe ist öffentlich", - "PRIVATE_TASK": "Diese Aufgabe ist privat", - "PUBLIC_TASK_LABEL": "Öffentlich machen", - "PRIVATE_TASK_LABEL": "Privat machen", - "CREATE_TASK": "Neue Aufgabe erstellen", - "LINK_TASK": "Verknüpftes Ticket auswählen", - "LINK": "Verknüpfen", - "LINKS": "Links", - "SHOW": "Zeigen", - "ADD_LINK": "Links hinzufügen", - "COMMENT": "Kommentar", - "DESCRIPTION": "Beschreibung", - "CHILD_ISSUE_TASK": "Untergeordnetes Ticket auswählen", - "CREATE_TEAM": "Neues Team erstellen", - "VERIFY_ACCOUNT_MSG": "Bitte verifizieren Sie Ihr Konto, bevor Sie die App nutzen", - "CREATE_ROLE": "Rolle erstellen", - "CREATE": "Erstellen", - "CREATE_ISSUE": "Ticket erstellen", - "NEW_ISSUE": "Neues Ticket", - "ACTIVATED": "Aktiviert", - "DEACTIVATED": "Deaktiviert", - "PERIOD": "Zeitraum", - "NEW": "Neu", - "CREATE_VERSION": "Version erstellen", - "VERSION": "Version", - "LOADING": "Laden", - "TOTAL_TIME": "Gesamtzeit", - "LAST_24_HOURS": "Letzte 24 Stunden", - "WORKED": "Gearbeitet", - "ASSIGNED": "Zugewiesen", - "SELECT_STATUS": "Status auswählen", - "SELECT_ISSUE": "Ticket auswählen", - "UNASSIGNED": "Nicht zugewiesen", - "TASK_DETAILS": "Aufgabendetails", - "TYPE_SOMETHING": "Etwas eingeben", - "FILTER": "Filter", - "APPLY": "Anwenden", - "RESET": "Zurücksetzen", - "LOGOUT": "Abmelden", - "THEMES": "Themen", - "3D_MODE": "3D Modus", - "DARK_MODE": "Dark Mode", - "SETTINGS": "Einstellungen", - "PERSONAL": "Persönlich", - "USE_SETTING": "Einstellung verwenden", - "TEAM": "Team", - "MY_TEAM": "Mein Team", - "FULL_NAME": "Voller Name", - "USER_AVATAR": "Benutzeravatar", - "CONTACT": "Kontakt", - "ENABLED": "aktivieren", - "DISABLED": "deaktivieren", - - "THEME": "Thema", - "TIME_ZONE": "Zeitzone", - "EDIT": "Bearbeiten", - "SAVE": "Speichern", - "LANGUAGE": "Sprache", - "DETECT": "Erkennen", - "TRANSFER": "Übertragen", - "TRANSFER_TEAM": "Team übertragen", - "TEAM_MEMBERS": "Teammitglieder", - "NO_TEAM": "Erstellen Sie Ihr eigenes Team oder treten Sie einem bestehenden bei", - "NO_TEAM_SUB": "Es ist großartig, mit anderen zusammenzuarbeiten, also erstelle ein Team und lade alle zur Zusammenarbeit ein!", - "NO_TEAM_TOOLTIP": "Sie müssen Ihre E-Mail-Adresse bestätigen", - "CANCEL": "Abbrechen", - "DISCARD": "Verwerfen", - "EXISTING_MEMBER": "Bereits Mitglied", - "NEW_MEMBER": "Mitglied werden", - "BACK": "Zurück", - "JOIN_REQUEST": "Beitrittsanfrage", - "PERMISSION": "Berechtigung", - "SEARCH": "Suchen", - "ADD_PARENT": "Übergeordnet hinzufügen", - "BLOCKS": "Blockiert", - "CLONES": "Klone", - "DUPLICATES": "Duplikate", - "IS_BLOCKED_BY": "Wird blockiert von", - "IS_CLONED_BY": "Wird geklont von", - "IS_DUPLICATED_BY": "Wird dupliziert von", - "RELATES_TO": "Bezieht sich auf", - "CHANGE_PARENT": "Übergeordnet ändern", - "RELATED_ISSUES": "Verknüpfte Tickets", - "CHILD_ISSUES": "Untergeordnete Tickets", - "REOPEN": "Wieder öffnen", - "NO_TASKS": "Keine Aufgaben", - "FULL_WIDTH": "Volle Breite", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Bitte stoppen Sie den Timer, bevor Sie die Aufgabe ändern", - - "COLLABORATE_DIALOG_TITLE": "Zusammenarbeit beginnen", - "COLLABORATE_DIALOG_SUB_TITLE": "Mitglied(er) einladen und zusammenarbeiten", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Meeting oder Board Zusammenarbeit starten", - "ISSUE_TYPE": "Ticket Typ", - "ACTIVITY": "Aktivität", - "FILTER_ALL": "Alle", - "FILTER_COMMENTS": "Kommentare", - "FILTER_HISTORY": "Historie", - "FILTER_UNSUBSCRIBE": "Abmelden", - - "KEYBOARD_SHORTCUTS": "Tastenkombinationen", - - "GITHUB_LOADING_TEXT": "Wir installieren jetzt Ihre GitHub-Integration, warten Sie...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Synchronisieren Sie Aufgaben in Ihrer Anwendung automatisch für nahtlose und effiziente Aktualisierungen.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchronisieren Sie Aufgaben selektiv, indem Sie sie mit einem bestimmten Label verknüpfen.", - "GITHUB_AUTO_SYNC_LABEL": "Auto-Sync-Label auswählen" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "Wir arbeiten derzeit an der Echtzeitsynchronisierung. Bitte überprüfen Sie diese Funktion später.", - "ALERT_DELETE_ACCOUNT": "Das Konto wird von allen Teams entfernt, außer wo Sie nur Manager sind", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Ihr Konto wird dauerhaft gelöscht und von allen Teams entfernt", - "ALERT_REMOVE_TEAM": "Das Team wird vollständig aus dem System entfernt und die Teammitglieder verlieren den Zugriff", - "ALERT_REMOVE_ALL_DATA": "Alle Kontodaten werden aus allen Teams entfernt, in denen Sie NUR ein bestehender Manager sind.", - "ALERT_QUIT_TEAM": "Sie sind im Begriff, das Team zu verlassen" - }, - "pages": { - "home": { - "BREADCRUMB": ["Dashboard"], - "SENT_EMAIL_VERIFICATION": "Verifizierungscode wurde an Ihre E-Mail gesendet", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "Sie müssen ", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " Ihre E-Mail-Adresse. Der Verifizierungscode sollte bereits an Ihre E-Mail gesendet worden sein, aber klicken Sie gerne auf ", - "SENT_EMAIL_VERIFICATION_RESEND": " um den Code erneut zu senden, falls Sie ihn nicht erhalten haben.", - "INVITATIONS": "Sie wurden eingeladen, beizutreten", - "CONFIRM_ACCEPT_INVITATION": "Möchten Sie die Einladung wirklich annehmen?", - "CONFIRM_REJECT_INVITATION": "Möchten Sie die Einladung wirklich ablehnen?" - }, - - "profile": { - "BREADCRUMB": ["Aufgaben des Mitglieds"] - }, - - "taskDetails": { - "BREADCRUMB": ["Aufgabendetails"], - "DESCRIPTION": "Beschreibungen", - "ADD_DESCRIPTION": "Beschreibung hier hinzufügen", - "TYPE_OF_ISSUE": "Art des Tickets", - "CREATOR": "Ersteller", - "ASSIGNEES": "Zugewiesene", - "START_DATE": "Startdatum", - "DUE_DATE": "Fälligkeitsdatum", - "DAYS_REMAINING": "Verbleibende Tage", - "VERSION": "Version", - "EPIC": "Epic", - "STATUS": "Status", - "LABEL": "Label", - "LABELS": "Labels", - "SIZE": "Größe", - "PRIORITY": "Priorität", - "ESTIMATIONS": "Schätzungen", - "PROGRESS": "Fortschritt", - "TOTAL_TIME": "Gesamtzeit", - "TIME_TODAY": "Zeit heute", - "TOTAL_GROUP_TIME": "Gesamtgrupppenzeit", - "TIME_REMAINING": "Verbleibende Zeit", - "CREATED": "Erstellt", - "UPDATED": "Aktualisiert", - "RESOLVED": "Gelöst", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "Die Aufgabenbezeichnung konnte nicht aktualisiert werden.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "Die Aufgabenbezeichnung darf nicht mehr als 255 Zeichen umfassen.", - - "TASK_IS_ALREADY_EPIC": "Epische Aufgabentypen können nicht geändert werden.", - "TASK_HAS_PARENT": "Der Aufgabentyp kann nicht geändert werden, da die Aufgabe bereits ein übergeordnetes Element hat." - }, - - "auth": { - "SEND_CODE": "Code senden", - "JOIN": "Beitreten", - "UNRECEIVED_CODE": "Keinen Code erhalten?", - "JOIN_TEAM": "Team beitreten", - "INPUT_INVITE_CODE": "Einladungscode eingeben.", - "INPUT_INVITE_CODE_DESC": "Geben Sie den Einladungscode ein, den wir Ihnen per E-Mail geschickt haben.", - "INVALID_INVITE_CODE_MESSAGE": "Ungültiger Code", - "WELCOME_TEAMS": "Willkommen bei Ever Teams", - - "COVER_TITLE": "Verfolgen Sie den Arbeitsfortschritt Ihrer Teams in Echtzeit!", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Anmelden", - "SELECT_WORKSPACE": "Arbeitsbereich auswählen", - "ENTER_EMAIL": "E-Mail-Adresse eingeben", - "WORKSPACES_NOT_FOUND": "Keine Arbeitsbereiche gefunden" - }, - "authPasscode": { - "HEADING_TITLE": "Bestehendem Team beitreten", - "HEADING_DESCRIPTION": "Bitte geben Sie E-Mail und Einladungscode ein, um einem bestehenden Team beizutreten." - }, - "authLogin": { - "HEADING_TITLE": "Beim Team anmelden", - "HEADING_DESCRIPTION": "Bitte geben Sie E-Mail und Einladungscode ein, um sich anzumelden.", - - "WORKSPACE": "Arbeitsbereich", - "HEADING_WORKSPACE_LINE1": "Die E-Mail ist mit mehreren Arbeitsbereichen verknüpft,", - "HEADING_WORKSPACE_LINE2": "bitte wählen Sie einen aus, um fortzufahren" - }, - "authTeam": { - "HEADING_TITLE": "Neues Team erstellen", - "HEADING_DESCRIPTION": "Bitte geben Sie die Details für Ihr neues Team ein, um ein neues Team zu erstellen.", - "LOADING_TEXT": "Wir erstellen gerade Ihren neuen Arbeitsbereich, bitte warten...", - "VERIFY_EMAIL_LOADING_TEXT": "Wir verifizieren gerade Ihre E-Mail, bitte warten...", - "INPUT_TEAM_NAME": "Teamnamen eingeben", - "JOIN_EXISTING_TEAM": "Einem bestehenden Team beitreten?", - "CREATE_FIRST_TEAM": "Ihr erstes Team erstellen", - "CREATE_TEAM": "Team erstellen" - }, - "settings": { - "BREADCRUMB": [{ "title": "Dashboard", "href": "/" }, "Einstellungen"], - "DANDER_ZONE": "Gefahrenzone", - "HEADING_DESCRIPTION": "Hier können Sie Ihr persönliches Dashboard einrichten und verwalten", - "ARE_YOU_SURE_TO_DELETE_USER": "Möchten Sie diesen Benutzer wirklich löschen?" - }, - "settingsPersonal": { - "HEADING_TITLE": "Allgemeine Einstellungen", - "emailNotValid": "Bitte geben Sie eine gültige E-Mail-Adresse an", - "phoneNotValid": "Bitte geben Sie eine gültige Telefonnummer an", - "WORK_SCHEDULE": "Arbeitszeitplan", - "SUBSCRIPTION": "Abonnement", - "TIMEZONE_SEARCH_PLACEHOLDER": "Ihre Zeitzone", - "ABOUT_TO_CHANGE_EMAIL": "Sie sind im Begriff, die E-Mail zu ändern", - "ABOUT_TO_DELETE_ACCOUNT": "Sie sind im Begriff, Ihr Konto zu löschen?", - "DATA_SYNCHRONIZATION": "Data Synchronization", - "ABOUT_TO_REMOVE_ACCOUNT": "Sie sind im Begriff, Ihr Konto zu entfernen?", - "ABOUT_TO_REMOVE_FROM_ALL_TEAMS": "You're about to be removed from all teams, unless you're the only manager ?", - "ABOUT_TO_DELETE_ALL_ACCOUNT_DATA": "You are about to Delete your account and all your data ?" - }, - "settingsTeam": { - "HEADING_TITLE": "Allgemeine Einstellungen", - "MEMBER_HEADING_TITLE": "Mitglieder", - "PRIORITIES_HEADING": "Prioritäten", - "NOTIFICATION_HEADING": "Benachrichtigungen", - "SIZES_HEADING": "Größen", - "TEAM_NAME": "Teamname", - "TEAM_TYPE": "Teamtyp", - "TIME_TRACKING": "Zeiterfassung", - - "ADD_NEW_MEMBER": "Neues Mitglied hinzufügen", - "MANAGE_ASSIGNEES": "Zugewiesene verwalten", - "SEARCH_MEMBER": "Mitglied suchen", - "TASK_STATUSES": "Aufgabenstatus", - "TASK_PRIORITIES": "Aufgabenprioritäten", - "TASK_SIZES": "Aufgabengrößen", - "TASK_LABELS": "Aufgabenlabels", - "ISSUE_TYPES": "Tickettypen", - "RELATED_TYPE": "Verwandter Typ", - - "INVITATION_HEADING_TITLE": "Einladungen", - "CREATE_NEW_STATUSES": "Neue Status erstellen", - "CREATE_NEW_STATUS": "Neuen Status erstellen", - "CREATE_NEW_VERSION": "Neue Version erstellen", - "CREATE_NEW_PRIORITIES": "Neue Prioritäten erstellen", - "CREATE_NEW_PRIORITY": "Neue Priorität erstellen", - "CREATE_NEW_SIZES": "Neue Größen erstellen", - "CREATE_NEW_SIZE": "Neue Größe erstellen", - "CREATE_NEW_LABELS": "Neue Labels erstellen", - "CREATE_NEW_LABEL": "Neues Label erstellen", - "CREATE_NEW_ISSUE_TYPES": "Neue Tickets erstellen", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Persönliche Mitgliederinformationen ausblenden", - "POSITION_CUSTOM": "Benutzerdefinierte Positionen", - "INVITATION_EXPIRATION": "Einladungsablauf", - "NOTIFY_IF": "Benachrichtigen bei", - "TEAM_REQUEST": "Teamanfragen", - "WORK_SCHEDULE": "Arbeitszeitplan", - "MEMBER_AND_ROLES": "Mitglieder und Rollen", - "INTEGRATIONS": "Integrationen", - "DANDER_ZONES": "Gefahrenzonen", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Verbinden Sie sich mit GitHub und beginnen Sie, GitHub-Tickets mit Ihrem Team zu synchronisieren", - "SELECT_REPOSITORY": "Repository auswählen", - - "INSTALL": "Installieren", - - "LIST_OF_STATUSES": "Liste der Status", - "LIST_OF_PRIORITIES": "Liste der Prioritäten", - "LIST_OF_SIZES": "Liste der Größen", - "LIST_OF_LABELS": "Liste der Labels", - "LIST_OF_ISSUES_TYPE": "Liste der Tickets", - - "GENERAL": "Allgemein", - "SOUND": "Ton", - "EMAIL": "E-Mail", - "USERS": "Benutzer", - "TASKS": "Aufgaben", - "SYSTEM": "System", - "SECURITY": "Sicherheit", - "INAPP": "In App", - "NOTIFICATION_HEADING_TITLE": "Benachrichtigungseinstellungen", - "ISSUE_HEADING_TITLE": "Ticketeinstellungen", - - "TASK_PRIVACY": "Aufgabenprivatsphäre", - "MULTIPLE_ASSIGNEES": "Mehrere Zugewiesene", - "MANUAL_TIME": "Manuelle Zeit", - "GROUP_ESTIMATION": "Gruppenschätzung", - "ESTIMATION_IN_HOURS": "Schätzung in Stunden", - "ESTIMATION_IN_STORY_POINTS": "Schätzung in Story Points", - "PROOF_OF_COMPLETION": "Fertigstellungsnachweis", - "LINKED_ISSUES": "Verlinkte Tickets", - "COMMENTS": "Kommentare", - "HISTORY": "Historie", - "ACCEPTANCE_CRITERIA": "Akzeptanzkriterien", - "DRAFT_ISSUES": "Entwurfstickets", - "AUTO_CLOSE_ISSUE": "Ticket automatisch schließen", - "AUTO_ARCHIVE_ISSUE": "Ticket automatisch archivieren", - "AUTO_STATUS": "Automatischer Status", - "VERSIONS": "Versionen", - "LIST_OF_VERSONS": "Liste der Versionen", - "ISSUETYPE": "Tickettypen", - "LIST_OF_ISSUES": "Liste der Tickets", - "RELATED_ISSUE_TYPE": "Verwandte Tickettypen", - "LIST_OF_RELATED_TYPE": "Liste verwandter Typen", - "INITIAL": "Anfänglich", - "COPY_NUMBER": "Kopiennummer", - "IN_PROGRESS": "In Bearbeitung", - "FINAL": "Final", - "DISPOSE_TEAM": "Sie sind im Begriff, das Team aufzulösen?", - "QUIT_TEAM": "Sie sind im Begriff, das Team zu verlassen?", - "TEAM_COLOR": "Teamfarbe", - "TEAM_SIZE": "Teamgröße", - "EMOJI": "Emoji", - "ISSUES_HEADING_TITLE": "Ticketeinstellungen", - - "TRACK_TIME": "Zeit verfolgen", - "ESTIMATE_ISSUE": "Ticket schätzen", - "EPICS_CREATE_CLOSE": "Epics erstellen/schließen", - "ISSUE_CREATE_CLOSE": "Ticket erstellen/schließen", - "ISSUE_ASSIGN_UNASSIGN": "Ticket zuweisen/entziehen", - "INVITE_MEMBERS": "Mitglieder einladen", - "REMOVE_MEMBERS": "Mitglieder entfernen", - "HANDLE_REQUESTS": "Anfragen bearbeiten", - "ROLES_POSITIONS_CHANGE": "Rollen-/Positionsänderung", - "VIEW_DETAILS": "Details anzeigen", - - "NO_INVITATIONS": "Es gibt derzeit keine Einladungen!", - "NO_MEMBERS": "Es gibt derzeit keine Mitglieder!" - }, - "invite": { - "HEADING_TITLE": "Mitglied in Ihr Team einladen", - "HEADING_DESCRIPTION": "Einladung per E-Mail an ein Teammitglied senden", - "TEAM_MEMBER_EMAIL": "E-Mail des Teammitglieds", - "TEAM_MEMBER_FULLNAME": "Voller Name des Teammitglieds", - "SEND_INVITE": "Einladung senden", - "ERROR_WHILE_ACCEPTING_INVITATION": "Fehler beim Annehmen der Einladung", - "ERROR_WHILE_REJECTING_INVITATION": "Fehler beim Ablehnen der Einladung", - "INVITE_LABEL_SEND": "Einladung senden", - "invitationTable": { - "NAME_AND_EMAIL": "Name & E-Mail", - "POSITION": "Position", - "DATE_AND_TIME_REQUEST": "Datum & Uhrzeit der Anfrage", - "CV_OR_ATTACHMENT": "Lebenslauf / Anhang" - } - }, - "permissions": { - "SELECT_ROLES": "Rollen auswählen" - }, - "unauthorized": { - "TITLE": "Nicht autorisiert", - "HEADING_TITLE": "Sie sind nicht autorisiert auf diese Seite zuzugreifen !", - "HEADING_DESCRIPTION": "Wir entschuldigen uns für die Unannehmlichkeiten, aber Sie sind nicht berechtigt, auf diese Seite zuzugreifen. Wenn Sie glauben, dass dies ein Fehler ist. Bitte loggen Sie sich ein." - }, - "page404": { - "HEADING_TITLE": "Nicht gefunden", - "HEADING_DESCRIPTION": "Die gesuchte Ressource wurde nicht gefunden!", - "LINK_LABEL": "Zur Startseite" - }, - "offline": { - "HEADING_TITLE": "Netzwerk getrennt!", - "HEADING_DESCRIPTION": "Sie sind derzeit offline, bitte überprüfen Sie Ihre Internetverbindung..." - }, - "error": { - "TITLE": "Error !", - "HEADING_TITLE": "Something went wrong !", - "HEADING_DESCRIPTION": "If the problem persists, send a distress signal to our support team." - }, - "maintenance": { - "HEADING_TITLE": "Wir halten es instand.", - "HEADING_DESCRIPTION": "Wir aktualisieren derzeit unsere Website, um Sie besser bedienen zu können. Bitte schauen Sie später wieder vorbei." - } - }, - "timer": { - "START_TIMER": "Bitte wählen oder erstellen Sie eine neue Aufgabe, um die Zeit zu tracken", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Timer gestoppt", - "STOPPED_TIMER_TOAST_DESCRIPTION": "Timer wegen Teamwechsel gestoppt" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Schätzen" - }, - "DAY_LIST": [{ "title": "7 Tage" }, { "title": "14 Tage" }] - }, - - "task": { - "TITLE": "Aufgabe", - "ASSIGN_NEW_TASK": "Neue Aufgabe zuweisen", - "ASSIGNED_BY": "Zugewiesen von", - "NO_ONE_FOR_TASK": "Niemand dieser Aufgabe zugewiesen", - "WORKED_TODAY_ON_TASK_TOOLTIP": "heute an dieser Aufgabe gearbeitet für", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "insgesamt an dieser Aufgabe gearbeitet für", - "WORKED_TODAY_ON_ALL_TOOLTIP": "heute an allem gearbeitet für", - "TASKS_FOR_TOOLTIP": "Aufgaben für", - "taskLabel": { - "WORK_LABEL": "Gearbeitet", - "TASK_ASSIGNED": "Zugewiesen", - "TASK_UNASSIGNED": "Nicht zugewiesen", - "BUTTON_LABEL": "Aufgabe zuweisen" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "Dieser Tab zeigt alle Aufgaben, an denen Sie gearbeitet haben", - "ASSIGNED_DESCRIPTION": "Dieser Tab zeigt alle Aufgaben, die Ihnen zugewiesen sind", - "UNASSIGNED_DESCRIPTION": "Dieser Tab zeigt alle Aufgaben, die Ihnen nicht zugewiesen sind", - "NO_TASK_USER_ASSIGNED": "Niemandem dieser Aufgabe zugewiesen" - }, - "taskTableHead": { - "TASK_NAME": "Name", - "TASK_STATUS": "Status", - "TASK_WORK": { - "TITLE": "Gearbeitet an", - "DESCRIPTION": "Aufgabe", - "LABEL": "An Aufgabe gearbeitet" - }, - "TASK_TIME": "Schätzung", - "TOTAL_WORK": { - "TITLE": "Insgesamt gearbeitet", - "DESCRIPTION": "Heute", - "LABEL": "Heute insgesamt gearbeitet" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Wie viele Stunden hat der Mitarbeiter heute und insgesamt an der Aufgabe gearbeitet", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Wie viele Stunden hat der Mitarbeiter heute an allen Aufgaben für das ausgewählte Team gearbeitet" - }, - "CONFIRM_CLOSE_TASK": "Bitte bestätigen Sie, ob Sie die Aufgabe schließen möchten" - }, - - "form": { - "NAME_PLACEHOLDER": "Ihren Namen eingeben", - "FIRST_NAME_PLACEHOLDER": "Vorname", - "LAST_NAME_PLACEHOLDER": "Nachname", - "EMAIL_PLACEHOLDER": "Ihre E-Mail-Adresse eingeben", - "PHONE_PLACEHOLDER": "Telefonnummer", - - "ISSUE_NAME_PLACEHOLDER": "Ticketname", - - "TEAM_NAME_PLACEHOLDER": "Bitte geben Sie den Teamnamen ein", - "TASK_INPUT_PLACEHOLDER": "Woran arbeiten Sie?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "Name des Teammitglieds", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "E-Mail-Adresse des Teammitglieds", - "COMPLETION_DESCRIPTION": "Beschreibung schreiben", - "UPLOAD_FILES": "Dateien hochladen", - "ATTACHMENT_FILE": "Angehängte Dateien", - "ADD_COMMENT": "Kommentar hinzufügen", - "SET_THEME": "Design festlegen", - "CHANGE_AVATAR": "Avatar ändern", - "SELECT_TEAM_SIZE": "Teamgröße auswählen", - "INVALID_ALLOWED_CHARACTER": "Ungültiger Wert für allowedCharacters. Verwenden Sie alpha, numeric oder alphanumeric" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "Alle Rechte vorbehalten.", - "COPY_RIGHT1": "© {{date}}-Gegenwart,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Nutzungsbedingungen", - "PRIVACY_POLICY": "Datenschutzrichtlinie", - "COOKIES": "Cookie-Richtlinie", - "BY": "Von" - } - }, - - "errors": { - "NETWORK_ISSUE": "Netzwerkproblem, bitte versuchen Sie es später noch einmal", - "ERROR_WHILE_VERIFY_CODE": "Fehler beim Verifizieren des Codes.", - "LENGTH_NUMBER_ERROR": "Die Länge muss eine Zahl größer als 0 sein", - "INVALID_ALLOWED_CHARACTER": "Ungültiger Wert für allowedCharacters. Verwenden Sie alpha, numeric oder alphanumeric", - "VALID_EMAIL": "Bitte geben Sie eine gültige E-Mail-Adresse ein" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Enter drücken, um zu validieren" - }, - "team": { - "BACK_LABEL": "Zurück zum Team", - "PUBLIC_TEAM": "Öffentliches Team", - "PRIVATE_TEAM": "Privates Team", - "creation": { - "NEW": "Neues Team erstellen" - } - }, - "links": { - "common": { - "TASKS": "Aufgaben", - "TEAM": "Team", - "SETTINGS": "Einstellungen" - } - } -} diff --git a/apps/web/public/locales/en/common.json b/apps/web/public/locales/en/common.json deleted file mode 100644 index eb00ef77d..000000000 --- a/apps/web/public/locales/en/common.json +++ /dev/null @@ -1,585 +0,0 @@ -{ - "TITLE": "Ever Teams", - "common": { - "ACCEPT": "Accept", - "ACCEPTED": "Accepted", - "REJECT": "Reject", - "REJECTED": "Rejected", - "VERIFY": "verify", - "INVITE": "Invite", - "INVITED": "Invited", - "EXPIRE": "Expire", - "EXPIRED": "Expired", - "REQUEST": "Request", - "REQUESTED": "Requested", - "LABEL": "Label", - "LABELS": "Labels", - "POSITION": "Position", - "ROLES": "Roles", - "JOIN_OR_LEFT": "Joined / Left", - "PLEASE": "please", - "HERE": "here", - "PEOPLE": "People", - "COLLABORATE": "Collaborate", - "NO": "No", - "ONLY_ME": "Only me", - "YES": "Yes", - "BASIC": "Basic", - "DELETE": "Delete", - "MEET": "Meet", - "BOARD": "Board", - "SECURITY_CODE": "Security Code", - "CONFIRM": "Confirm", - "YOUR_EMAIL": "your email", - "CONTINUE": "Continue", - "EDIT_TASK": "Edit Task", - "ASSIGN_TASK": "Assign Task", - "ASSIGN_TASK_TO": "Assign Task", - "REMOVE_ACCOUNT": "Remove Account", - "REMOVE_EVERYWHERE": "Remove From All Teams", - "DELETE_ACCOUNT": "Delete This Account", - "DELETE_ALL_DATA": "Delete All Data", - "UNASSIGN_TASK": "Unassign Task", - "MAKE_A_MANAGER": "Make a Manager", - "UNMAKE_A_MANAGER": "Unmake a Manager", - "TRANSFERT_OWNERSHIP": "Transfer Ownership", - "TRANSFERT_OWNERSHIP_TO": "Transfer full ownership of team to another user", - "REMOVE": "Remove", - "REMOVE_TEAM": "Remove Team", - "DISPOSE_TEAM": "Dispose Team", - "QUIT_TEAM": "Quit the Team", - "QUIT": "Quit", - "STATUSES": "Statuses", - "RESEND_INVITATION": "Resend Invitation", - "TODAY": "Today", - "TOTAL": "Total", - "ESTIMATED": "Estimated", - "ESTIMATE": "Estimate", - "STATUS": "Status", - "NAME": "Name", - "TASK": "Task", - "MY_TASKS": "My Tasks", - "WORKED_ON_TASK": "Worked on Task", - "TOTAL_WORKED_TODAY": "Total worked Today", - "TOTAL_WORK": "Today work", - "OPEN": "Open", - "NOW": "Now", - "NEXT": "Next", - "PREV": "Previous", - "DETAILS": "Details", - "CLOSED": "Closed", - "CLOSE": "Close", - "USER_NOT_FOUND": "No users found.", - "TASK_TITTLE": "Task Title", - "PUBLIC_TASK": "This task is Public", - "PRIVATE_TASK": "This task is Private", - "PUBLIC_TASK_LABEL": "Make a public", - "PRIVATE_TASK_LABEL": "Make a private", - "CREATE_TASK": "Create New Task", - "LINK_TASK": "Select Related Issue", - "LINK": "Link", - "LINKS": "Links", - "SHOW": "Show", - "ADD_LINK": "Add Links", - "COMMENT": "Comment", - "DESCRIPTION": "Description", - "CHILD_ISSUE_TASK": "Select Child Issue", - "CREATE_TEAM": "Create New Team", - "VERIFY_ACCOUNT_MSG": "Please Verify your account before start using the app", - "CREATE_ROLE": "Create Role", - "CREATE": "Create", - "CREATE_ISSUE": "Create issue", - "NEW_ISSUE": "New Issue", - "ACTIVATED": "Activated", - "DEACTIVATED": "Activated", - "PERIOD": "Period", - "NEW": "New", - "CREATE_VERSION": "Create Version", - "VERSION": "Version", - "LOADING": "Loading", - "TOTAL_TIME": "Total time", - "LAST_24_HOURS": "Last 24 Hours", - "WORKED": "Worked", - "ASSIGNED": "Assigned", - "SELECT_STATUS": "Select status", - "SELECT_ISSUE": "Select Issue", - "UNASSIGNED": "Unassigned", - "TASK_DETAILS": "Task Details", - "TYPE_SOMETHING": "Type something", - "FILTER": "Filter", - "APPLY": "Apply", - "RESET": "Reset", - "LOGOUT": "Log Out", - "THEMES": "Themes", - "3D_MODE": "3D Mode", - "DARK_MODE": "Dark Mode", - "SETTINGS": "Settings", - "PERSONAL": "Personal", - "USE_SETTING": "Use setting", - "TEAM": "Team", - "MY_TEAM": "My Team", - "FULL_NAME": "Full Name", - "USER_AVATAR": "User Avatar", - "CONTACT": "Contact", - "ENABLED": "Enabled", - "DISABLED": "Disabled", - "THEME": "Theme", - "TIME_ZONE": "Timezone", - "EDIT": "Edit", - "SAVE": "Save", - "LANGUAGE": "Language", - "DETECT": "Detect", - "TRANSFER": "Transfer", - "TRANSFER_TEAM": "Transfer Team", - "TEAM_MEMBERS": "Team Members", - "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "It's great to work with others so create a team and invite everyone to collaborate!", - "NO_TEAM_TOOLTIP": "You need to verify your email address", - "CANCEL": "Cancel", - "DISCARD": "Discard", - "EXISTING_MEMBER": "Already a Member", - "NEW_MEMBER": "Become a Member", - "BACK": "Back", - "DONT_HAVE_ACCOUNT": "Don't have an account?", - "REGISTER": "Register Now!", - "JOIN_REQUEST": "Request To Join", - "PERMISSION": "Permission", - "SEARCH": "Search", - "ADD_PARENT": "Add Parent", - "BLOCKS": "Blocks", - "CLONES": "Clones", - "DUPLICATES": "Duplicates", - "IS_BLOCKED_BY": "Is Blocked By", - "IS_CLONED_BY": "Is Cloned By", - "IS_DUPLICATED_BY": "Is Duplicated By", - "RELATES_TO": "Relates To", - "CHANGE_PARENT": "Change Parent", - "RELATED_ISSUES": "Related Issues", - "CHILD_ISSUES": "Child Issues", - "REOPEN": "Reopen", - "NO_TASKS": "No Tasks", - "FULL_WIDTH": "Full width", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Please stop the Timer before changing the Task", - "COLLABORATE_DIALOG_TITLE": "Start Collaboration", - "COLLABORATE_DIALOG_SUB_TITLE": "Invite member(s) and start collaborating", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Start Meeting or Board Collaboration", - "ISSUE_TYPE": "Issue Type", - "ACTIVITY": "Activity", - "FILTER_ALL": "All", - "FILTER_COMMENTS": "Comments", - "FILTER_HISTORY": "History", - "FILTER_UNSUBSCRIBE": "Unsubscribe", - "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", - "GITHUB_LOADING_TEXT": "We are now installing your GitHub Integration, hold on...", - "GITHUB_INTEGRATION_SUBTITLE_TEXT": "Activate GitHub Integration for project & repository sync", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Automatically synchronize tasks in your application for seamless and efficient updates.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchronize tasks selectively by associating them with specific label.", - "GITHUB_AUTO_SYNC_LABEL": "Select Auto-Sync Label" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "We are working on Real-Time Sync at the moment, please check on this feature later.", - "ALERT_DELETE_ACCOUNT": "You will be removed from all teams, except where you are the only manager in the team", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Your Account will be deleted permanently with removing from all teams", - "ALERT_REMOVE_ALL_DATA": "All Account Data will be removed from all teams where you are ONLY one existed manager", - "ALERT_REMOVE_TEAM": "Team will be completely removed for the system and team members lost access", - "ALERT_QUIT_TEAM": "You are about to quit the team" - }, - "pages": { - "home": { - "BREADCRUMB": [ - "Dashboard" - ], - "SENT_EMAIL_VERIFICATION": "Code Verification has been sent to your email", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "You need to ", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " your email address. The verification code should already be send to your email, but feel free to click ", - "SENT_EMAIL_VERIFICATION_RESEND": " to resend the code, if you did not received it.", - "INVITATIONS": "You've been invited to join", - "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", - "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" - }, - "kanban": { - "KANBAN_BOARD": [ - "Kanban Board" - ] - }, - "profile": { - "BREADCRUMB": [ - "Member Tasks" - ] - }, - "taskDetails": { - "BREADCRUMB": [ - "Task Details" - ], - "DESCRIPTION": "Descriptions", - "ADD_DESCRIPTION": "Add Description here", - "TYPE_OF_ISSUE": "Type of Issue", - "CREATOR": "Creator", - "ASSIGNEES": "Assignees", - "START_DATE": "Start Date", - "DUE_DATE": "Due Date", - "DAYS_REMAINING": "Days Remaining", - "VERSION": "Version", - "EPIC": "Epic", - "STATUS": "Status", - "LABEL": "Label", - "LABELS": "Labels", - "SIZE": "Size", - "PRIORITY": "Priority", - "ESTIMATIONS": "Estimations", - "PROGRESS": "Progress", - "TOTAL_TIME": "Total Time", - "TIME_TODAY": "Time Today", - "TOTAL_GROUP_TIME": "Total Group Time", - "TIME_REMAINING": "Time Remaining", - "CREATED": "Created", - "UPDATED": "Updated", - "RESOLVED": "Resolved", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "We couldn't update Task Title.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "Task Title can't exceed 255 characters.", - "TASK_IS_ALREADY_EPIC": "Epic Task Type can not be changed.", - "TASK_HAS_PARENT": "Task Type can not be changed as Task has already Parent." - }, - "auth": { - "SEND_CODE": "send code", - "JOIN": "Join", - "UNRECEIVED_CODE": "Didn't receive code ?", - "JOIN_TEAM": "Join Team", - "INPUT_INVITE_CODE": "Input invitation code.", - "INPUT_INVITE_CODE_DESC": "Enter the invitation code we sent to your email.", - "INVALID_INVITE_CODE_MESSAGE": "Invalid Code", - "WELCOME_TEAMS": "Real-Time Clarity, Real-Time Reality™.", - "COVER_TITLE": "Open Work and Project Management Platform", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Login", - "SELECT_WORKSPACE": "Select Workspace", - "ENTER_EMAIL": "Enter Email", - "WORKSPACES_NOT_FOUND": "Workspaces Not Found" - }, - "authPasscode": { - "HEADING_TITLE": "Join existing Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to join existing team." - }, - "authLogin": { - "HEADING_TITLE": "Log In to Ever Teams", - "HEADING_DESCRIPTION": "Please enter your email below to begin the login process.", - "WORKSPACE": "Workspace", - "HEADING_WORKSPACE_LINE1": "The email associated with multiple workspaces,", - "HEADING_WORKSPACE_LINE2": "please select one to continue" - }, - "authPassword": { - "HEADING_DESCRIPTION": "Please enter your login information." - }, - "authTeam": { - "HEADING_TITLE": "Create New Team", - "HEADING_DESCRIPTION": "Please enter your team details to create a new team.", - "LOADING_TEXT": "We are now creating your new workplace, hold on...", - "VERIFY_EMAIL_LOADING_TEXT": "We are verifying your email, hold on...", - "INPUT_TEAM_NAME": "Input your team name", - "JOIN_EXISTING_TEAM": "Joining existing team?", - "CREATE_FIRST_TEAM": "Create your first team", - "CREATE_TEAM": "Create team" - }, - "settings": { - "BREADCRUMB": [ - { - "title": "Dashboard", - "href": "/" - }, - "Settings" - ], - "DANDER_ZONE": "Danger Zone", - "HEADING_DESCRIPTION": "Setting dan manage your personal dashboard here", - "ARE_YOU_SURE_TO_DELETE_USER": "Are you sure you want to delete this user?" - }, - "settingsPersonal": { - "HEADING_TITLE": "General Settings", - "emailNotValid": "Please provide a valid Email", - "phoneNotValid": "Please provide a valid Phone Number", - "WORK_SCHEDULE": "Work Schedule", - "SUBSCRIPTION": "Subscription", - "ABOUT_TO_CHANGE_EMAIL": "You are about to change Email", - "ABOUT_TO_DELETE_ACCOUNT": "You are about to Delete your account ?", - "TIMEZONE_SEARCH_PLACEHOLDER": "Your Timezone", - "ABOUT_TO_REMOVE_FROM_ALL_TEAMS": "You're about to be removed from all teams, unless you're the only manager ?", - "DATA_SYNCHRONIZATION": "Data Synchronization", - "ABOUT_TO_DELETE_ALL_ACCOUNT_DATA": "You are about to Delete your account and all your data ?" - }, - "settingsTeam": { - "HEADING_TITLE": "General Settings", - "MEMBER_HEADING_TITLE": "Members", - "PRIORITIES_HEADING": "Priorities", - "NOTIFICATION_HEADING": "Notifications", - "SIZES_HEADING": "Sizes", - "TEAM_NAME": "Team Name", - "TEAM_TYPE": "Team Type", - "TIME_TRACKING": "Time Tracking", - "ADD_NEW_MEMBER": "Add new member", - "MANAGE_ASSIGNEES": "Manage Assignees", - "SEARCH_MEMBER": "Search Member", - "TASK_STATUSES": "Task Statuses", - "TASK_PRIORITIES": "Task Priorities", - "TASK_SIZES": "Task Sizes", - "TASK_LABELS": "Task Labels", - "ISSUE_TYPES": "Issue Types", - "RELATED_TYPE": "Related Type", - "INVITATION_HEADING_TITLE": "Invitations", - "CREATE_NEW_STATUSES": "Create new Statuses", - "CREATE_NEW_STATUS": "Create new Status", - "CREATE_NEW_VERSION": "Create new Version", - "CREATE_NEW_PRIORITIES": "Create new Priorities", - "CREATE_NEW_PRIORITY": "Create new Priority", - "CREATE_NEW_SIZES": "Create new Sizes", - "CREATE_NEW_SIZE": "Create new Size", - "CREATE_NEW_LABELS": "Create new Labels", - "CREATE_NEW_LABEL": "Create new Label", - "CREATE_NEW_ISSUE_TYPES": "Create new Issues", - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Hide Personal Members Information", - "POSITION_CUSTOM": "Positions custom", - "INVITATION_EXPIRATION": "Invitation Expiration", - "NOTIFY_IF": "Notify if", - "TEAM_REQUEST": "Team Request", - "WORK_SCHEDULE": "Work schedule", - "MEMBER_AND_ROLES": "Members & Roles", - "INTEGRATIONS": "Integrations", - "DANDER_ZONES": "Danger Zone", - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Connect with GitHub and start Syncing GitHub issues with your Team", - "SELECT_REPOSITORY": "Select Repository", - "INSTALL": "Install", - "LIST_OF_STATUSES": "List of Statuses", - "LIST_OF_PRIORITIES": "List of Priorities", - "LIST_OF_SIZES": "List of Sizes", - "LIST_OF_LABELS": "List of Labels", - "LIST_OF_ISSUES_TYPE": "List of Issues", - "GENERAL": "General", - "SOUND": "Sound", - "EMAIL": "Email", - "USERS": "Users", - "TASKS": "Tasks", - "SYSTEM": "System", - "SECURITY": "Security", - "INAPP": "In App", - "NOTIFICATION_HEADING_TITLE": "Notification Settings", - "ISSUE_HEADING_TITLE": "Issue Settings", - "TASK_PRIVACY": "Task Privacy", - "MULTIPLE_ASSIGNEES": "Multiple Assignees", - "MANUAL_TIME": "Manual Time", - "GROUP_ESTIMATION": "Group Estimation", - "ESTIMATION_IN_HOURS": "Estimation in Hours", - "ESTIMATION_IN_STORY_POINTS": "Estimation in Story Points", - "PROOF_OF_COMPLETION": "Proof of Completion", - "LINKED_ISSUES": "Linked Issues", - "COMMENTS": "Comments", - "HISTORY": "History", - "ACCEPTANCE_CRITERIA": "Acceptance criteria", - "DRAFT_ISSUES": "Draft Issues", - "AUTO_CLOSE_ISSUE": "Auto-close issue", - "AUTO_ARCHIVE_ISSUE": "Auto-archive issue", - "AUTO_STATUS": "Auto-Status", - "VERSIONS": "Versions", - "LIST_OF_VERSONS": "List of Versions", - "ISSUETYPE": "Issue Types", - "LIST_OF_ISSUES": "List of Issues", - "RELATED_ISSUE_TYPE": "Related Issue Types", - "LIST_OF_RELATED_TYPE": "List of Related Types", - "INITIAL": "Initial", - "COPY_NUMBER": "Copy Number", - "IN_PROGRESS": "In Progress", - "FINAL": "Final", - "DISPOSE_TEAM": "You are about to Dispose team ?", - "QUIT_TEAM": "You are about to Quit team ?", - "TEAM_COLOR": "Team Color", - "TEAM_SIZE": "Team Size", - "EMOJI": "Emoji", - "ISSUES_HEADING_TITLE": "Issues Settings", - "TRACK_TIME": "Track Time", - "ESTIMATE_ISSUE": "Estimate issue", - "EPICS_CREATE_CLOSE": "Epics Create/Close", - "ISSUE_CREATE_CLOSE": "Issue Create/Close", - "ISSUE_ASSIGN_UNASSIGN": "Issue Assign/Unassign", - "INVITE_MEMBERS": "Invite members", - "REMOVE_MEMBERS": "Remove members", - "HANDLE_REQUESTS": "Handle requests", - "ROLES_POSITIONS_CHANGE": "Roles/Positions change", - "VIEW_DETAILS": "View Details", - "NO_INVITATIONS": "There are no Invitations at the moment!", - "NO_MEMBERS": "There are no Members at the moment!" - }, - "invite": { - "HEADING_TITLE": "Invite member to your team", - "HEADING_DESCRIPTION": "Send invitation to a team member by email", - "TEAM_MEMBER_EMAIL": "Team Member's Email", - "TEAM_MEMBER_FULLNAME": "Team Member's Full Name", - "SEND_INVITE": "Send Invitation", - "ERROR_WHILE_ACCEPTING_INVITATION": "Error while accepting invitation", - "ERROR_WHILE_REJECTING_INVITATION": "Error while rejecting invitation", - "INVITE_LABEL_SEND": "Send Invite", - "invitationTable": { - "NAME_AND_EMAIL": "Name & Email", - "POSITION": "Position", - "DATE_AND_TIME_REQUEST": "Date & Time Request", - "CV_OR_ATTACHMENT": "CV / Attachement" - } - }, - "permissions": { - "SELECT_ROLES": "Select Roles" - }, - "unauthorized": { - "TITLE": "Unauthorized", - "HEADING_TITLE": "You are not authorized to access this page !", - "HEADING_DESCRIPTION": "We apologize for the inconvenience, but you are not authorized to access to this page. If you believe this is an error. Please login." - }, - "page404": { - "HEADING_TITLE": "Page not found !", - "HEADING_DESCRIPTION": "We looked, but can't find it .... ", - "LINK_LABEL": "Home" - }, - "offline": { - "HEADING_TITLE": "Network Disconnected!", - "HEADING_DESCRIPTION": "You are currently Offline, please check your internet connection..." - }, - "error": { - "TITLE": "Error !", - "HEADING_TITLE": "Something went wrong !", - "HEADING_DESCRIPTION": "If the problem persists, send a distress signal to our support team." - }, - "maintenance": { - "HEADING_TITLE": "We are Under Maintenance", - "HEADING_DESCRIPTION": "We are currently updating our website to serve you better. Please check back later." - } - }, - "timer": { - "START_TIMER": "Please, select or create a new task to start tracking the time", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Timer Stopped", - "STOPPED_TIMER_TOAST_DESCRIPTION": "Timer Stopped due to Team Switch" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Estimate" - }, - "DAY_LIST": [ - { - "title": "7 days" - }, - { - "title": "14 days" - } - ], - "TIME_ACTIVITY": "Activity", - "TOTAL_HOURS": "Total Hours", - "NO_SCREENSHOOT": "No Screenshoots", - "PERCENT_OF_MINUTES": " % of 10 Minutes", - "APPS": "Apps", - "VISITED_DATES": "Visited Dates", - "PERCENT_USED": "Percent Used", - "TIME_SPENT_IN_HOURS": "Time spent (Hours)", - "THERE_IS_NO_APPS_VISITED": "There is no Apps Visited.", - "OTHER_DETAILS": "Other details", - "KEYBOARD": "keyboard", - "MOUSE": "Mouse", - "TIMES": "Times", - "ACTIVE": "Active", - "INACTIVE": "Inactive", - "ARCHIVED": "Archived", - "NOT_ARCHIVED": "Not archived" - }, - "task": { - "TITLE": "Task", - "ASSIGN_NEW_TASK": "Assign new task", - "ASSIGNED_BY": "Assigned By", - "NO_ONE_FOR_TASK": "No One Assigned to this Task", - "WORKED_TODAY_ON_TASK_TOOLTIP": "worked today on this task for", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "worked on this task for a total of", - "WORKED_TODAY_ON_ALL_TOOLTIP": "worked today on all", - "TASKS_FOR_TOOLTIP": "tasks for", - "taskLabel": { - "WORK_LABEL": "Worked", - "TASK_ASSIGNED": "Assigned", - "TASK_UNASSIGNED": "Unassigned", - "BUTTON_LABEL": "Assign Task" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "This tab shows all tasks you started working on", - "ASSIGNED_DESCRIPTION": "This tab shows all tasks that are assigned to you", - "UNASSIGNED_DESCRIPTION": "This tab shows all tasks that are not assigned to you", - "NO_TASK_USER_ASSIGNED": "No one assigned to this Task" - }, - "taskTableHead": { - "TASK_NAME": "Name", - "TASK_STATUS": "Status", - "TASK_WORK": { - "TITLE": "Worked on", - "DESCRIPTION": "Task", - "LABEL": "Worked on task" - }, - "TASK_TIME": "Estimate", - "TOTAL_WORK": { - "TITLE": "Total Worked", - "DESCRIPTION": "Today", - "LABEL": "Total worked Today" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "How many hours employee worked for total and today on task", - "WORKED_ON_TASK_HEADER_TOOLTIP": "How many hours employee worked today on all tasks for selected Team" - }, - "CONFIRM_CLOSE_TASK": "Please confirm if you want to close the task" - }, - "form": { - "NAME_PLACEHOLDER": "Enter your name", - "FIRST_NAME_PLACEHOLDER": "First Name", - "LAST_NAME_PLACEHOLDER": "Last Name", - "EMAIL_PLACEHOLDER": "Enter your email address", - "PHONE_PLACEHOLDER": "Phone Number", - "ISSUE_NAME_PLACEHOLDER": "Issue name", - "TEAM_NAME_PLACEHOLDER": "Please Enter your team name", - "TASK_INPUT_PLACEHOLDER": "What you working on?", - "TEAM_MEMBER_NAME_PLACEHOLDER": "Team member name", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "Team member email address", - "COMPLETION_DESCRIPTION": "Write the description", - "UPLOAD_FILES": "Upload Files", - "ATTACHMENT_FILE": "Attachment files", - "ADD_COMMENT": "Add Comment here", - "SET_THEME": "Set Theme", - "CHANGE_AVATAR": "Change Avatar", - "SELECT_TEAM_SIZE": "Select Team Size", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric" - }, - "layout": { - "footer": { - "RIGHTS_RESERVED": "All rights reserved.", - "COPY_RIGHT1": "© {{date}}-Present,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Terms of Service", - "PRIVACY_POLICY": "Privacy Policy", - "COOKIES": "Cookie Policy", - "BY": "By" - } - }, - "errors": { - "NETWORK_ISSUE": "network issue, please try again later", - "ERROR_WHILE_VERIFY_CODE": "Error while verifying code.", - "LENGTH_NUMBER_ERROR": "Length should be a number and greater than 0", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric", - "VALID_EMAIL": "Please enter valid email" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Press Enter to validate" - }, - "team": { - "BACK_LABEL": "Back to Team", - "PUBLIC_TEAM": "Public Team", - "PRIVATE_TEAM": "Private Team", - "creation": { - "NEW": "Create new team" - } - }, - "links": { - "common": { - "TASKS": "Tasks", - "TEAM": "Team", - "SETTINGS": "Settings" - } - } -} diff --git a/apps/web/public/locales/es/common.json b/apps/web/public/locales/es/common.json deleted file mode 100644 index c51c6720e..000000000 --- a/apps/web/public/locales/es/common.json +++ /dev/null @@ -1,551 +0,0 @@ -{ - "TITLE": "Equipos Siempre", - "common": { - "ACCEPT": "Aceptar", - "ACCEPTED": "Aceptado", - "REJECT": "Rechazar", - "REJECTED": "Rechazado", - "VERIFY": "verificar", - "INVITE": "Invitar", - "INVITED": "Invitado", - "EXPIRE": "Expira", - "EXPIRED": "Expirado", - "REQUEST": "Solicitar", - "REQUESTED": "Solicitado", - "LABEL": "Etiqueta", - "LABELS": "Etiquetas", - "POSITION": "Posición", - "ROLES": "Roles", - "JOIN_OR_LEFT": "Se unió / Salió", - "PLEASE": "por favor", - "HERE": "aquí", - "PEOPLE": "Gente", - "COLLABORATE": "Colaborar", - "NO": "No", - "ONLY_ME": "Sólo yo", - "YES": "Sí", - "BASIC": "Básico", - "DELETE": "Eliminar", - "MEET": "Reunirse", - "BOARD": "Tablero", - "SECURITY_CODE": "Código de seguridad", - "CONFIRM": "Confirmar", - "YOUR_EMAIL": "tu email", - "CONTINUE": "Continuar", - "EDIT_TASK": "Editar tarea", - "ASSIGN_TASK": "Asignar tarea", - "ASSIGN_TASK_TO": "Asignar tarea a", - "REMOVE_ACCOUNT": "Eliminar cuenta", - "REMOVE_EVERYWHERE": "Eliminar en todas partes", - "DELETE_ACCOUNT": "Eliminar esta cuenta", - "UNASSIGN_TASK": "Desasignar tarea", - "MAKE_A_MANAGER": "Hacer administrador", - "UNMAKE_A_MANAGER": "Quitar como administrador", - "TRANSFERT_OWNERSHIP": "Transferir propiedad", - "TRANSFERT_OWNERSHIP_TO": "Transferir propiedad completa del equipo a otro usuario", - "REMOVE": "Eliminar", - "REMOVE_TEAM": "Eliminar equipo", - "DISPOSE_TEAM": "Eliminar equipo", - "QUIT_TEAM": "Abandonar el equipo", - "QUIT": "Abandonar", - "STATUSES": "Estados", - "RESEND_INVITATION": "Reenviar invitación", - "TODAY": "Hoy", - "TOTAL": "Total", - "ESTIMATED": "Estimado", - "ESTIMATE": "Estimar", - "STATUS": "Estado", - "NAME": "Nombre", - "TASK": "Tarea", - "MY_TASKS": "Mis tareas", - "WORKED_ON_TASK": "Trabajó en tarea", - "TOTAL_WORKED_TODAY": "Total trabajado hoy", - "TOTAL_WORK": "Trabajo de hoy", - "OPEN": "Abierto", - "NOW": "Ahora", - "NEXT": "Siguiente", - "PREV": "Anterior", - "DETAILS": "Detalles", - "CLOSED": "Cerrado", - "CLOSE": "Cerrar", - "USER_NOT_FOUND": "No se encontraron usuarios.", - "TASK_TITTLE": "Título de la tarea", - "PUBLIC_TASK": "Esta tarea es pública", - "PRIVATE_TASK": "Esta tarea es privada", - "PUBLIC_TASK_LABEL": "Hacer pública", - "PRIVATE_TASK_LABEL": "Hacer privada", - "CREATE_TASK": "Crear nueva tarea", - "LINK_TASK": "Seleccionar problema relacionado", - "LINK": "Enlace", - "LINKS": "Enlaces", - "SHOW": "Mostrar", - "ADD_LINK": "Agregar enlaces", - "COMMENT": "Comentario", - "DESCRIPTION": "Descripción", - "CHILD_ISSUE_TASK": "Seleccionar problema secundario", - "CREATE_TEAM": "Crear nuevo equipo", - "VERIFY_ACCOUNT_MSG": "Verifica tu cuenta antes de empezar a usar la aplicación", - "CREATE_ROLE": "Crear rol", - "CREATE": "Crear", - "CREATE_ISSUE": "Crear problema", - "NEW_ISSUE": "Nuevo problema", - "ACTIVATED": "Activado", - "DEACTIVATED": "Desactivado", - "PERIOD": "Período", - "NEW": "Nuevo", - "CREATE_VERSION": "Crear versión", - "VERSION": "Versión", - "LOADING": "Cargando", - "TOTAL_TIME": "Tiempo total", - "LAST_24_HOURS": "Últimas 24 horas", - "WORKED": "Trabajado", - "ASSIGNED": "Asignado", - "SELECT_STATUS": "Seleccionar estado", - "SELECT_ISSUE": "Seleccionar problema", - "UNASSIGNED": "Sin asignar", - "TASK_DETAILS": "Detalles de la tarea", - "TYPE_SOMETHING": "Escribir algo", - "FILTER": "Filtrar", - "APPLY": "Aplicar", - "RESET": "Reiniciar", - "LOGOUT": "Cerrar sesión", - "THEMES": "Temas", - "3D_MODE": "Modo 3D", - "DARK_MODE": "Modo oscuro", - "SETTINGS": "Ajustes", - "PERSONAL": "Personal", - "USE_SETTING": "Usar ajuste", - "TEAM": "Equipo", - "MY_TEAM": "Mi equipo", - "FULL_NAME": "Nombre completo", - "USER_AVATAR": "Avatar de usuario", - "CONTACT": "Contacto", - "ENABLED": "permitir", - "DISABLED": "desactivar", - - "THEME": "Tema", - "TIME_ZONE": "Zona horaria", - "EDIT": "Editar", - "SAVE": "Guardar", - "LANGUAGE": "Idioma", - "DETECT": "Detectar", - "TRANSFER": "Transferir", - "TRANSFER_TEAM": "Transferir equipo", - "TEAM_MEMBERS": "Miembros del equipo", - "NO_TEAM": "Crea tu propio equipo o únete a uno existente", - "NO_TEAM_SUB": "Es genial trabajar con otros, así que ¡crea un equipo e invita a todos a colaborar!", - "NO_TEAM_TOOLTIP": "Necesitas verificar tu dirección de correo electrónico", - "CANCEL": "Cancelar", - "DISCARD": "Descartar", - "EXISTING_MEMBER": "Ya es miembro", - "NEW_MEMBER": "Convertirse en miembro", - "BACK": "Atrás", - "JOIN_REQUEST": "Solicitud para unirse", - "PERMISSION": "Permiso", - "SEARCH": "Buscar", - "ADD_PARENT": "Agregar padre", - "BLOCKS": "Bloques", - "CLONES": "Clones", - "DUPLICATES": "Duplicados", - "IS_BLOCKED_BY": "Está bloqueado por", - "IS_CLONED_BY": "Está clonado por", - "IS_DUPLICATED_BY": "Está duplicado por", - "RELATES_TO": "Relacionado con", - "CHANGE_PARENT": "Cambiar padre", - "RELATED_ISSUES": "Problemas relacionados", - "CHILD_ISSUES": "Problemas secundarios", - "REOPEN": "Reabrir", - "NO_TASKS": "Sin tareas", - "FULL_WIDTH": "Ancho total", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Detén el cronómetro antes de cambiar la tarea", - "COLLABORATE_DIALOG_TITLE": "Iniciar colaboración", - "COLLABORATE_DIALOG_SUB_TITLE": "Invitar miembro(s) y empezar a colaborar", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Iniciar reunión o colaboración en tablero", - "ISSUE_TYPE": "Tipo de problema", - "ACTIVITY": "Actividad", - "FILTER_ALL": "Todo", - "FILTER_COMMENTS": "Comentarios", - "FILTER_HISTORY": "Historial", - "FILTER_UNSUBSCRIBE": "Darse de baja", - "KEYBOARD_SHORTCUTS": "Atajos de teclado", - "GITHUB_LOADING_TEXT": "Estamos instalando su integración de GitHub, espere...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Sincronice automáticamente tareas en su aplicación para actualizaciones fluidas y eficientes.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Sincronice tareas de manera selectiva asociándolas con una etiqueta específica.", - "GITHUB_AUTO_SYNC_LABEL": "Seleccionar etiqueta de sincronización automática" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "Estamos trabajando en la sincronización en tiempo real en este momento; verifique esta función más adelante.", - "ALERT_DELETE_ACCOUNT": "La cuenta será eliminada de todos los equipos, excepto donde eres sólo el administrador", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Tu cuenta será eliminada permanentemente con la eliminación de todos los equipos", - "ALERT_REMOVE_TEAM": "El equipo será eliminado completamente del sistema y los miembros del equipo perderán el acceso", - "ALERT_REMOVE_ALL_DATA": "Se eliminarán todos los datos de las cuentas de todos los equipos en los que usted sea SÓLO uno de los gestores existentes", - "ALERT_QUIT_TEAM": "Estás a punto de abandonar el equipo" - }, - "pages": { - "home": { - "BREADCRUMB": ["Tablero"], - "SENT_EMAIL_VERIFICATION": "Se ha enviado la verificación de código a tu correo electrónico", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "Tienes que", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " tu dirección de correo electrónico. El código de verificación ya debería haber sido enviado a tu correo electrónico, pero siéntete libre de hacer clic en", - "SENT_EMAIL_VERIFICATION_RESEND": " para reenviar el código, si no lo recibiste.", - "INVITATIONS": "Has sido invitado a unirte a", - "CONFIRM_ACCEPT_INVITATION": "¿Estás seguro de que deseas aceptar la invitación?", - "CONFIRM_REJECT_INVITATION": "¿Estás seguro de que deseas rechazar la invitación?" - }, - "profile": { - "BREADCRUMB": ["Tareas de miembro"] - }, - "taskDetails": { - "BREADCRUMB": ["Detalles de la tarea"], - "DESCRIPTION": "Descripciones", - "ADD_DESCRIPTION": "Agregar descripción aquí", - "TYPE_OF_ISSUE": "Tipo de problema", - "CREATOR": "Creador", - "ASSIGNEES": "Asignados", - "START_DATE": "Fecha de inicio", - "DUE_DATE": "Fecha de entrega", - "DAYS_REMAINING": "Días restantes", - "VERSION": "Versión", - "EPIC": "Épico", - "STATUS": "Estado", - "LABEL": "Etiqueta", - "LABELS": "Etiquetas", - "SIZE": "Tamaño", - "PRIORITY": "Prioridad", - "ESTIMATIONS": "Estimaciones", - "PROGRESS": "Progreso", - "TOTAL_TIME": "Tiempo total", - "TIME_TODAY": "Tiempo hoy", - "TOTAL_GROUP_TIME": "Tiempo total del grupo", - "TIME_REMAINING": "Tiempo restante", - "CREATED": "Creado", - "UPDATED": "Actualizado", - "RESOLVED": "Resuelto", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "No pudimos actualizar el título de la tarea.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "El título de la tarea no puede exceder 255 caracteres.", - "TASK_IS_ALREADY_EPIC": "La tarea de tipo Épico no se puede cambiar.", - "TASK_HAS_PARENT": "El tipo de tarea no se puede cambiar porque la tarea ya tiene un padre." - }, - "auth": { - "SEND_CODE": "enviar código", - "JOIN": "Unirse", - "UNRECEIVED_CODE": "¿No recibiste el código?", - "JOIN_TEAM": "Unirse al equipo", - "INPUT_INVITE_CODE": "Ingresar código de invitación.", - "INPUT_INVITE_CODE_DESC": "Ingresa el código de invitación que enviamos a tu correo electrónico.", - "INVALID_INVITE_CODE_MESSAGE": "Código inválido", - "WELCOME_TEAMS": "Bienvenido a Equipos Siempre", - "COVER_TITLE": "¡Sigue el progreso del trabajo de tus equipos en tiempo real!", - "COVER_DESCRIPTION": "Gestión todo en uno del trabajo y la fuerza laboral, gestión del tiempo, seguimiento del tiempo, seguimiento de actividades, seguimiento y métricas de productividad, gestión de proyectos/tareas y problemas, organizaciones y equipos, integraciones (GitHub, JIRA,...) ¡y más!", - "LOGIN": "Iniciar sesión", - "SELECT_WORKSPACE": "Seleccionar espacio de trabajo", - "ENTER_EMAIL": "Ingresar correo electrónico", - "WORKSPACES_NOT_FOUND": "Espacios de trabajo no encontrados" - }, - "authPasscode": { - "HEADING_TITLE": "Unirse a equipo existente", - "HEADING_DESCRIPTION": "Por favor ingrese el correo electrónico y el código de invitación para unirse al equipo existente." - }, - "authLogin": { - "HEADING_TITLE": "Iniciar sesión en el equipo", - "HEADING_DESCRIPTION": "Por favor ingrese el correo electrónico y el código de invitación para iniciar sesión.", - "WORKSPACE": "Espacio de trabajo", - "HEADING_WORKSPACE_LINE1": "El correo electrónico asociado con múltiples espacios de trabajo,", - "HEADING_WORKSPACE_LINE2": "por favor seleccione uno para continuar" - }, - "authTeam": { - "HEADING_TITLE": "Crear nuevo equipo", - "HEADING_DESCRIPTION": "Por favor ingrese los detalles de su equipo para crear un nuevo equipo.", - "LOADING_TEXT": "Ahora estamos creando su nuevo lugar de trabajo, espere...", - "VERIFY_EMAIL_LOADING_TEXT": "Estamos verificando su correo electrónico, espere...", - "INPUT_TEAM_NAME": "Ingrese el nombre de su equipo", - "JOIN_EXISTING_TEAM": "¿Unirse a un equipo existente?", - "CREATE_FIRST_TEAM": "Crea tu primer equipo", - "CREATE_TEAM": "Crear equipo" - }, - "settings": { - "BREADCRUMB": [ - { - "title": "Tablero", - "href": "/" - }, - "Ajustes" - ], - "DANDER_ZONE": "Zona de peligro", - "HEADING_DESCRIPTION": "Configurar y administrar su tablero personal aquí", - "ARE_YOU_SURE_TO_DELETE_USER": "¿Estás seguro de que deseas eliminar este usuario?" - }, - "settingsPersonal": { - "HEADING_TITLE": "Ajustes generales", - "emailNotValid": "Por favor provea un Email válido", - "phoneNotValid": "Por favor provea un Número de Teléfono válido", - "WORK_SCHEDULE": "Horario de trabajo", - "SUBSCRIPTION": "Suscripción", - "ABOUT_TO_CHANGE_EMAIL": "Estás a punto de cambiar el Email", - "ABOUT_TO_DELETE_ACCOUNT": "Estás a punto de Eliminar tu cuenta ?", - "DATA_SYNCHRONIZATION": "Sincronización de datos", - "ABOUT_TO_REMOVE_ACCOUNT": "Estás a punto de Eliminar tu cuenta ?", - "TIMEZONE_SEARCH_PLACEHOLDER": "Tu zona horaria", - "ABOUT_TO_REMOVE_FROM_ALL_TEAMS": "¿Estás a punto de ser eliminado de todos los equipos, a menos que seas el único entrenador?", - "ABOUT_TO_DELETE_ALL_ACCOUNT_DATA": "¿Estás a punto de eliminar tu cuenta y todos tus datos?" - }, - "settingsTeam": { - "HEADING_TITLE": "Ajustes generales", - "MEMBER_HEADING_TITLE": "Miembros", - "PRIORITIES_HEADING": "Prioridades", - "NOTIFICATION_HEADING": "Notificaciones", - "SIZES_HEADING": "Tamaños", - "TEAM_NAME": "Nombre del equipo", - "TEAM_TYPE": "Tipo de equipo", - "TIME_TRACKING": "Seguimiento de tiempo", - "ADD_NEW_MEMBER": "Agregar nuevo miembro", - "MANAGE_ASSIGNEES": "Administrar asignados", - "SEARCH_MEMBER": "Buscar miembro", - "TASK_STATUSES": "Estados de las tareas", - "TASK_PRIORITIES": "Prioridades de las tareas", - "TASK_SIZES": "Tamaños de las tareas", - "TASK_LABELS": "Etiquetas de las tareas", - "ISSUE_TYPES": "Tipos de problemas", - "RELATED_TYPE": "Tipos relacionados", - "INVITATION_HEADING_TITLE": "Invitaciones", - "CREATE_NEW_STATUSES": "Crear nuevos estados", - "CREATE_NEW_STATUS": "Crear nuevo estado", - "CREATE_NEW_VERSION": "Crear nueva versión", - "CREATE_NEW_PRIORITIES": "Crear nuevas prioridades", - "CREATE_NEW_PRIORITY": "Crear nueva prioridad", - "CREATE_NEW_SIZE": "Crear nuevo tamaño", - "CREATE_NEW_LABELS": "Crear nuevas etiquetas", - "CREATE_NEW_LABEL": "Crear nueva etiqueta", - "CREATE_NEW_ISSUE_TYPES": "Crear nuevos tipos de problemas", - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Ocultar información personal de los miembros", - "POSITION_CUSTOM": "Posiciones personalizadas", - "INVITATION_EXPIRATION": "Expiración de la invitación", - "NOTIFY_IF": "Notificar si", - "TEAM_REQUEST": "Solicitud de equipo", - "WORK_SCHEDULE": "Horario de trabajo", - "MEMBER_AND_ROLES": "Miembros y roles", - "INTEGRATIONS": "Integraciones", - "DANDER_ZONES": "Zonas de peligro", - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Conéctate con GitHub y comienza a sincronizar los problemas de GitHub con tu equipo", - "SELECT_REPOSITORY": "Seleccionar repositorio", - "INSTALL": "Instalar", - "LIST_OF_STATUSES": "Lista de estados", - "LIST_OF_PRIORITIES": "Lista de prioridades", - "LIST_OF_SIZES": "Lista de tamaños", - "LIST_OF_LABELS": "Lista de etiquetas", - "LIST_OF_ISSUES_TYPE": "Lista de tipos de problemas", - "GENERAL": "General", - "SOUND": "Sonido", - "EMAIL": "Correo electrónico", - "USERS": "Usuarios", - "TASKS": "Tareas", - "SYSTEM": "Sistema", - "SECURITY": "Seguridad", - "INAPP": "En la aplicación", - "NOTIFICATION_HEADING_TITLE": "Ajustes de notificaciones", - "ISSUE_HEADING_TITLE": "Ajustes de problemas", - "TASK_PRIVACY": "Privacidad de la tarea", - "MULTIPLE_ASSIGNEES": "Múltiples asignados", - "MANUAL_TIME": "Tiempo manual", - "GROUP_ESTIMATION": "Estimación en grupo", - "ESTIMATION_IN_HOURS": "Estimación en horas", - "ESTIMATION_IN_STORY_POINTS": "Estimación en puntos", - "PROOF_OF_COMPLETION": "Evidencia de finalización", - "LINKED_ISSUES": "Problemas vinculados", - "COMMENTS": "Comentarios", - "HISTORY": "Historial", - "ACCEPTANCE_CRITERIA": "Criterios de aceptación", - "DRAFT_ISSUES": "Borradores de problemas", - "AUTO_CLOSE_ISSUE": "Cerrar problema automáticamente", - "AUTO_ARCHIVE_ISSUE": "Archivar problema automáticamente", - "AUTO_STATUS": "Estado automático", - "VERSIONS": "Versiones", - "LIST_OF_VERSONS": "Lista de versiones", - "ISSUETYPE": "Tipos de problemas", - "LIST_OF_ISSUES": "Lista de problemas", - "RELATED_ISSUE_TYPE": "Tipos de problemas relacionados", - "LIST_OF_RELATED_TYPE": "Lista de tipos relacionados", - "INITIAL": "Inicial", - "COPY_NUMBER": "Número de copia", - "IN_PROGRESS": "En progreso", - "FINAL": "Final", - "DISPOSE_TEAM": "Estás a punto de eliminar el equipo ?", - "QUIT_TEAM": "Estás a punto de abandonar el equipo ?", - "TEAM_COLOR": "Color del equipo", - "TEAM_SIZE": "Tamaño del equipo", - "EMOJI": "Emoticono", - "ISSUES_HEADING_TITLE": "Ajustes de problemas", - "TRACK_TIME": "Seguimiento de tiempo", - "ESTIMATE_ISSUE": "Estimar problema", - "EPICS_CREATE_CLOSE": "Crear/cerrar épicos", - "ISSUE_CREATE_CLOSE": "Crear/cerrar problemas", - "ISSUE_ASSIGN_UNASSIGN": "Asignar/desasignar problemas", - "INVITE_MEMBERS": "Invitar miembros", - "REMOVE_MEMBERS": "Eliminar miembros", - "HANDLE_REQUESTS": "Manejar solicitudes", - "ROLES_POSITIONS_CHANGE": "Cambios de roles/posiciones", - "VIEW_DETAILS": "Ver detalles", - "NO_INVITATIONS": "¡No hay invitaciones en este momento!", - "NO_MEMBERS": "¡No hay miembros en este momento!" - }, - "invite": { - "HEADING_TITLE": "Invitar miembro a tu equipo", - "HEADING_DESCRIPTION": "Enviar invitación a un miembro del equipo por correo electrónico", - "TEAM_MEMBER_EMAIL": "Correo electrónico del miembro del equipo", - "TEAM_MEMBER_FULLNAME": "Nombre completo del miembro del equipo", - "SEND_INVITE": "Enviar invitación", - "ERROR_WHILE_ACCEPTING_INVITATION": "Error al aceptar la invitación", - "ERROR_WHILE_REJECTING_INVITATION": "Error al rechazar la invitación", - "INVITE_LABEL_SEND": "Enviar invitación", - "invitationTable": { - "NAME_AND_EMAIL": "Nombre y correo electrónico", - "POSITION": "Posición", - "DATE_AND_TIME_REQUEST": "Fecha y hora de solicitud", - "CV_OR_ATTACHMENT": "CV / Archivo adjunto" - } - }, - "permissions": { - "SELECT_ROLES": "Seleccionar roles" - }, - "unauthorized": { - "TITLE": "No autorizado", - "HEADING_TITLE": "No tiene permisos para acceder a esta página !", - "HEADING_DESCRIPTION": "Lamentamos las molestias, pero no está autorizado a acceder a esta página. Si crees que esto es un error. Por favor Iniciar sesión." - }, - "page404": { - "HEADING_TITLE": "No encontrado", - "HEADING_DESCRIPTION": "¡El recurso que buscas no se encuentra!", - "LINK_LABEL": "Ir a la página de inicio" - }, - "offline": { - "HEADING_TITLE": "¡Red Desconectada!", - "HEADING_DESCRIPTION": "Actualmente estás desconectado, por favor verifica tu conexión a Internet..." - }, - "error": { - "TITLE": "Error !", - "HEADING_TITLE": "Algo salió mal !", - "HEADING_DESCRIPTION": "Si el problema persiste, envíe una señal de socorro a nuestro equipo de soporte." - }, - "maintenance": { - "HEADING_TITLE": "Estamos en Mantenimiento", - "HEADING_DESCRIPTION": "Actualmente estamos actualizando nuestro sitio web para brindarle un mejor servicio. Por favor, vuelva más tarde." - } - }, - "timer": { - "START_TIMER": "Por favor, selecciona o crea una nueva tarea para comenzar a rastrear el tiempo", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Temporizador detenido", - "STOPPED_TIMER_TOAST_DESCRIPTION": "Temporizador detenido debido al cambio de equipo" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Estimar" - }, - "DAY_LIST": [ - { - "title": "7 días" - }, - { - "title": "14 días" - } - ] - }, - "task": { - "TITLE": "Tarea", - "ASSIGN_NEW_TASK": "Asignar nueva tarea", - "ASSIGNED_BY": "Asignado por", - "NO_ONE_FOR_TASK": "Nadie asignado a esta tarea", - "WORKED_TODAY_ON_TASK_TOOLTIP": "trabajó hoy en esta tarea durante", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "trabajó en esta tarea durante un total de", - "WORKED_TODAY_ON_ALL_TOOLTIP": "trabajó hoy en todas", - "TASKS_FOR_TOOLTIP": "tareas para", - "taskLabel": { - "WORK_LABEL": "Trabajado", - "TASK_ASSIGNED": "Asignado", - "TASK_UNASSIGNED": "Sin asignar", - "BUTTON_LABEL": "Asignar tarea" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "Esta pestaña muestra todas las tareas en las que comenzaste a trabajar", - "ASSIGNED_DESCRIPTION": "Esta pestaña muestra todas las tareas que te han sido asignadas", - "UNASSIGNED_DESCRIPTION": "Esta pestaña muestra todas las tareas que no te han sido asignadas", - "NO_TASK_USER_ASSIGNED": "Nadie asignado a esta tarea" - }, - "taskTableHead": { - "TASK_NAME": "Nombre", - "TASK_STATUS": "Estado", - "TASK_WORK": { - "TITLE": "Trabajado en", - "DESCRIPTION": "Tarea", - "LABEL": "Trabajado en tarea" - }, - "TASK_TIME": "Estimación", - "TOTAL_WORK": { - "TITLE": "Total trabajado", - "DESCRIPTION": "Hoy", - "LABEL": "Total trabajado hoy" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Cuántas horas trabajó el empleado en total y hoy en la tarea", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Cuántas horas trabajó el empleado hoy en todas las tareas para el equipo seleccionado" - }, - "CONFIRM_CLOSE_TASK": "Por favor, confirma si deseas cerrar la tarea" - }, - "form": { - "NAME_PLACEHOLDER": "Ingresa tu nombre", - "FIRST_NAME_PLACEHOLDER": "Nombre", - "LAST_NAME_PLACEHOLDER": "Apellido", - "EMAIL_PLACEHOLDER": "Ingresa tu dirección de correo electrónico", - "PHONE_PLACEHOLDER": "Número de teléfono", - "ISSUE_NAME_PLACEHOLDER": "Nombre del problema", - "TEAM_NAME_PLACEHOLDER": "Ingresa el nombre de tu equipo", - "TASK_INPUT_PLACEHOLDER": "¿En qué estás trabajando?", - "TEAM_MEMBER_NAME_PLACEHOLDER": "Nombre del miembro del equipo", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "Dirección de correo electrónico del miembro del equipo", - "COMPLETION_DESCRIPTION": "Escribe la descripción", - "UPLOAD_FILES": "Subir archivos", - "ATTACHMENT_FILE": "Archivos adjuntos", - "ADD_COMMENT": "Agregar comentario aquí", - "SET_THEME": "Establecer tema", - "CHANGE_AVATAR": "Cambiar avatar", - "SELECT_TEAM_SIZE": "Seleccionar tamaño de equipo", - "INVALID_ALLOWED_CHARACTER": "Valor no válido para allowedCharacters. Use alfa, numérico o alfanumérico" - }, - "layout": { - "footer": { - "RIGHTS_RESERVED": "Todos los derechos reservados.", - "COPY_RIGHT1": "© {{date}}-Presente,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Términos del servicio", - "PRIVACY_POLICY": "Política de privacidad", - "COOKIES": "Política de cookies", - "BY": "Por" - } - }, - "errors": { - "NETWORK_ISSUE": "problema de red, por favor intente más tarde", - "ERROR_WHILE_VERIFY_CODE": "Error al verificar el código.", - "LENGTH_NUMBER_ERROR": "La longitud debe ser un número y mayor que 0", - "INVALID_ALLOWED_CHARACTER": "Valor no válido para allowedCharacters. Use alfa, numérico o alfanumérico", - "VALID_EMAIL": "Por favor ingrese un correo electrónico válido" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Presione Enter para validar" - }, - "team": { - "BACK_LABEL": "Volver al equipo", - "PUBLIC_TEAM": "Equipo público", - "PRIVATE_TEAM": "Equipo privado", - "creation": { - "NEW": "Crear nuevo equipo" - } - }, - "links": { - "common": { - "TASKS": "Tareas", - "TEAM": "Equipo", - "SETTINGS": "Ajustes" - } - } -} diff --git a/apps/web/public/locales/fr/common.json b/apps/web/public/locales/fr/common.json deleted file mode 100644 index 3aaeaf1e5..000000000 --- a/apps/web/public/locales/fr/common.json +++ /dev/null @@ -1,563 +0,0 @@ -{ - "TITLE": "Ever Teams", - "common": { - "ACCEPT": "Accepter", - "ACCEPTED": "Accepté", - "REJECT": "Rejeter", - "REJECTED": "Rejeté", - "VERIFY": "Vérifier", - "INVITE": "Inviter", - "INVITED": "Invité", - "EXPIRE": "Expirer", - "EXPIRED": "Expiré", - "REQUEST": "Demander", - "REQUESTED": "Demandé", - "LABEL": "Étiquette", - "LABELS": "Étiquettes", - "POSITION": "Position", - "ROLES": "Rôles", - "JOIN_OR_LEFT": "Rejoint / Quitte", - "PLEASE": "S'il vous plaît", - "HERE": "ici", - "PEOPLE": "Personnes", - "COLLABORATE": "Collaborer", - "NO": "Non", - "ONLY_ME": "Seulement moi", - "YES": "Oui", - "BASIC": "Basique", - "DELETE": "Supprimer", - "MEET": "Rencontrer", - "BOARD": "Tableau", - "SECURITY_CODE": "Code de sécurité", - "CONFIRM": "Confirmer", - "YOUR_EMAIL": "votre email", - "CONTINUE": "Continuer", - "EDIT_TASK": "Modifier la tâche", - "ASSIGN_TASK": "Assigner la tâche", - "ASSIGN_TASK_TO": "Assigner la tâche", - "REMOVE_ACCOUNT": "Supprimer le compte", - "REMOVE_EVERYWHERE": "Supprimer partout", - "DELETE_ACCOUNT": "Supprimer ce compte", - "UNASSIGN_TASK": "Désassigner la tâche", - "MAKE_A_MANAGER": "Nommer un gestionnaire", - "UNMAKE_A_MANAGER": "Retirer le statut de gestionnaire", - "TRANSFERT_OWNERSHIP": "Transférer la propriété", - "TRANSFERT_OWNERSHIP_TO": "Transférer la propriété complète de l'équipe à un autre utilisateur", - "REMOVE": "Supprimer", - "REMOVE_TEAM": "Supprimer l'équipe", - "DISPOSE_TEAM": "Disposer de l'équipe", - "QUIT_TEAM": "Quitter l'équipe", - "QUIT": "Quitter", - "STATUSES": "Statuts", - "RESEND_INVITATION": "Renvoyer l'invitation", - "TODAY": "Aujourd'hui", - "TOTAL": "Total", - "ESTIMATED": "Estimé", - "ESTIMATE": "Estimation", - "STATUS": "Statut", - "NAME": "Nom", - "TASK": "Tâche", - "MY_TASKS": "Mes tâches", - "WORKED_ON_TASK": "Travaillé sur la tâche", - "TOTAL_WORKED_TODAY": "Total travaillé aujourd'hui", - "TOTAL_WORK": "Travail d'aujourd'hui", - "OPEN": "Ouvert", - "NOW": "Maintenant", - "NEXT": "Suivant", - "PREV": "Précédent", - "DETAILS": "Détails", - "CLOSED": "Fermé", - "CLOSE": "Fermer", - "USER_NOT_FOUND": "Aucun utilisateur trouvé.", - "TASK_TITTLE": "Titre de la tâche", - "PUBLIC_TASK": "Cette tâche est publique", - "PRIVATE_TASK": "Cette tâche est privée", - "PUBLIC_TASK_LABEL": "Rendre publique", - "PRIVATE_TASK_LABEL": "Rendre privée", - "CREATE_TASK": "Créer une nouvelle tâche", - "LINK_TASK": "Sélectionner un problème lié", - "LINK": "Lien", - "LINKS": "Liens", - "SHOW": "Afficher", - "ADD_LINK": "Ajouter des liens", - "COMMENT": "Commentaire", - "DESCRIPTION": "Description", - "CHILD_ISSUE_TASK": "Sélectionner un problème enfant", - "CREATE_TEAM": "Créer une nouvelle équipe", - "VERIFY_ACCOUNT_MSG": "Veuillez vérifier votre compte avant de commencer à utiliser l'application", - "CREATE_ROLE": "Créer un rôle", - "CREATE": "Créer", - "CREATE_ISSUE": "Créer un problème", - "NEW_ISSUE": "Nouveau problème", - "ACTIVATED": "Activé", - "DEACTIVATED": "Activé", - "PERIOD": "Période", - "NEW": "Nouveau", - "CREATE_VERSION": "Créer une version", - "VERSION": "Version", - "LOADING": "Chargement", - "TOTAL_TIME": "Temps total", - "LAST_24_HOURS": "Dernières 24 heures", - "WORKED": "Travaillé", - "ASSIGNED": "Assigné", - "SELECT_STATUS": "Sélectionner un statut", - "SELECT_ISSUE": "Sélectionner un problème", - "UNASSIGNED": "Non assigné", - "TASK_DETAILS": "Détails de la tâche", - "TYPE_SOMETHING": "Tapez quelque chose", - "FILTER": "Filtrer", - "APPLY": "Appliquer", - "RESET": "Réinitialiser", - "LOGOUT": "Déconnexion", - "THEMES": "Thèmes", - "3D_MODE": "Mode 3D", - "DARK_MODE": "Mode sombre", - "SETTINGS": "Paramètres", - "PERSONAL": "Personnel", - "USE_SETTING": "Utiliser les paramètres", - "TEAM": "Équipe", - "MY_TEAM": "Mon équipe", - "FULL_NAME": "Nom complet", - "USER_AVATAR": "Avatar utilisateur", - "CONTACT": "Contact", - "ENABLED": "Activer", - "DISABLED": "Désactiver", - "THEME": "Thème", - "TIME_ZONE": "Fuseau horaire", - "EDIT": "Modifier", - "SAVE": "Enregistrer", - "LANGUAGE": "Langue", - "DETECT": "Détecter", - "TRANSFER": "Transférer", - "TRANSFER_TEAM": "Transférer l'équipe", - "TEAM_MEMBERS": "Membres de l'équipe", - "NO_TEAM": "Créez votre propre équipe ou rejoignez une équipe existante", - "NO_TEAM_SUB": "Il est génial de travailler avec d'autres, alors créez une équipe et invitez tout le monde à collaborer !", - "NO_TEAM_TOOLTIP": "Vous devez vérifier votre adresse e-mail", - "CANCEL": "Annuler", - "DISCARD": "Annuler", - "EXISTING_MEMBER": "Déjà membre", - "NEW_MEMBER": "Devenir membre", - "BACK": "Retour", - "JOIN_REQUEST": "Demande de rejoindre", - "PERMISSION": "Permission", - "SEARCH": "Rechercher", - "ADD_PARENT": "Ajouter un parent", - "BLOCKS": "Bloque", - "CLONES": "Clone", - "DUPLICATES": "Duplique", - "IS_BLOCKED_BY": "Bloqué par", - "IS_CLONED_BY": "Cloné par", - "IS_DUPLICATED_BY": "Dupliqué par", - "RELATES_TO": "Se rapporte à", - "CHANGE_PARENT": "Changer de parent", - "RELATED_ISSUES": "Problèmes liés", - "CHILD_ISSUES": "Problèmes enfants", - "REOPEN": "Rouvrir", - "NO_TASKS": "Aucune tâche", - "FULL_WIDTH": "Pleine largeur", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Veuillez arrêter la minuterie avant de modifier la tâche", - - "COLLABORATE_DIALOG_TITLE": "Démarrer la collaboration", - "COLLABORATE_DIALOG_SUB_TITLE": "Inviter des membres et commencer la collaboration", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Démarrer la collaboration avec une réunion ou un tableau", - "ISSUE_TYPE": "Type de problème", - "ACTIVITY": "Activité", - "FILTER_ALL": "Tout", - "FILTER_COMMENTS": "Commentaires", - "FILTER_HISTORY": "Historique", - "FILTER_UNSUBSCRIBE": "Se désabonner", - - "KEYBOARD_SHORTCUTS": "Raccourcis clavier", - "GITHUB_LOADING_TEXT": "Nous installons actuellement votre intégration GitHub, veuillez patienter...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Synchronisez automatiquement les tâches dans votre application pour des mises à jour fluides et efficaces.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchronisez sélectivement les tâches en les associant à une étiquette spécifique.", - "GITHUB_AUTO_SYNC_LABEL": "Sélectionner l'étiquette de synchronisation automatique" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "Nous travaillons actuellement sur la synchronisation en temps réel, veuillez vérifier cette fonctionnalité plus tard.", - "ALERT_DELETE_ACCOUNT": "Le compte sera supprimé de toutes les équipes, sauf si vous êtes uniquement le gestionnaire", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Votre compte sera supprimé définitivement avec suppression de toutes les équipes", - "ALERT_REMOVE_TEAM": "L'équipe sera complètement supprimée du système et les membres de l'équipe perdront l'accès", - "ALERT_REMOVE_ALL_DATA": "Toutes les données de compte seront supprimées de toutes les équipes dans lesquelles vous n'êtes qu'un seul gestionnaire existant.", - "ALERT_QUIT_TEAM": "Vous êtes sur le point de quitter l'équipe" - }, - "pages": { - "home": { - "BREADCRUMB": ["Tableau de bord"], - "SENT_EMAIL_VERIFICATION": "Le code de vérification a été envoyé à votre adresse e-mail", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "Vous devez ", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " votre adresse e-mail. Le code de vérification a déjà été envoyé à votre adresse e-mail, mais n'hésitez pas à cliquer sur ", - "SENT_EMAIL_VERIFICATION_RESEND": " pour renvoyer le code si vous ne l'avez pas reçu.", - "INVITATIONS": "Vous avez été invité à rejoindre", - "CONFIRM_ACCEPT_INVITATION": "Êtes-vous sûr de vouloir accepter l'invitation ?", - "CONFIRM_REJECT_INVITATION": "Êtes-vous sûr de vouloir refuser l'invitation ?" - }, - "profile": { - "BREADCRUMB": ["Tâches du membre"] - }, - "taskDetails": { - "BREADCRUMB": ["Détails de la tâche"], - "DESCRIPTION": "Description", - "ADD_DESCRIPTION": "Ajouter une description ici", - "TYPE_OF_ISSUE": "Type de problème", - "CREATOR": "Créateur", - "ASSIGNEES": "Assignés", - "START_DATE": "Date de début", - "DUE_DATE": "Date limite", - "DAYS_REMAINING": "Jours restants", - "VERSION": "Version", - "EPIC": "Épique", - "STATUS": "Statut", - "LABEL": "Étiquette", - "LABELS": "Étiquettes", - "SIZE": "Taille", - "PRIORITY": "Priorité", - "ESTIMATIONS": "Estimations", - "PROGRESS": "Progression", - "TOTAL_TIME": "Temps total", - "TIME_TODAY": "Temps aujourd'hui", - "TOTAL_GROUP_TIME": "Temps total du groupe", - "TIME_REMAINING": "Temps restant", - "CREATED": "Créé", - "UPDATED": "Mis à jour", - "RESOLVED": "Résolu", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "Impossible de mettre à jour le titre de la tâche.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "Le titre de la tâche ne peut pas dépasser 255 caractères.", - - "TASK_IS_ALREADY_EPIC": "Le type de tâche épique ne peut pas être modifié.", - "TASK_HAS_PARENT": "Le type de tâche ne peut pas être modifié car la tâche a déjà un parent." - }, - "auth": { - "SEND_CODE": "envoyer le code", - "JOIN": "Joindre", - "UNRECEIVED_CODE": "Vous n'avez pas reçu de code ?", - "JOIN_TEAM": "Rejoindre l'équipe", - "INPUT_INVITE_CODE": "Saisissez le code d'invitation.", - "INPUT_INVITE_CODE_DESC": "Entrez le code d'invitation que nous avons envoyé à votre adresse e-mail.", - "INVALID_INVITE_CODE_MESSAGE": "Code invalide", - "WELCOME_TEAMS": "Bienvenue sur Ever Teams", - - "COVER_TITLE": "Suivez en temps réel le progrès du travail de vos équipes !", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Connexion", - "SELECT_WORKSPACE": "Sélectionner un espace de travail", - "ENTER_EMAIL": "Saisissez votre adresse e-mail", - "WORKSPACES_NOT_FOUND": "Aucun espace de travail trouvé" - }, - "authPasscode": { - "HEADING_TITLE": "Rejoindre une équipe existante", - "HEADING_DESCRIPTION": "Veuillez entrer votre adresse e-mail et le code d'invitation pour rejoindre une équipe existante." - }, - "authLogin": { - "HEADING_TITLE": "Se connecter à l'équipe", - "HEADING_DESCRIPTION": "Veuillez entrer votre adresse e-mail et le code d'invitation pour vous connecter.", - - "WORKSPACE": "Espace de travail", - "HEADING_WORKSPACE_LINE1": "L'adresse e-mail est associée à plusieurs espaces de travail,", - "HEADING_WORKSPACE_LINE2": "veuillez en sélectionner un pour continuer." - }, - "authTeam": { - "HEADING_TITLE": "Créer une nouvelle équipe", - "HEADING_DESCRIPTION": "Veuillez entrer les détails de votre équipe pour créer une nouvelle équipe.", - "LOADING_TEXT": "Nous créons maintenant votre nouvel espace de travail, patientez...", - "VERIFY_EMAIL_LOADING_TEXT": "Nous vérifions votre e-mail, patientez...", - "INPUT_TEAM_NAME": "Saisissez le nom de votre équipe", - "JOIN_EXISTING_TEAM": "Rejoindre une équipe existante ?", - "CREATE_FIRST_TEAM": "Créer votre première équipe", - "CREATE_TEAM": "Créer une équipe" - }, - "settings": { - "BREADCRUMB": [{ "title": "Tableau de bord", "href": "/" }, "Paramètres"], - "DANDER_ZONE": "Zone de danger", - "HEADING_DESCRIPTION": "Paramétrez et gérez votre tableau de bord personnel ici", - "ARE_YOU_SURE_TO_DELETE_USER": "Êtes-vous sûr de vouloir supprimer cet utilisateur ?" - }, - "settingsPersonal": { - "HEADING_TITLE": "Paramètres généraux", - "emailNotValid": "Veuillez fournir une adresse e-mail valide", - "phoneNotValid": "Veuillez fournir un numéro de téléphone valide", - "WORK_SCHEDULE": "Calendrier de travail", - "SUBSCRIPTION": "Abonnement", - "ABOUT_TO_CHANGE_EMAIL": "Vous êtes sur le point de changer d'e-mail", - "ABOUT_TO_DELETE_ACCOUNT": "Vous êtes sur le point de supprimer votre compte ?", - "DATA_SYNCHRONIZATION": "Synchronisation des données", - "ABOUT_TO_REMOVE_ACCOUNT": "Vous êtes sur le point de supprimer votre compte ?", - "TIMEZONE_SEARCH_PLACEHOLDER": "Votre fuseau horaire", - "ABOUT_TO_REMOVE_FROM_ALL_TEAMS": "Vous êtes sur le point d'être retiré de toutes les équipes, à moins que vous ne soyez le seul manager ?", - "ABOUT_TO_DELETE_ALL_ACCOUNT_DATA": "Vous êtes sur le point de supprimer votre compte et toutes vos données ?" - }, - "settingsTeam": { - "HEADING_TITLE": "Paramètres généraux", - "MEMBER_HEADING_TITLE": "Membres", - "PRIORITIES_HEADING": "Priorités", - "NOTIFICATION_HEADING": "Notifications", - "SIZES_HEADING": "Tailles", - "TEAM_NAME": "Nom de l'équipe", - "TEAM_TYPE": "Type d'équipe", - "TIME_TRACKING": "Suivi du temps", - - "ADD_NEW_MEMBER": "Ajouter un nouveau membre", - "MANAGE_ASSIGNEES": "Gérer les personnes assignées", - "SEARCH_MEMBER": "Rechercher un membre", - "TASK_STATUSES": "Statuts des tâches", - "TASK_PRIORITIES": "Priorités des tâches", - "TASK_SIZES": "Tailles des tâches", - "TASK_LABELS": "Étiquettes des tâches", - "ISSUE_TYPES": "Types de problèmes", - "RELATED_TYPE": "Type connexe", - - "INVITATION_HEADING_TITLE": "Invitations", - "CREATE_NEW_STATUSES": "Créer de nouveaux statuts", - "CREATE_NEW_STATUS": "Créer un nouveau statut", - "CREATE_NEW_VERSION": "Créer une nouvelle version", - "CREATE_NEW_PRIORITIES": "Créer de nouvelles priorités", - "CREATE_NEW_PRIORITY": "Créer une nouvelle priorité", - "CREATE_NEW_SIZES": "Créer de nouvelles tailles", - "CREATE_NEW_SIZE": "Créer une nouvelle taille", - "CREATE_NEW_LABELS": "Créer de nouvelles étiquettes", - "CREATE_NEW_LABEL": "Créer une nouvelle étiquette", - "CREATE_NEW_ISSUE_TYPES": "Créer de nouveaux problèmes", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Masquer les informations personnelles des membres", - "POSITION_CUSTOM": "Positions personnalisées", - "INVITATION_EXPIRATION": "Expiration de l'invitation", - "NOTIFY_IF": "Notifier si", - "TEAM_REQUEST": "Demande d'équipe", - "WORK_SCHEDULE": "Calendrier de travail", - "MEMBER_AND_ROLES": "Membres et rôles", - "INTEGRATIONS": "Intégrations", - "DANDER_ZONES": "Zones à risque", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Connectez-vous à GitHub et commencez à synchroniser les problèmes GitHub avec votre équipe", - "SELECT_REPOSITORY": "Sélectionner un dépôt", - - "INSTALL": "Installer", - - "LIST_OF_STATUSES": "Liste des statuts", - "LIST_OF_PRIORITIES": "Liste des priorités", - "LIST_OF_SIZES": "Liste des tailles", - "LIST_OF_LABELS": "Liste des étiquettes", - "LIST_OF_ISSUES_TYPE": "Liste des problèmes", - - "GENERAL": "Général", - "SOUND": "Son", - "EMAIL": "E-mail", - "USERS": "Utilisateurs", - "TASKS": "Tâches", - "SYSTEM": "Système", - "SECURITY": "Sécurité", - "INAPP": "Dans l'application", - "NOTIFICATION_HEADING_TITLE": "Paramètres de notification", - "ISSUE_HEADING_TITLE": "Paramètres des problèmes", - - "TASK_PRIVACY": "Confidentialité des tâches", - "MULTIPLE_ASSIGNEES": "Plusieurs personnes assignées", - "MANUAL_TIME": "Temps manuel", - "GROUP_ESTIMATION": "Estimation en groupe", - "ESTIMATION_IN_HOURS": "Estimation en heures", - "ESTIMATION_IN_STORY_POINTS": "Estimation en points d'histoire", - "PROOF_OF_COMPLETION": "Preuve d'achèvement", - "LINKED_ISSUES": "Problèmes liés", - "COMMENTS": "Commentaires", - "HISTORY": "Historique", - "ACCEPTANCE_CRITERIA": "Critères d'acceptation", - "DRAFT_ISSUES": "Problèmes en cours", - "AUTO_CLOSE_ISSUE": "Fermeture automatique des problèmes", - "AUTO_ARCHIVE_ISSUE": "Archivage automatique des problèmes", - "AUTO_STATUS": "Statut automatique", - "VERSIONS": "Versions", - "LIST_OF_VERSONS": "Liste des versions", - "ISSUETYPE": "Types de problèmes", - "LIST_OF_ISSUES": "Liste des problèmes", - "RELATED_ISSUE_TYPE": "Types de problèmes connexes", - "LIST_OF_RELATED_TYPE": "Liste des types connexes", - "INITIAL": "Initial", - "COPY_NUMBER": "Numéro de copie", - "IN_PROGRESS": "En cours", - "FINAL": "Final", - "DISPOSE_TEAM": "Vous êtes sur le point de supprimer l'équipe ?", - "QUIT_TEAM": "Vous êtes sur le point de quitter l'équipe ?", - "TEAM_COLOR": "Couleur de l'équipe", - "TEAM_SIZE": "Taille de l'équipe", - "EMOJI": "Emoji", - "ISSUES_HEADING_TITLE": "Paramètres des problèmes", - - "TRACK_TIME": "Suivi du temps", - "ESTIMATE_ISSUE": "Estimer le problème", - "EPICS_CREATE_CLOSE": "Création/Fermeture des épopées", - "ISSUE_CREATE_CLOSE": "Création/Fermeture des problèmes", - "ISSUE_ASSIGN_UNASSIGN": "Assigner/Désassigner des problèmes", - "INVITE_MEMBERS": "Inviter des membres", - "REMOVE_MEMBERS": "Supprimer des membres", - "HANDLE_REQUESTS": "Gérer les demandes", - "ROLES_POSITIONS_CHANGE": "Changer les rôles/positions", - "VIEW_DETAILS": "Voir les détails", - - "NO_INVITATIONS": "Il n'y a pas d'invitation pour le moment !", - "NO_MEMBERS": "Il n'y a pas de membres pour le moment !" - }, - "invite": { - "HEADING_TITLE": "Inviter un membre dans votre équipe", - "HEADING_DESCRIPTION": "Envoyer une invitation à un membre de l'équipe par email", - "TEAM_MEMBER_EMAIL": "Email du membre de l'équipe", - "TEAM_MEMBER_FULLNAME": "Nom complet du membre de l'équipe", - "SEND_INVITE": "Envoyer l'invitation", - "ERROR_WHILE_ACCEPTING_INVITATION": "Erreur lors de l'acceptation de l'invitation", - "ERROR_WHILE_REJECTING_INVITATION": "Erreur lors du rejet de l'invitation", - "INVITE_LABEL_SEND": "Envoyer l'invitation", - "invitationTable": { - "NAME_AND_EMAIL": "Nom et email", - "POSITION": "Poste", - "DATE_AND_TIME_REQUEST": "Date et heure de la demande", - "CV_OR_ATTACHMENT": "CV / Pièce jointe" - } - }, - "permissions": { - "SELECT_ROLES": "Sélectionner des rôles" - }, - "unauthorized": { - "TITLE": "Non autorisé", - "HEADING_TITLE": "Vous n'êtes pas autorisé à accéder à cette page !", - "HEADING_DESCRIPTION": "Nous nous excusons pour la gêne occasionnée, mais vous n'êtes pas autorisé à accéder à cette page. Si vous pensez que c'est une erreur. Veuillez vous connecter." - }, - "page404": { - "HEADING_TITLE": "Page non trouvée", - "HEADING_DESCRIPTION": "La ressource que vous recherchez est introuvable !", - "LINK_LABEL": "Aller à la page d'accueil" - }, - "offline": { - "HEADING_TITLE": "Réseau déconnecté !", - "HEADING_DESCRIPTION": "Vous êtes actuellement hors ligne, veuillez vérifier votre connexion Internet..." - }, - "error": { - "TITLE": "Erreur !", - "HEADING_TITLE": "Quelque chose s'est mal passé !", - "HEADING_DESCRIPTION": "Si le problème persiste, envoyez un signal de détresse à notre équipe d'assistance." - }, - "maintenance": { - "HEADING_TITLE": "Nous sommes en cours de maintenance", - "HEADING_DESCRIPTION": "Nous mettons actuellement à jour notre site Web pour mieux vous servir. Veuillez revenir plus tard." - } - }, - - "timer": { - "START_TIMER": "Veuillez sélectionner ou créer une nouvelle tâche pour commencer à suivre le temps.", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Minuterie arrêtée", - "STOPPED_TIMER_TOAST_DESCRIPTION": "La minuterie s'est arrêtée en raison de l'interrupteur d'équipe" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Estimate" - }, - "DAY_LIST": [{ "title": "7 jours" }, { "title": "14 jours" }], - "TIME_ACTIVITY": "Activité", - "TOTAL_HOURS": "Nombre total d'heures", - "NO_SCREENSHOOT": "Pas de captures d'écran", - "PERCENT_OF_MINUTES": " % de 10 minutes", - "APPS": "Apps", - "VISITED_DATES": "Dates de visite", - "PERCENT_USED": "Pourcentage d'utilisation", - "TIME_SPENT_IN_HOURS": "Temps passé (heures)", - "THERE_IS_NO_APPS_VISITED": "Il n'y a pas d'application visitée.", - "OTHER_DETAILS": "Autres détails", - "KEYBOARD": "clavier", - - "MOUSE": "Souris", - "TIMES": "Temps", - "ACTIVE": "Actif", - "INACTIVE": "Inactif", - "ARCHIVED": "Archivé", - "NOT_ARCHIVED": "Not archivé" - }, - "task": { - "TITLE": "Tâche", - "ASSIGN_NEW_TASK": "Assigner une nouvelle tâche", - "ASSIGNED_BY": "Assigné par", - "NO_ONE_FOR_TASK": "Personne n'est assigné à cette tâche", - "WORKED_TODAY_ON_TASK_TOOLTIP": "a travaillé aujourd'hui sur cette tâche pendant", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "a travaillé sur cette tâche pour un total de", - "WORKED_TODAY_ON_ALL_TOOLTIP": "a travaillé aujourd'hui sur toutes", - "TASKS_FOR_TOOLTIP": "tâches pour", - "taskLabel": { - "WORK_LABEL": "Travaillé", - "TASK_ASSIGNED": "Assigné", - "TASK_UNASSIGNED": "Non assigné", - "BUTTON_LABEL": "Assigner la tâche" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "Cet onglet affiche toutes les tâches sur lesquelles vous avez commencé à travailler", - "ASSIGNED_DESCRIPTION": "Cet onglet affiche toutes les tâches qui vous sont assignées", - "UNASSIGNED_DESCRIPTION": "Cet onglet affiche toutes les tâches qui ne vous sont pas assignées", - "NO_TASK_USER_ASSIGNED": "Personne n'est assigné à cette tâche" - }, - "taskTableHead": { - "TASK_NAME": "Nom", - "TASK_STATUS": "Statut", - "TASK_WORK": { - "TITLE": "Travaillé sur", - "DESCRIPTION": "Tâche", - "LABEL": "Travaillé sur la tâche" - }, - "TASK_TIME": "Estimation", - "TOTAL_WORK": { - "TITLE": "Total travaillé", - "DESCRIPTION": "Aujourd'hui", - "LABEL": "Total travaillé aujourd'hui" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Combien d'heures l'employé a-t-il travaillé au total et aujourd'hui sur la tâche", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Combien d'heures l'employé a-t-il travaillé aujourd'hui sur toutes les tâches pour l'équipe sélectionnée" - }, - "CONFIRM_CLOSE_TASK": "Veuillez confirmer si vous voulez fermer la tâche" - }, - "form": { - "NAME_PLACEHOLDER": "Entrez votre nom", - "FIRST_NAME_PLACEHOLDER": "Prénom", - "LAST_NAME_PLACEHOLDER": "Nom de famille", - "EMAIL_PLACEHOLDER": "Entrez votre adresse email", - "PHONE_PLACEHOLDER": "Numéro de téléphone", - "ISSUE_NAME_PLACEHOLDER": "Nom du problème", - "TEAM_NAME_PLACEHOLDER": "Veuillez entrer le nom de votre équipe", - "TASK_INPUT_PLACEHOLDER": "Sur quoi travaillez-vous ?", - "TEAM_MEMBER_NAME_PLACEHOLDER": "Nom du membre de l'équipe", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "Adresse email du membre de l'équipe", - "COMPLETION_DESCRIPTION": "Rédigez la description", - "UPLOAD_FILES": "Uploader des fichiers", - "ATTACHMENT_FILE": "Fichiers joints", - "ADD_COMMENT": "Ajouter un commentaire ici", - "SET_THEME": "Choisir un thème", - "CHANGE_AVATAR": "Changer d'avatar", - "SELECT_TEAM_SIZE": "Sélectionnez la taille de l'équipe", - "INVALID_ALLOWED_CHARACTER": "Valeur non valide pour allowedCharacters. Utilisez alpha, numérique, ou alphanumérique" - }, - "layout": { - "footer": { - "RIGHTS_RESERVED": "Tous droits réservés.", - "COPY_RIGHT1": "© {{date}} à nos jours,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Conditions d'utilisation", - "PRIVACY_POLICY": "Politique de confidentialité", - "COOKIES": "Politique des cookies", - "BY": "Par" - } - }, - "errors": { - "NETWORK_ISSUE": "problème de réseau, veuillez réessayer plus tard", - "ERROR_WHILE_VERIFY_CODE": "Erreur lors de la vérification du code.", - "LENGTH_NUMBER_ERROR": "La longueur doit être un nombre et supérieure à 0", - "INVALID_ALLOWED_CHARACTER": "Valeur invalide pour allowedCharacters. Utilisez alpha, numérique ou alumérique", - "VALID_EMAIL": "Veuillez entrer une adresse e-mail valide", - "placeholders": { "ENTER_TO_VALIDATE": "Appuyez sur Entrée pour valider" }, - "team": { - "BACK_LABEL": "Retour à l'équipe", - "PUBLIC_TEAM": "Équipe publique", - "PRIVATE_TEAM": "Équipe privée", - "creation": { "NEW": "Créer une nouvelle équipe" } - }, - "links": { "common": { "TASKS": "Tâches", "TEAM": "Équipe", "SETTINGS": "Paramètres" } } - } -} diff --git a/apps/web/public/locales/he/common.json b/apps/web/public/locales/he/common.json deleted file mode 100644 index adb0ed781..000000000 --- a/apps/web/public/locales/he/common.json +++ /dev/null @@ -1,560 +0,0 @@ -{ - "TITLE": "Ever צוותים", - "common": { - "ACCEPT": "קבל", - "ACCEPTED": "התקבל", - "REJECT": "דחה", - "REJECTED": "נדחה", - "VERIFY": "אמת", - "INVITE": "הזמן", - "INVITED": "הוזמן", - "EXPIRE": "פג תוקף", - "EXPIRED": "פג תוקף", - "REQUEST": "בקשה", - "REQUESTED": "התבקש", - "LABEL": "תווית", - "LABELS": "תוויות", - "POSITION": "תפקיד", - "ROLES": "תפקידים", - "JOIN_OR_LEFT": "הצטרף / עזב", - "PLEASE": "אנא", - "HERE": "כאן", - "PEOPLE": "אנשים", - "COLLABORATE": "שיתוף פעולה", - "NO": "לא", - "ONLY_ME": "רק אני", - "YES": "כן", - "BASIC": "בסיסי", - "DELETE": "מחק", - "MEET": "פגש", - "BOARD": "לוח", - "SECURITY_CODE": "קוד אבטחה", - "CONFIRM": "אשר", - "YOUR_EMAIL": "האימייל שלך", - "CONTINUE": "המשך", - "EDIT_TASK": "ערוך משימה", - "ASSIGN_TASK": "הקצה משימה", - "ASSIGN_TASK_TO": "הקצה משימה ל-", - "REMOVE_ACCOUNT": "הסר חשבון", - "REMOVE_EVERYWHERE": "הסר בכל מקום", - "DELETE_ACCOUNT": "מחק חשבון זה", - "UNASSIGN_TASK": "בטל הקצאה", - "MAKE_A_MANAGER": "מנה את", - "UNMAKE_A_MANAGER": "בטל מנהל", - "TRANSFERT_OWNERSHIP": "העבר בעלות", - "TRANSFERT_OWNERSHIP_TO": "העבר בעלות מלאה של הצוות למשתמש אחר", - "REMOVE": "הסר", - "REMOVE_TEAM": "הסר צוות", - "DISPOSE_TEAM": "בטל צוות", - "QUIT_TEAM": "עזוב את הצוות", - "QUIT": "עזוב", - "STATUSES": "סטטוסים", - "RESEND_INVITATION": "שלח הזמנה מחדש", - "TODAY": "היום", - "TOTAL": "סך הכל", - "ESTIMATED": "משוער", - "ESTIMATE": "הערכה", - "STATUS": "סטטוס", - "NAME": "שם", - "TASK": "משימה", - "MY_TASKS": "המשימות שלי", - "WORKED_ON_TASK": "עבד על משימה", - "TOTAL_WORKED_TODAY": "סך העבודה היום", - "TOTAL_WORK": "עבודה היום", - "OPEN": "פתח", - "NOW": "עכשיו", - "NEXT": "הבא", - "PREV": "קודם", - "DETAILS": "פרטים", - "CLOSED": "סגור", - "CLOSE": "סגור", - "USER_NOT_FOUND": "לא נמצאו משתמשים.", - "TASK_TITTLE": "כותרת משימה", - "PUBLIC_TASK": "משימה זו פומבית", - "PRIVATE_TASK": "משימה זו פרטית", - "PUBLIC_TASK_LABEL": "הפוך לפומבית", - "PRIVATE_TASK_LABEL": "הפוך לפרטית", - "CREATE_TASK": "צור משימה חדשה", - "LINK_TASK": "בחר בעיה קשורה", - "LINK": "קישור", - "LINKS": "קישורים", - "SHOW": "הצג", - "ADD_LINK": "הוסף קישורים", - "COMMENT": "הערה", - "DESCRIPTION": "תיאור", - "CHILD_ISSUE_TASK": "בחר בעיה ילדה", - "CREATE_TEAM": "צור צוות חדש", - "VERIFY_ACCOUNT_MSG": "אנא אמת את החשבון שלך לפני שתתחיל להשתמש באפליקציה", - "CREATE_ROLE": "צור תפקיד", - "CREATE": "צור", - "CREATE_ISSUE": "צור בעיה", - "NEW_ISSUE": "בעיה חדשה", - "ACTIVATED": "מופעל", - "DEACTIVATED": "מנוטרל", - "PERIOD": "תקופה", - "NEW": "חדש", - "CREATE_VERSION": "צור גרסה", - "VERSION": "גרסה", - "LOADING": "טוען", - "TOTAL_TIME": "זמן כולל", - "LAST_24_HOURS": "24 השעות האחרונות", - "WORKED": "עבד", - "ASSIGNED": "הוקצה", - "SELECT_STATUS": "בחר סטטוס", - "SELECT_ISSUE": "בחר בעיה", - "UNASSIGNED": "לא הוקצה", - "TASK_DETAILS": "פרטי משימה", - "TYPE_SOMETHING": "הקלד משהו", - "FILTER": "סינון", - "APPLY": "החל", - "RESET": "איפוס", - "LOGOUT": "התנתק", - "THEMES": "ערכות עיצוב", - "3D_MODE": "מצב 3D", - "DARK_MODE": "מצב כהה", - "SETTINGS": "הגדרות", - "PERSONAL": "אישי", - "USE_SETTING": "השתמש בהגדרה", - "TEAM": "צוות", - "MY_TEAM": "הצוות שלי", - "FULL_NAME": "שם מלא", - "USER_AVATAR": "אווטר משתמש", - "CONTACT": "איש קשר", - "ENABLED": "לְאַפשֵׁר", - "DISABLED": "השבת", - - "THEME": "ערכת עיצוב", - "TIME_ZONE": "אזור זמן", - "EDIT": "ערוך", - "SAVE": "שמור", - "LANGUAGE": "שפה", - "DETECT": "זהה", - "TRANSFER": "העברה", - "TRANSFER_TEAM": "העבר צוות", - "TEAM_MEMBERS": "חברי צוות", - "NO_TEAM": "צור צוות משלך או הצטרף לקיים", - "NO_TEAM_SUB": "זה נהדר לעבוד עם אחרים, לכן צור צוות והזמן את כולם לשתף פעולה!", - "NO_TEAM_TOOLTIP": "עליך לאמת את כתובת האימייל שלך", - "CANCEL": "בטל", - "DISCARD": "בטל", - "EXISTING_MEMBER": "כבר חבר", - "NEW_MEMBER": "הפוך לחבר", - "BACK": "חזור", - "JOIN_REQUEST": "בקש הצטרפות", - "PERMISSION": "הרשאה", - "SEARCH": "חפש", - "ADD_PARENT": "הוסף הורה", - "BLOCKS": "חוסמים", - "CLONES": "משכפלים", - "DUPLICATES": "מכפילים", - "IS_BLOCKED_BY": "חסום על ידי", - "IS_CLONED_BY": "משוכפל על ידי", - "IS_DUPLICATED_BY": "מוכפל על ידי", - "RELATES_TO": "קשור ל", - "CHANGE_PARENT": "שנה הורה", - "RELATED_ISSUES": "בעיות קשורות", - "CHILD_ISSUES": "בעיות ילדות", - "REOPEN": "פתח מחדש", - "NO_TASKS": "אין משימות", - "FULL_WIDTH": "רוחב מלא", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "אנא עצור את הטיימר לפני שינוי המשימה", - - "COLLABORATE_DIALOG_TITLE": "התחל שיתוף פעולה", - "COLLABORATE_DIALOG_SUB_TITLE": "הזמן חבר/ים והתחל לשתף פעולה", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "התחל פגישה או שיתוף פעולה בלוח", - "ISSUE_TYPE": "סוג בעיה", - "ACTIVITY": "פעילות", - "FILTER_ALL": "הכל", - "FILTER_COMMENTS": "הערות", - "FILTER_HISTORY": "היסטוריה", - "FILTER_UNSUBSCRIBE": "בטל מנוי", - - "KEYBOARD_SHORTCUTS": "קיצורי מקלדת", - - "GITHUB_LOADING_TEXT": "אנו מתקינים כעת את אינטגרציית ה-GitHub שלך, המתינו.", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "סנכרן משימות באופן אוטומטי באפליקציה שלך לעדכונים חלקים ויעילים.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "סנכרן משימות באופן בררני על ידי הקשרתן לתג מסוים.", - "GITHUB_AUTO_SYNC_LABEL": "בחר תגית אוטומטית לסנכרון" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "אנחנו עובדים על סנכרון בזמן אמת כרגע, אנא בדוק את התכונה הזו מאוחר יותר.", - "ALERT_DELETE_ACCOUNT": "החשבון יוסר מכל הצוותים, למעט היכן שאתה רק המנהל", - "ALERT_ACCOUNT_PERMANENT_DELETE": "החשבון שלך יימחק לצמיתות עם הסרה מכל הצוותים", - "ALERT_REMOVE_ALL_DATA": "כל נתוני החשבון יוסרו מכל הצוותים שבהם אתה רק מנהל קיים אחד", - "ALERT_REMOVE_TEAM": "הצוות יוסר לחלוטין מהמערכת וחברי הצוות יאבדו גישה", - "ALERT_QUIT_TEAM": "אתה עומד לעזוב את הצוות" - }, - "pages": { - "home": { - "BREADCRUMB": ["לוח מחוונים"], - "SENT_EMAIL_VERIFICATION": "אימות קוד נשלח לאימייל שלך", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "עליך ", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " את כתובת האימייל שלך. קוד האימות כבר היה אמור להישלח לאימייל שלך, אבל אל תהסס ללחוץ על ", - "SENT_EMAIL_VERIFICATION_RESEND": " כדי לשלוח מחדש את הקוד, אם לא קיבלת אותו.", - "INVITATIONS": "הוזמנת להצטרף ל-", - "CONFIRM_ACCEPT_INVITATION": "האם אתה בטוח שברצונך לקבל את ההזמנה?", - "CONFIRM_REJECT_INVITATION": "האם אתה בטוח שברצונך לדחות את ההזמנה?" - }, - - "profile": { - "BREADCRUMB": ["משימות חבר"] - }, - "taskDetails": { - "BREADCRUMB": ["פרטי משימה"], - "DESCRIPTION": "תיאורים", - "ADD_DESCRIPTION": "הוסף תיאור כאן", - "TYPE_OF_ISSUE": "סוג בעיה", - "CREATOR": "יוצר", - "ASSIGNEES": "מוקצים", - "START_DATE": "תאריך התחלה", - "DUE_DATE": "תאריך יעד", - "DAYS_REMAINING": "ימים נותרים", - "VERSION": "גרסה", - "EPIC": "אפוס", - "STATUS": "סטטוס", - "LABEL": "תווית", - "LABELS": "תוויות", - "SIZE": "גודל", - "PRIORITY": "עדיפות", - "ESTIMATIONS": "הערכות", - "PROGRESS": "התקדמות", - "TOTAL_TIME": "זמן כולל", - "TIME_TODAY": "זמן היום", - "TOTAL_GROUP_TIME": "זמן קבוצתי כולל", - "TIME_REMAINING": "זמן נותר", - "CREATED": "נוצר", - "UPDATED": "עודכן", - "RESOLVED": "נפתר", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "לא יכולנו לעדכן את כותרת המשימה.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "כותרת משימה לא יכולה לעלות על 255 תווים.", - - "TASK_IS_ALREADY_EPIC": "לא ניתן לשנות סוג משימה אפית.", - "TASK_HAS_PARENT": "לא ניתן לשנות סוג משימה מכיוון שלמשימה כבר יש הורה." - }, - - "auth": { - "SEND_CODE": "שלח קוד", - "JOIN": "הצטרף", - "UNRECEIVED_CODE": "לא קיבלת קוד?", - "JOIN_TEAM": "הצטרף לצוות", - "INPUT_INVITE_CODE": "הכנס קוד הזמנה.", - "INPUT_INVITE_CODE_DESC": "הכנס את קוד ההזמנה ששלחנו לאימייל שלך.", - "INVALID_INVITE_CODE_MESSAGE": "קוד לאתקין", - "WELCOME_TEAMS": "ברוך הבא ל-Ever צוותים", - "COVER_TITLE": "עקוב אחר התקדמות העבודה של הצוותים שלך בזמן אמת!", - "COVER_DESCRIPTION": "ניהול עבודה וכוח עבודה הכל-באחד, ניהול זמן, מעקב אחר זמן, מעקב אחר פעילות, מעקב ומדדים של פרודוקטיביות, ניהול פרויקטים/משימות ובעיות, ארגונים וצוותים, אינטגרציות (GitHub, JIRA,...) ועוד!", - "LOGIN": "התחברות", - "SELECT_WORKSPACE": "בחר סביבת עבודה", - "ENTER_EMAIL": "הכנס אימייל", - "WORKSPACES_NOT_FOUND": "סביבות עבודה לא נמצאו" - }, - "authPasscode": { - "HEADING_TITLE": "הצטרף לצוות קיים", - "HEADING_DESCRIPTION": "אנא הכנס אימייל וקוד הזמנה כדי להצטרף לצוות קיים." - }, - "authLogin": { - "HEADING_TITLE": "התחבר לצוות", - "HEADING_DESCRIPTION": "אנא הכנס אימייל וקוד הזמנה כדי להתחבר.", - - "WORKSPACE": "סביבת עבודה", - "HEADING_WORKSPACE_LINE1": "האימייל משויך למספר סביבות עבודה,", - "HEADING_WORKSPACE_LINE2": "אנא בחר אחת כדי להמשיך" - }, - "authTeam": { - "HEADING_TITLE": "צור צוות חדש", - "HEADING_DESCRIPTION": "אנא הכנס את פרטי הצוות שלך כדי ליצור צוות חדש.", - "LOADING_TEXT": "אנחנו עכשיו יוצרים את סביבת העבודה החדשה שלך, רגע קטן...", - "VERIFY_EMAIL_LOADING_TEXT": "אנחנו מאמתים את האימייל שלך, רגע קטן...", - "INPUT_TEAM_NAME": "הכנס את שם הצוות שלך", - "JOIN_EXISTING_TEAM": "מצטרף לצוות קיים?", - "CREATE_FIRST_TEAM": "צור את הצוות הראשון שלך", - "CREATE_TEAM": "צור צוות" - }, - "settings": { - "BREADCRUMB": [{ "title": "לוח מחוונים", "href": "/" }, "הגדרות"], - "DANDER_ZONE": "אזור סיכון", - "HEADING_DESCRIPTION": "הגדר ונהל את לוח הבקרה האישי שלך כאן", - "ARE_YOU_SURE_TO_DELETE_USER": "האם אתה בטוח שברצונך למחוק משתמש זה?" - }, - "settingsPersonal": { - "HEADING_TITLE": "הגדרות כלליות", - "emailNotValid": "אנא ספק כתובת אימייל חוקית", - "phoneNotValid": "אנא ספק מספר טלפון חוקי", - "WORK_SCHEDULE": "לוח זמנים", - "SUBSCRIPTION": "מנוי", - "ABOUT_TO_CHANGE_EMAIL": "אתה עומד לשנות אימייל", - "ABOUT_TO_DELETE_ACCOUNT": "אתה עומד למחוק את החשבון שלך?", - "DATA_SYNCHRONIZATION": "סנכרון נתונים", - "ABOUT_TO_REMOVE_ACCOUNT": "אתה עומד להסיר את החשבון שלך?" - }, - "settingsTeam": { - "HEADING_TITLE": "הגדרות כלליות", - "MEMBER_HEADING_TITLE": "חברים", - "PRIORITIES_HEADING": "עדיפויות", - "NOTIFICATION_HEADING": "התראות", - "SIZES_HEADING": "גדלים", - "TEAM_NAME": "שם צוות", - "TEAM_TYPE": "סוג צוות", - "TIME_TRACKING": "מעקב זמן", - - "ADD_NEW_MEMBER": "הוסף חבר חדש", - "MANAGE_ASSIGNEES": "נהל מוקצים", - "SEARCH_MEMBER": "חפש חבר", - "TASK_STATUSES": "סטטוסי משימה", - "TASK_PRIORITIES": "עדיפויות משימה", - "TASK_SIZES": "גדלי משימה", - "TASK_LABELS": "תוויות משימה", - "ISSUE_TYPES": "סוגי בעיות", - "RELATED_TYPE": "סוגים קשורים", - - "INVITATION_HEADING_TITLE": "הזמנות", - "CREATE_NEW_STATUSES": "צור סטטוסים חדשים", - "CREATE_NEW_STATUS": "צור סטטוס חדש", - "CREATE_NEW_VERSION": "צור גרסה חדשה", - "CREATE_NEW_PRIORITIES": "צור עדיפויות חדשות", - "CREATE_NEW_PRIORITY": "צור עדיפות חדשה", - "CREATE_NEW_SIZES": "צור גדלים חדשים", - "CREATE_NEW_SIZE": "צור גודל חדש", - "CREATE_NEW_LABELS": "צור תוויות חדשות", - "CREATE_NEW_LABEL": "צור תווית חדשה", - "CREATE_NEW_ISSUE_TYPES": "צור בעיות חדשות", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "הסתר מידע אישי על חברים", - "POSITION_CUSTOM": "תפקידים מותאמים", - "INVITATION_EXPIRATION": "פקיעת הזמנה", - "NOTIFY_IF": "הודע אם", - "TEAM_REQUEST": "בקשת צוות", - "WORK_SCHEDULE": "לוח זמנים", - "MEMBER_AND_ROLES": "חברים ותפקידים", - "INTEGRATIONS": "אינטגרציות", - "DANDER_ZONES": "אזורי סיכון", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "התחבר ל-GitHub והתחל לסנכרן בעיות GitHub עם הצוות שלך", - "SELECT_REPOSITORY": "בחר מאגר", - - "INSTALL": "התקן", - - "LIST_OF_STATUSES": "רשימת סטטוסים", - "LIST_OF_PRIORITIES": "רשימת עדיפויות", - "LIST_OF_SIZES": "רשימת גדלים", - "LIST_OF_LABELS": "רשימת תוויות", - "LIST_OF_ISSUES_TYPE": "רשימת בעיות", - - "GENERAL": "כללי", - "SOUND": "קול", - "EMAIL": "אימייל", - "USERS": "משתמשים", - "TASKS": "משימות", - "SYSTEM": "מערכת", - "SECURITY": "אבטחה", - "INAPP": "באפליקציה", - "NOTIFICATION_HEADING_TITLE": "הגדרות התראות", - "ISSUE_HEADING_TITLE": "הגדרות בעיה", - - "TASK_PRIVACY": "פרטיות משימה", - "MULTIPLE_ASSIGNEES": "מוקצים מרובים", - "MANUAL_TIME": "זמן ידני", - "GROUP_ESTIMATION": "הערכה קבוצתית", - "ESTIMATION_IN_HOURS": "הערכה בשעות", - "ESTIMATION_IN_STORY_POINTS": "הערכה בנקודות סיפור", - "PROOF_OF_COMPLETION": "הוכחת השלמה", - "LINKED_ISSUES": "בעיות מקושרות", - "COMMENTS": "הערות", - "HISTORY": "היסטוריה", - "ACCEPTANCE_CRITERIA": "קריטריוני קבלה", - "DRAFT_ISSUES": "טיוטות בעיות", - "AUTO_CLOSE_ISSUE": "סגור בעיה אוטומטית", - "AUTO_ARCHIVE_ISSUE": "ארכב בעיה אוטומטית", - "AUTO_STATUS": "סטטוס אוטומטי", - "VERSIONS": "גרסאות", - "LIST_OF_VERSONS": "רשימת גרסאות", - "ISSUETYPE": "סוגי בעיות", - "LIST_OF_ISSUES": "רשימת בעיות", - "RELATED_ISSUE_TYPE": "סוגי בעיות קשורות", - "LIST_OF_RELATED_TYPE": "רשימת סוגים קשורים", - "INITIAL": "ראשוני", - "COPY_NUMBER": "מספר העתקה", - "IN_PROGRESS": "בתהליך", - "FINAL": "סופי", - "DISPOSE_TEAM": "אתה עומד לבטל את הצוות?", - "QUIT_TEAM": "אתה עומד לעזוב את הצוות?", - "TEAM_COLOR": "צבע צוות", - "TEAM_SIZE": "גודל צוות", - "EMOJI": "אימוג'י", - "ISSUES_HEADING_TITLE": "הגדרות בעיה", - - "TRACK_TIME": "עקוב אחר זמן", - "ESTIMATE_ISSUE": "הערך בעיה", - "EPICS_CREATE_CLOSE": "יצירה/סגירת אפוסים", - "ISSUE_CREATE_CLOSE": "יצירה/סגירת בעיות", - "ISSUE_ASSIGN_UNASSIGN": "הקצאה/ביטול הקצאה של בעיות", - "INVITE_MEMBERS": "הזמן חברים", - "REMOVE_MEMBERS": "הסר חברים", - "HANDLE_REQUESTS": "טפל בבקשות", - "ROLES_POSITIONS_CHANGE": "שינוי תפקידים/תחנות", - "VIEW_DETAILS": "צפה בפרטים", - - "NO_INVITATIONS": "אין הזמנות כרגע!", - "NO_MEMBERS": "אין חברים כרגע!" - }, - "invite": { - "HEADING_TITLE": "הזמן חבר לצוות שלך", - "HEADING_DESCRIPTION": "שלח הזמנה לחבר צוות באימייל", - "TEAM_MEMBER_EMAIL": "אימייל של חבר הצוות", - "TEAM_MEMBER_FULLNAME": "שם מלא של חבר הצוות", - "SEND_INVITE": "שלח הזמנה", - "ERROR_WHILE_ACCEPTING_INVITATION": "שגיאה בקבלת ההזמנה", - "ERROR_WHILE_REJECTING_INVITATION": "שגיאה בדחיית ההזמנה", - "INVITE_LABEL_SEND": "שלח הזמנה", - "invitationTable": { - "NAME_AND_EMAIL": "שם ואימייל", - "POSITION": "תפקיד", - "DATE_AND_TIME_REQUEST": "תאריך ושעת בקשה", - "CV_OR_ATTACHMENT": "קורות חיים / קובץ מצורף" - } - }, - "permissions": { - "SELECT_ROLES": "בחר תפקידים" - }, - "unauthorized": { - "TITLE": "לא מורשה", - "HEADING_TITLE": "אתה לא מורשה להיכנס לדף זה ", - "HEADING_DESCRIPTION": "אנו מתנצלים על אי הנוחות, אך אינך מורשה לגשת לדף זה. אם אתה מאמין שזו טעות. אנא התחבר" - }, - "page404": { - "HEADING_TITLE": "לא נמצא", - "HEADING_DESCRIPTION": "המשאב שאתה מחפש לא נמצא!", - "LINK_LABEL": "לך לדף הבית" - }, - "offline": { - "HEADING_TITLE": "רשת מנותקת!", - "HEADING_DESCRIPTION": "אתה לא מחובר כרגע, בבקשה בדוק את חיבור האינטרנט שלך..." - }, - "error": { - "TITLE": "שגיאה", - "HEADING_TITLE": "משהו השתבש", - "HEADING_DESCRIPTION": "אם הבעיה נמשכת, שלח אות מצוקה לצוות התמיכה שלנו" - }, - "maintenance": { - "HEADING_TITLE": "אנחנו בשלבי תחזוקה ", - "HEADING_DESCRIPTION": "אנו מעדכנים כעת את האתר שלנו כדי לשרת אותך טוב יותר. אנא בדוק שוב מאוחר יותר." - } - }, - "timer": { - "START_TIMER": "אנא בחר או צור משימה חדשה כדי להתחיל לעקוב אחר הזמן", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "טיימר הופסק", - "STOPPED_TIMER_TOAST_DESCRIPTION": "הטיימר הופסק בגלל מעבר צוות" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "הערך" - }, - "DAY_LIST": [{ "title": "7 ימים" }, { "title": "14 ימים" }] - }, - - "task": { - "TITLE": "משימה", - "ASSIGN_NEW_TASK": "הקצה משימה חדשה", - "ASSIGNED_BY": "הוקצה על ידי", - "NO_ONE_FOR_TASK": "אף אחד לא הוקצה למשימה זו", - "WORKED_TODAY_ON_TASK_TOOLTIP": "עבד היום על משימה זו למשך", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "עבד על משימה זו לסך הכל למשך", - "WORKED_TODAY_ON_ALL_TOOLTIP": "עבד היום על כל", - "TASKS_FOR_TOOLTIP": "משימות עבור", - "taskLabel": { - "WORK_LABEL": "עבד", - "TASK_ASSIGNED": "הוקצה", - "TASK_UNASSIGNED": "לא הוקצה", - "BUTTON_LABEL": "הקצה משימה" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "לשונית זו מציגה את כל המשימות שהתחלת לעבוד עליהן", - "ASSIGNED_DESCRIPTION": "לשונית זו מציגה את כל המשימות שהוקצו לך", - "UNASSIGNED_DESCRIPTION": "לשונית זו מציגה את כל המשימות שלא הוקצו לך", - "NO_TASK_USER_ASSIGNED": "אף אחד לא הוקצה למשימה הזאת" - }, - "taskTableHead": { - "TASK_NAME": "שם", - "TASK_STATUS": "סטטוס", - "TASK_WORK": { - "TITLE": "עבד על", - "DESCRIPTION": "משימה", - "LABEL": "עבד על משימה" - }, - "TASK_TIME": "הערכה", - "TOTAL_WORK": { - "TITLE": "סך עבודה", - "DESCRIPTION": "היום", - "LABEL": "סך עבודה היום" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "כמה שעות עבד העובד בסך הכול והיום על המשימה", - "WORKED_ON_TASK_HEADER_TOOLTIP": "כמה שעות עבד העובד היום בכל המשימות לצוות שנבחר" - }, - "CONFIRM_CLOSE_TASK": "אנא אשר אם ברצונך לסגור את המשימה" - }, - "form": { - "NAME_PLACEHOLDER": "הכנס את השם שלך", - "FIRST_NAME_PLACEHOLDER": "שם פרטי", - "LAST_NAME_PLACEHOLDER": "שם משפחה", - "EMAIL_PLACEHOLDER": "הכנס כתובת אימייל", - "PHONE_PLACEHOLDER": "מספר טלפון", - - "ISSUE_NAME_PLACEHOLDER": "שם בעיה", - - "TEAM_NAME_PLACEHOLDER": "אנא הכנס את שם הצוות שלך", - "TASK_INPUT_PLACEHOLDER": "על מה אתה עובד?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "שם חבר צוות", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "כתובת אימייל של חבר צוות", - "COMPLETION_DESCRIPTION": "כתוב תיאור", - "UPLOAD_FILES": "העלה קבצים", - "ATTACHMENT_FILE": "קבצים מצורפים", - "ADD_COMMENT": "הוסף הערה כאן", - "SET_THEME": "קבע ערכת עיצוב", - "CHANGE_AVATAR": "שנה אווטר", - "SELECT_TEAM_SIZE": "בחר גודל צוות", - "INVALID_ALLOWED_CHARACTER": "ערך לא חוקי עבור allowedCharacters. השתמש ב- alpha, numeric, או alphanumeric" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "כל הזכויות שמורות.", - "COPY_RIGHT1": "© {{date}}-היום,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "תנאי שימוש", - "PRIVACY_POLICY": "מדיניות פרטיות", - "COOKIES": "מדיניות עוגיות", - "BY": "על ידי" - } - }, - - "errors": { - "NETWORK_ISSUE": "בעיית רשת, נסה שוב מאוחר יותר", - "ERROR_WHILE_VERIFY_CODE": "שגיאה באימות קוד.", - "LENGTH_NUMBER_ERROR": "אורך צריך להיות מספר וגדול מ-0", - "INVALID_ALLOWED_CHARACTER": "ערך לא חוקי עבור allowedCharacters. השתמש ב- alpha, numeric, או alphanumeric", - "VALID_EMAIL": "אנא הכנס אימייל חוקי" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "לחץ Enter כדי לאמת" - }, - "team": { - "BACK_LABEL": "חזור לצוות", - "PUBLIC_TEAM": "צוות פומבי", - "PRIVATE_TEAM": "צוות פרטי", - "creation": { - "NEW": "צור צוות חדש" - } - }, - "links": { - "common": { - "TASKS": "משימות", - "TEAM": "צוות", - "SETTINGS": "הגדרות" - } - } -} diff --git a/apps/web/public/locales/it/common.json b/apps/web/public/locales/it/common.json deleted file mode 100644 index e43cf764c..000000000 --- a/apps/web/public/locales/it/common.json +++ /dev/null @@ -1,584 +0,0 @@ -{ - "TITLE": "Ever Teams", - "common": { - "ACCEPT": "Accettare", - "ACCEPTED": "Accettato", - "REJECT": "Rifiuto", - "REJECTED": "Rifiutato", - "VERIFY": "verify", - "INVITE": "Invite", - "INVITED": "Invited", - "EXPIRE": "Expire", - "EXPIRED": "Expired", - "REQUEST": "Request", - "REQUESTED": "Requested", - "LABEL": "Label", - "LABELS": "Labels", - "POSITION": "Position", - "ROLES": "Roles", - "JOIN_OR_LEFT": "Joined / Left", - "PLEASE": "please", - "HERE": "here", - "PEOPLE": "People", - "COLLABORATE": "Collaborate", - "NO": "No", - "ONLY_ME": "Only me", - "YES": "Yes", - "BASIC": "Basic", - "DELETE": "Delete", - "MEET": "Meet", - "BOARD": "Board", - "SECURITY_CODE": "Security Code", - "CONFIRM": "Confirm", - "YOUR_EMAIL": "your email", - "CONTINUE": "Continue", - "EDIT_TASK": "Edit Task", - "ASSIGN_TASK": "Assign Task", - "ASSIGN_TASK_TO": "Assign Task", - "REMOVE_ACCOUNT": "Remove Account", - "REMOVE_EVERYWHERE": "Remove From All Teams", - "DELETE_ACCOUNT": "Delete This Account", - "UNASSIGN_TASK": "Unassign Task", - "MAKE_A_MANAGER": "Make a Manager", - "UNMAKE_A_MANAGER": "Unmake a Manager", - "TRANSFERT_OWNERSHIP": "Transfer Ownership", - "TRANSFERT_OWNERSHIP_TO": "Transfer full ownership of team to another user", - "REMOVE": "Remove", - "REMOVE_TEAM": "Remove Team", - "DISPOSE_TEAM": "Dispose Team", - "QUIT_TEAM": "Quit the Team", - "QUIT": "Quit", - "STATUSES": "Statuses", - "RESEND_INVITATION": "Resend Invitation", - "TODAY": "Today", - "TOTAL": "Total", - "ESTIMATED": "Estimated", - "ESTIMATE": "Estimate", - "STATUS": "Status", - "NAME": "Name", - "TASK": "Task", - "MY_TASKS": "My Tasks", - "WORKED_ON_TASK": "Worked on Task", - "TOTAL_WORKED_TODAY": "Total worked Today", - "TOTAL_WORK": "Today work", - "OPEN": "Open", - "NOW": "Now", - "NEXT": "Next", - "PREV": "Previous", - "DETAILS": "Details", - "CLOSED": "Closed", - "CLOSE": "Close", - "USER_NOT_FOUND": "No users found.", - "TASK_TITTLE": "Task Title", - "PUBLIC_TASK": "This task is Public", - "PRIVATE_TASK": "This task is Private", - "PUBLIC_TASK_LABEL": "Make a public", - "PRIVATE_TASK_LABEL": "Make a private", - "CREATE_TASK": "Create New Task", - "LINK_TASK": "Select Related Issue", - "LINK": "Link", - "LINKS": "Links", - "SHOW": "Show", - "ADD_LINK": "Add Links", - "COMMENT": "Comment", - "DESCRIPTION": "Description", - "CHILD_ISSUE_TASK": "Select Child Issue", - "CREATE_TEAM": "Create New Team", - "VERIFY_ACCOUNT_MSG": "Please Verify your account before start using the app", - "CREATE_ROLE": "Create Role", - "CREATE": "Create", - "CREATE_ISSUE": "Create issue", - "NEW_ISSUE": "New Issue", - "ACTIVATED": "Activated", - "DEACTIVATED": "Activated", - "PERIOD": "Period", - "NEW": "New", - "CREATE_VERSION": "Create Version", - "VERSION": "Version", - "LOADING": "Loading", - "TOTAL_TIME": "Total time", - "LAST_24_HOURS": "Last 24 Hours", - "WORKED": "Worked", - "ASSIGNED": "Assigned", - "SELECT_STATUS": "Select status", - "SELECT_ISSUE": "Select Issue", - "UNASSIGNED": "Unassigned", - "TASK_DETAILS": "Task Details", - "TYPE_SOMETHING": "Type something", - "FILTER": "Filter", - "APPLY": "Apply", - "RESET": "Reset", - "LOGOUT": "Log Out", - "THEMES": "Themes", - "3D_MODE": "3D Mode", - "DARK_MODE": "Dark Mode", - "SETTINGS": "Settings", - "PERSONAL": "Personal", - "USE_SETTING": "Use setting", - "TEAM": "Team", - "MY_TEAM": "My Team", - "FULL_NAME": "Full Name", - "USER_AVATAR": "User Avatar", - "CONTACT": "Contact", - "ENABLED": "Abilitare", - "DISABLED": "disattivare", - - "THEME": "Theme", - "TIME_ZONE": "Timezone", - "EDIT": "Edit", - "SAVE": "Save", - "LANGUAGE": "Language", - "DETECT": "Detect", - "TRANSFER": "Transfer", - "TRANSFER_TEAM": "Transfer Team", - "TEAM_MEMBERS": "Team Members", - "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "È fantastico lavorare con gli altri, quindi crea un team e invita tutti a collaborare!", - "NO_TEAM_TOOLTIP": "È necessario verificare il tuo indirizzo email", - "CANCEL": "Cancel", - "DISCARD": "Discard", - "EXISTING_MEMBER": "Already a Member", - "NEW_MEMBER": "Become a Member", - "BACK": "Back", - "DONT_HAVE_ACCOUNT": "Don't have an account?", - "REGISTER": "Register Now!", - "JOIN_REQUEST": "Request To Join", - "PERMISSION": "Permission", - "SEARCH": "Search", - "ADD_PARENT": "Add Parent", - "BLOCKS": "Blocks", - "CLONES": "Clones", - "DUPLICATES": "Duplicates", - "IS_BLOCKED_BY": "Is Blocked By", - "IS_CLONED_BY": "Is Cloned By", - "IS_DUPLICATED_BY": "Is Duplicated By", - "RELATES_TO": "Relates To", - "CHANGE_PARENT": "Change Parent", - "RELATED_ISSUES": "Related Issues", - "CHILD_ISSUES": "Child Issues", - "REOPEN": "Reopen", - "NO_TASKS": "No Tasks", - "FULL_WIDTH": "A tutta larghezza", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Please stop the Timer before changing the Task", - - "COLLABORATE_DIALOG_TITLE": "Start Collaboration", - "COLLABORATE_DIALOG_SUB_TITLE": "Invite member(s) and start collaborating", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Start Meeting or Board Collaboration", - "ISSUE_TYPE": "Issue Type", - "ACTIVITY": "Activity", - "FILTER_ALL": "All", - "FILTER_COMMENTS": "Comments", - "FILTER_HISTORY": "History", - "FILTER_UNSUBSCRIBE": "Unsubscribe", - - "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", - - "GITHUB_LOADING_TEXT": "Stiamo installando la tua integrazione GitHub, attendi...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Sincronizza automaticamente le attività nella tua applicazione per aggiornamenti senza intoppi ed efficienti.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Sincronizza le attività in modo selettivo associandole a un'etichetta specifica.", - "GITHUB_AUTO_SYNC_LABEL": "Seleziona etichetta di sincronizzazione automatica" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "Stiamo lavorando alla sincronizzazione in tempo reale al momento, controlla questa funzionalità più tardi.", - "ALERT_DELETE_ACCOUNT": "You will be removed from all teams, except where you are the only manager in the team", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Your Account will be deleted permanently with removing from all teams", - "ALERT_REMOVE_ALL_DATA": "Tutti i dati dell'account verranno rimossi da tutti i team in cui si è SOLO un manager esistente", - "ALERT_REMOVE_TEAM": "Team will be completely removed for the system and team members lost access", - "ALERT_QUIT_TEAM": "You are about to quit the team" - }, - "pages": { - "home": { - "BREADCRUMB": ["Dashboard"], - "SENT_EMAIL_VERIFICATION": "Code Verification has been sent to your email", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "You need to ", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " your email address. The verification code should already be send to your email, but feel free to click ", - "SENT_EMAIL_VERIFICATION_RESEND": " to resend the code, if you did not received it.", - "INVITATIONS": "You've been invited to join", - "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", - "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" - }, - - "profile": { - "BREADCRUMB": ["Member Tasks"] - }, - - "taskDetails": { - "BREADCRUMB": ["Task Details"], - "DESCRIPTION": "Descriptions", - "ADD_DESCRIPTION": "Add Description here", - "TYPE_OF_ISSUE": "Type of Issue", - "CREATOR": "Creator", - "ASSIGNEES": "Assignees", - "START_DATE": "Start Date", - "DUE_DATE": "Due Date", - "DAYS_REMAINING": "Days Remaining", - "VERSION": "Version", - "EPIC": "Epic", - "STATUS": "Status", - "LABEL": "Label", - "LABELS": "Labels", - "SIZE": "Size", - "PRIORITY": "Priority", - "ESTIMATIONS": "Estimations", - "PROGRESS": "Progress", - "TOTAL_TIME": "Total Time", - "TIME_TODAY": "Time Today", - "TOTAL_GROUP_TIME": "Total Group Time", - "TIME_REMAINING": "Time Remaining", - "CREATED": "Created", - "UPDATED": "Updated", - "RESOLVED": "Resolved", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "We couldn't update Task Title.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "Task Title can't exceed 255 characters.", - - "TASK_IS_ALREADY_EPIC": "Epic Task Type can not be changed.", - "TASK_HAS_PARENT": "Task Type can not be changed as Task has already Parent." - }, - - "auth": { - "SEND_CODE": "send code", - "JOIN": "Join", - "UNRECEIVED_CODE": "Didn't receive code ?", - "JOIN_TEAM": "Join Team", - "INPUT_INVITE_CODE": "Input invitation code.", - "INPUT_INVITE_CODE_DESC": "Enter the invitation code we sent to your email.", - "INVALID_INVITE_CODE_MESSAGE": "Invalid Code", - "WELCOME_TEAMS": "Welcome to Ever Teams", - - "COVER_TITLE": "Open Work and Project Management Platform", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Login", - "SELECT_WORKSPACE": "Select Workspace", - "ENTER_EMAIL": "Enter Email", - "WORKSPACES_NOT_FOUND": "Workspaces Not Found" - }, - "authPasscode": { - "HEADING_TITLE": "Join existing Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to join existing team." - }, - "authLogin": { - "HEADING_TITLE": "Login to the Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to login.", - - "WORKSPACE": "Workspace", - "HEADING_WORKSPACE_LINE1": "The email associated with multiple workspaces,", - "HEADING_WORKSPACE_LINE2": "please select one to continue" - }, - "authTeam": { - "HEADING_TITLE": "Create New Team", - "HEADING_DESCRIPTION": "Please enter your team details to create a new team.", - "LOADING_TEXT": "We are now creating your new workplace, hold on...", - "VERIFY_EMAIL_LOADING_TEXT": "We are verifying your email, hold on...", - "INPUT_TEAM_NAME": "Input your team name", - "JOIN_EXISTING_TEAM": "Joining existing team?", - "CREATE_FIRST_TEAM": "Create your first team", - "CREATE_TEAM": "Create team" - }, - "settings": { - "BREADCRUMB": [{ "title": "Dashboard", "href": "/" }, "Settings"], - "DANDER_ZONE": "Danger Zone", - "HEADING_DESCRIPTION": "Setting dan manage your personal dashboard here", - "ARE_YOU_SURE_TO_DELETE_USER": "Are you sure you want to delete this user?" - }, - "settingsPersonal": { - "HEADING_TITLE": "General Settings", - "emailNotValid": "Please provide a valid Email", - "phoneNotValid": "Please provide a valid Phone Number", - "WORK_SCHEDULE": "Work Schedule", - "SUBSCRIPTION": "Subscription", - "ABOUT_TO_CHANGE_EMAIL": "You are about to change Email", - "ABOUT_TO_DELETE_ACCOUNT": "You are about to Delete your account ?", - "DATA_SYNCHRONIZATION": "Sincronizzazione dei dati", - "ABOUT_TO_REMOVE_ACCOUNT": "You are about to Remove your account ?" - }, - "settingsTeam": { - "HEADING_TITLE": "General Settings", - "MEMBER_HEADING_TITLE": "Members", - "PRIORITIES_HEADING": "Priorities", - "NOTIFICATION_HEADING": "Notifications", - "SIZES_HEADING": "Sizes", - "TEAM_NAME": "Team Name", - "TEAM_TYPE": "Team Type", - "TIME_TRACKING": "Time Tracking", - - "ADD_NEW_MEMBER": "Add new member", - "MANAGE_ASSIGNEES": "Manage Assignees", - "SEARCH_MEMBER": "Search Member", - "TASK_STATUSES": "Task Statuses", - "TASK_PRIORITIES": "Task Priorities", - "TASK_SIZES": "Task Sizes", - "TASK_LABELS": "Task Labels", - "ISSUE_TYPES": "Issue Types", - "RELATED_TYPE": "Related Type", - - "INVITATION_HEADING_TITLE": "Invitations", - "CREATE_NEW_STATUSES": "Create new Statuses", - "CREATE_NEW_STATUS": "Create new Status", - "CREATE_NEW_VERSION": "Create new Version", - "CREATE_NEW_PRIORITIES": "Create new Priorities", - "CREATE_NEW_PRIORITY": "Create new Priority", - "CREATE_NEW_SIZES": "Create new Sizes", - "CREATE_NEW_SIZE": "Create new Size", - "CREATE_NEW_LABELS": "Create new Labels", - "CREATE_NEW_LABEL": "Create new Label", - "CREATE_NEW_ISSUE_TYPES": "Create new Issues", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Hide Personal Members Information", - "POSITION_CUSTOM": "Positions custom", - "INVITATION_EXPIRATION": "Invitation Expiration", - "NOTIFY_IF": "Notify if", - "TEAM_REQUEST": "Team Request", - "WORK_SCHEDULE": "Work schedule", - "MEMBER_AND_ROLES": "Members & Roles", - "INTEGRATIONS": "Integrations", - "DANDER_ZONES": "Danger Zone", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Connect with GitHub and start Syncing GitHub issues with your Team", - "SELECT_REPOSITORY": "Select Repository", - - "INSTALL": "Install", - - "LIST_OF_STATUSES": "List of Statuses", - "LIST_OF_PRIORITIES": "List of Priorities", - "LIST_OF_SIZES": "List of Sizes", - "LIST_OF_LABELS": "List of Labels", - "LIST_OF_ISSUES_TYPE": "List of Issues", - - "GENERAL": "General", - "SOUND": "Sound", - "EMAIL": "Email", - "USERS": "Users", - "TASKS": "Tasks", - "SYSTEM": "System", - "SECURITY": "Security", - "INAPP": "In App", - "NOTIFICATION_HEADING_TITLE": "Notification Settings", - "ISSUE_HEADING_TITLE": "Issue Settings", - - "TASK_PRIVACY": "Task Privacy", - "MULTIPLE_ASSIGNEES": "Multiple Assignees", - "MANUAL_TIME": "Manual Time", - "GROUP_ESTIMATION": "Group Estimation", - "ESTIMATION_IN_HOURS": "Estimation in Hours", - "ESTIMATION_IN_STORY_POINTS": "Estimation in Story Points", - "PROOF_OF_COMPLETION": "Proof of Completion", - "LINKED_ISSUES": "Linked Issues", - "COMMENTS": "Comments", - "HISTORY": "History", - "ACCEPTANCE_CRITERIA": "Acceptance criteria", - "DRAFT_ISSUES": "Draft Issues", - "AUTO_CLOSE_ISSUE": "Auto-close issue", - "AUTO_ARCHIVE_ISSUE": "Auto-archive issue", - "AUTO_STATUS": "Auto-Status", - "VERSIONS": "Versions", - "LIST_OF_VERSONS": "List of Versions", - "ISSUETYPE": "Issue Types", - "LIST_OF_ISSUES": "List of Issues", - "RELATED_ISSUE_TYPE": "Related Issue Types", - "LIST_OF_RELATED_TYPE": "List of Related Types", - "INITIAL": "Initial", - "COPY_NUMBER": "Copy Number", - "IN_PROGRESS": "In Progress", - "FINAL": "Final", - "DISPOSE_TEAM": "You are about to Dispose team ?", - "QUIT_TEAM": "You are about to Quit team ?", - "TEAM_COLOR": "Team Color", - "TEAM_SIZE": "Team Size", - "EMOJI": "Emoji", - "ISSUES_HEADING_TITLE": "Issues Settings", - - "TRACK_TIME": "Track Time", - "ESTIMATE_ISSUE": "Estimate issue", - "EPICS_CREATE_CLOSE": "Epics Create/Close", - "ISSUE_CREATE_CLOSE": "Issue Create/Close", - "ISSUE_ASSIGN_UNASSIGN": "Issue Assign/Unassign", - "INVITE_MEMBERS": "Invite members", - "REMOVE_MEMBERS": "Remove members", - "HANDLE_REQUESTS": "Handle requests", - "ROLES_POSITIONS_CHANGE": "Roles/Positions change", - "VIEW_DETAILS": "View Details", - - "NO_INVITATIONS": "There are no Invitations at the moment!", - "NO_MEMBERS": "There are no Members at the moment!" - }, - "invite": { - "HEADING_TITLE": "Invite member to your team", - "HEADING_DESCRIPTION": "Send invitation to a team member by email", - "TEAM_MEMBER_EMAIL": "Team Member's Email", - "TEAM_MEMBER_FULLNAME": "Team Member's Full Name", - "SEND_INVITE": "Send Invitation", - "ERROR_WHILE_ACCEPTING_INVITATION": "Error while accepting invitation", - "ERROR_WHILE_REJECTING_INVITATION": "Error while rejecting invitation", - "INVITE_LABEL_SEND": "Send Invite", - "invitationTable": { - "NAME_AND_EMAIL": "Name & Email", - "POSITION": "Position", - "DATE_AND_TIME_REQUEST": "Date & Time Request", - "CV_OR_ATTACHMENT": "CV / Attachement" - } - }, - "permissions": { - "SELECT_ROLES": "Select Roles" - }, - "unauthorized": { - "TITLE": "Non autorizzato", - "HEADING_TITLE": "Non sei autorizzato ad accedere a questa pagina !", - "HEADING_DESCRIPTION": "Ci scusiamo per il disagio ma non sei autorizzato ad accedere a questa pagina. Se ritieni che questo sia un errore. Accedere prego." - }, - "page404": { - "HEADING_TITLE": "Not Found", - "HEADING_DESCRIPTION": "Resource you are looking for not found!", - "LINK_LABEL": "Go to homepage" - }, - "offline": { - "HEADING_TITLE": "Rete Disconnessa!", - "HEADING_DESCRIPTION": "Attualmente sei offline, controlla la tua connessione Internet..." - }, - "error": { - "TITLE": "Errore !", - "HEADING_TITLE": "Qualcosa è andato storto !", - "HEADING_DESCRIPTION": "Se il problema persiste, invia un segnale di soccorso al nostro team di supporto." - }, - "maintenance": { - "HEADING_TITLE": "Siamo in manutenzione", - "HEADING_DESCRIPTION": "Stiamo attualmente aggiornando il nostro sito web per servirti meglio. Per favore controllare più tardi." - } - }, - - "timer": { - "START_TIMER": "Please, select or create a new task to start tracking the time", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Timer Stopped", - "STOPPED_TIMER_TOAST_DESCRIPTION": "Timer Stopped due to Team Switch" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Estimate" - }, - "DAY_LIST": [{ "title": "7 days" }, { "title": "14 days" }], - "TIME_ACTIVITY": "Activity", - "TOTAL_HOURS": "Total Hours", - "NO_SCREENSHOOT": "No Screenshoots", - "PERCENT_OF_MINUTES": " % of 10 Minutes", - "APPS": "Apps", - "VISITED_DATES": "Visited Dates", - "PERCENT_USED": "Percent Used", - "TIME_SPENT_IN_HOURS": "Time spent (Hours)", - "THERE_IS_NO_APPS_VISITED": "There is no Apps Visited.", - "OTHER_DETAILS": "Other details", - "KEYBOARD": "keyboard", - - "MOUSE": "Mouse", - "TIMES": "Times", - "ACTIVE": "Active", - "INACTIVE": "Inactive", - "ARCHIVED": "Archived", - "NOT_ARCHIVED": "Not archived" - }, - - "task": { - "TITLE": "Task", - "ASSIGN_NEW_TASK": "Assign new task", - "ASSIGNED_BY": "Assigned By", - "NO_ONE_FOR_TASK": "No One Assigned to this Task", - "WORKED_TODAY_ON_TASK_TOOLTIP": "lavorato oggi su questo compito per", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "lavorato su questo compito per un totale di", - "WORKED_TODAY_ON_ALL_TOOLTIP": "lavorato oggi su tutto per", - "TASKS_FOR_TOOLTIP": "compiti per", - "taskLabel": { - "WORK_LABEL": "Worked", - "TASK_ASSIGNED": "Assigned", - "TASK_UNASSIGNED": "Unassigned", - "BUTTON_LABEL": "Assign Task" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "This tab shows all tasks you started working on", - "ASSIGNED_DESCRIPTION": "This tab shows all tasks that are assigned to you", - "UNASSIGNED_DESCRIPTION": "This tab shows all tasks that are not assigned to you", - "NO_TASK_USER_ASSIGNED": "No one assigned to this Task" - }, - "taskTableHead": { - "TASK_NAME": "Name", - "TASK_STATUS": "Status", - "TASK_WORK": { - "TITLE": "Worked on", - "DESCRIPTION": "Task", - "LABEL": "Worked on task" - }, - "TASK_TIME": "Estimate", - "TOTAL_WORK": { - "TITLE": "Total Worked", - "DESCRIPTION": "Today", - "LABEL": "Total worked Today" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Quante ore ha lavorato l'impiegato in totale e oggi sul compito", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Quante ore ha lavorato l'impiegato oggi su tutte le attività per il team selezionato" - }, - "CONFIRM_CLOSE_TASK": "Please confirm if you want to close the task" - }, - - "form": { - "NAME_PLACEHOLDER": "Enter your name", - "FIRST_NAME_PLACEHOLDER": "First Name", - "LAST_NAME_PLACEHOLDER": "Last Name", - "EMAIL_PLACEHOLDER": "Enter your email address", - "PHONE_PLACEHOLDER": "Phone Number", - - "ISSUE_NAME_PLACEHOLDER": "Issue name", - - "TEAM_NAME_PLACEHOLDER": "Please Enter your team name", - "TASK_INPUT_PLACEHOLDER": "What you working on?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "Team member name", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "Team member email address", - "COMPLETION_DESCRIPTION": "Write the description", - "UPLOAD_FILES": "Upload Files", - "ATTACHMENT_FILE": "Attachment files", - "ADD_COMMENT": "Add Comment here", - "SET_THEME": "Set Theme", - "CHANGE_AVATAR": "Change Avatar", - "SELECT_TEAM_SIZE": "Select Team Size", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "All rights reserved.", - "COPY_RIGHT1": "© {{date}}-Present,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Terms of Service", - "PRIVACY_POLICY": "Privacy Policy", - "COOKIES": "Cookie Policy", - "BY": "By" - } - }, - - "errors": { - "NETWORK_ISSUE": "network issue, please try again later", - "ERROR_WHILE_VERIFY_CODE": "Error while verifying code.", - "LENGTH_NUMBER_ERROR": "Length should be a number and greater than 0", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric", - "VALID_EMAIL": "Please enter valid email" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Press Enter to validate" - }, - "team": { - "BACK_LABEL": "Back to Team", - "PUBLIC_TEAM": "Public Team", - "PRIVATE_TEAM": "Private Team", - "creation": { - "NEW": "Create new team" - } - }, - "links": { - "common": { - "TASKS": "Tasks", - "TEAM": "Team", - "SETTINGS": "Settings" - } - } -} diff --git a/apps/web/public/locales/nl/common.json b/apps/web/public/locales/nl/common.json deleted file mode 100644 index 935941712..000000000 --- a/apps/web/public/locales/nl/common.json +++ /dev/null @@ -1,564 +0,0 @@ -{ - "TITLE": "Ever Teams", - "common": { - "ACCEPT": "Accepteren", - "ACCEPTED": "Geaccepteerd", - "REJECT": "Afwijzen", - "REJECTED": "Afgewezen", - "VERIFY": "verifiëren", - "INVITE": "Uitnodigen", - "INVITED": "Uitgenodigd", - "EXPIRE": "Verlopen", - "EXPIRED": "Verlopen", - "REQUEST": "Verzoek", - "REQUESTED": "Verzocht", - "LABEL": "Label", - "LABELS": "Labels", - "POSITION": "Positie", - "ROLES": "Rollen", - "JOIN_OR_LEFT": "Lid geworden / Vertrokken", - "PLEASE": "alsjeblieft", - "HERE": "hier", - "PEOPLE": "Mensen", - "COLLABORATE": "Samenwerken", - "NO": "Nee", - "ONLY_ME": "Alleen mij", - "YES": "Ja", - "BASIC": "Basis", - "DELETE": "Verwijderen", - "MEET": "Ontmoeten", - "BOARD": "Bord", - "SECURITY_CODE": "Beveiligingscode", - "CONFIRM": "Bevestigen", - "YOUR_EMAIL": "jouw e-mailadres", - "CONTINUE": "Doorgaan", - "EDIT_TASK": "Taak bewerken", - "ASSIGN_TASK": "Taak toewijzen", - "ASSIGN_TASK_TO": "Taak toewijzen", - "REMOVE_ACCOUNT": "Account verwijderen", - "REMOVE_EVERYWHERE": "Overal verwijderen", - "DELETE_ACCOUNT": "Dit account verwijderen", - "UNASSIGN_TASK": "Taak intrekken", - "MAKE_A_MANAGER": "Maak een manager", - "UNMAKE_A_MANAGER": "Maak geen manager", - "TRANSFERT_OWNERSHIP": "Eigendom overdragen", - "TRANSFERT_OWNERSHIP_TO": "Volledige eigendom van team overdragen aan andere gebruiker", - "REMOVE": "Verwijderen", - "REMOVE_TEAM": "Team verwijderen", - "DISPOSE_TEAM": "Team opheffen", - "QUIT_TEAM": "Team verlaten", - "QUIT": "Verlaten", - "STATUSES": "Statussen", - "RESEND_INVITATION": "Uitnodiging opnieuw verzenden", - "TODAY": "Vandaag", - "TOTAL": "Totaal", - "ESTIMATED": "Geschat", - "ESTIMATE": "Schatten", - "STATUS": "Status", - "NAME": "Naam", - "TASK": "Taak", - "MY_TASKS": "Mijn Taken", - "WORKED_ON_TASK": "Werkte aan Taak", - "TOTAL_WORKED_TODAY": "Totaal vandaag gewerkt", - "TOTAL_WORK": "Werk vandaag", - "OPEN": "Open", - "NOW": "Nu", - "NEXT": "Volgende", - "PREV": "Vorige", - "DETAILS": "Details", - "CLOSED": "Gesloten", - "CLOSE": "Sluiten", - "USER_NOT_FOUND": "Geen gebruikers gevonden.", - "TASK_TITTLE": "Taak titel", - "PUBLIC_TASK": "Deze taak is Publiek", - "PRIVATE_TASK": "Deze taak is Prive", - "PUBLIC_TASK_LABEL": "Maak openbaar", - "PRIVATE_TASK_LABEL": "Maak privé", - "CREATE_TASK": "Nieuwe taak maken", - "LINK_TASK": "Gerelateerde kwestie selecteren", - "LINK": "Link", - "LINKS": "Links", - "SHOW": "Tonen", - "ADD_LINK": "Links toevoegen", - "COMMENT": "Reactie", - "DESCRIPTION": "Beschrijving", - "CHILD_ISSUE_TASK": "Selecteer onderliggend probleem", - "CREATE_TEAM": "Nieuw team maken", - "VERIFY_ACCOUNT_MSG": "Verifieer uw account voordat u de app gaat gebruiken", - "CREATE_ROLE": "Rol maken", - "CREATE": "Maken", - "CREATE_ISSUE": "Probleem maken", - "NEW_ISSUE": "Nieuw probleem", - "ACTIVATED": "Geactiveerd", - "DEACTIVATED": "Gedeactiveerd", - "PERIOD": "Periode", - "NEW": "Nieuw", - "CREATE_VERSION": "Versie maken", - "VERSION": "Versie", - "LOADING": "Laden", - "TOTAL_TIME": "Totale tijd", - "LAST_24_HOURS": "Laatste 24 uur", - "WORKED": "Gewerkt", - "ASSIGNED": "Toegewezen", - "SELECT_STATUS": "Status selecteren", - "SELECT_ISSUE": "Probleem selecteren", - "UNASSIGNED": "Niet toegewezen", - "TASK_DETAILS": "Taakdetails", - "TYPE_SOMETHING": "Typ iets", - "FILTER": "Filter", - "APPLY": "Toepassen", - "RESET": "Resetten", - "LOGOUT": "Uitloggen", - "THEMES": "Thema's", - "3D_MODE": "3D-modus", - "DARK_MODE": "Donkere modus", - "SETTINGS": "Instellingen", - "PERSONAL": "Persoonlijk", - "USE_SETTING": "Instelling gebruiken", - "TEAM": "Team", - "MY_TEAM": "Mijn team", - "FULL_NAME": "Volledige naam", - "USER_AVATAR": "Gebruikersavatar", - "CONTACT": "Contact", - "ENABLED": "Inschakelen", - "DISABLED": "Uitzetten", - - "THEME": "Thema", - "TIME_ZONE": "Tijdzone", - "EDIT": "Bewerken", - "SAVE": "Opslaan", - "LANGUAGE": "Taal", - "DETECT": "Detecteren", - "TRANSFER": "Overdragen", - "TRANSFER_TEAM": "Team overdragen", - "TEAM_MEMBERS": "Teamleden", - "NO_TEAM": "Maak uw eigen team of sluit u aan bij een bestaand team", - "NO_TEAM_SUB": "Het is geweldig om met anderen samen te werken, dus creëer een team en nodig iedereen uit om samen te werken!", - "NO_TEAM_TOOLTIP": "Je moet je e-mailadres verifiëren", - "CANCEL": "Annuleren", - "DISCARD": "Negeren", - "EXISTING_MEMBER": "Al lid", - "NEW_MEMBER": "Word lid", - "BACK": "Terug", - "JOIN_REQUEST": "Lid worden aanvragen", - "PERMISSION": "Machtiging", - "SEARCH": "Zoeken", - "ADD_PARENT": "Hoofd toevoegen", - "BLOCKS": "Blokkeert", - "CLONES": "Klonen", - "DUPLICATES": "Dupliceert", - "IS_BLOCKED_BY": "Wordt geblokkeerd door", - "IS_CLONED_BY": "Is gekloond door", - "IS_DUPLICATED_BY": "Is gedupliceerd door", - "RELATES_TO": "Heeft betrekking op", - "CHANGE_PARENT": "Hoofd wijzigen", - "RELATED_ISSUES": "Gerelateerde problemen", - "CHILD_ISSUES": "Onderliggende problemen", - "REOPEN": "Heropenen", - "NO_TASKS": "Geen taken", - "FULL_WIDTH": "Volledige breedte", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Stop de timer voordat u de taak wijzigt", - - "COLLABORATE_DIALOG_TITLE": "Samenwerking starten", - "COLLABORATE_DIALOG_SUB_TITLE": "Nodig teamleden uit en begin samen te werken", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Vergadering of bord samenwerking starten", - "ISSUE_TYPE": "Probleemtype", - "ACTIVITY": "Activiteit", - "FILTER_ALL": "Alle", - "FILTER_COMMENTS": "Reacties", - "FILTER_HISTORY": "Geschiedenis", - "FILTER_UNSUBSCRIBE": "Afmelden", - - "KEYBOARD_SHORTCUTS": "Sneltoetsen", - - "GITHUB_LOADING_TEXT": "We zijn nu uw GitHub-integratie aan het installeren, even geduld...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Synchroniseer taken automatisch in uw applicatie voor naadloze en efficiënte updates.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchroniseer taken selectief door ze te koppelen aan een specifiek label.", - "GITHUB_AUTO_SYNC_LABEL": "Selecteer Auto-Sync-label" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "We werken momenteel aan Real-Time Sync. Bekijk deze functie later opnieuw.", - "ALERT_DELETE_ACCOUNT": "Account wordt verwijderd van alle teams, behalve waar u alleen manager bent", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Uw account wordt permanent verwijderd en uit alle teams verwijderd", - "ALERT_REMOVE_ALL_DATA": "Alle accountgegevens worden verwijderd uit alle teams waar je ALLEEN een bestaande manager bent.", - "ALERT_REMOVE_TEAM": "Team wordt volledig verwijderd uit het systeem en teamleden verliezen toegang", - "ALERT_QUIT_TEAM": "U staat op het punt het team te verlaten" - }, - "pages": { - "home": { - "BREADCRUMB": ["Dashboard"], - "SENT_EMAIL_VERIFICATION": "Codeverificatie is verzonden naar uw e-mailadres", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "U moet", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " uw e-mailadres. De verificatiecode is al verzonden naar uw e-mailadres, maar voel vrij om te klikken", - "SENT_EMAIL_VERIFICATION_RESEND": "om de code opnieuw te verzenden, voor het geval u deze niet heeft ontvangen.", - "INVITATIONS": "U bent uitgenodigd om lid te worden van", - "CONFIRM_ACCEPT_INVITATION": "Weet u zeker dat u de uitnodiging wilt accepteren?", - "CONFIRM_REJECT_INVITATION": "Weet u zeker dat u de uitnodiging wilt afwijzen?" - }, - - "profile": { - "BREADCRUMB": ["Taken teamlid"] - }, - "taskDetails": { - "BREADCRUMB": ["Taakdetails"], - "DESCRIPTION": "Beschrijvingen", - "ADD_DESCRIPTION": "Voeg hier beschrijving toe", - "TYPE_OF_ISSUE": "Soort probleem", - "CREATOR": "Maker", - "ASSIGNEES": "Toegewezenen", - "START_DATE": "Startdatum", - "DUE_DATE": "Uiterste datum", - "DAYS_REMAINING": "Resterende dagen", - "VERSION": "Versie", - "EPIC": "Epic", - "STATUS": "Status", - "LABEL": "Label", - "LABELS": "Labels", - "SIZE": "Grootte", - "PRIORITY": "Prioriteit", - "ESTIMATIONS": "Schattingen", - "PROGRESS": "Voortgang", - "TOTAL_TIME": "Totale tijd", - "TIME_TODAY": "Tijd vandaag", - "TOTAL_GROUP_TIME": "Totale groepstijd", - "TIME_REMAINING": "Resterende tijd", - "CREATED": "Gemaakt", - "UPDATED": "Bijgewerkt", - "RESOLVED": "Opgelost", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "We konden de taaktitel niet bijwerken.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "De taaktitel kan niet langer zijn dan 255 tekens.", - - "TASK_IS_ALREADY_EPIC": "Epic taaktype kan niet worden gewijzigd.", - "TASK_HAS_PARENT": "Taaktype kan niet worden gewijzigd omdat de taak al een bovenliggende taak heeft." - }, - - "auth": { - "SEND_CODE": "code verzenden", - "JOIN": "Word lid", - "UNRECEIVED_CODE": "Geen code ontvangen?", - "JOIN_TEAM": "Word lid van team", - "INPUT_INVITE_CODE": "Uitnodigingscode invoeren.", - "INPUT_INVITE_CODE_DESC": "Voer de uitnodigingscode in die we naar uw e-mail hebben gestuurd.", - "INVALID_INVITE_CODE_MESSAGE": "Ongeldige code", - "WELCOME_TEAMS": "Welkom bij Ever Teams", - - "COVER_TITLE": "Volg de werkvoortgang van uw teams in realtime!", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Inloggen", - "SELECT_WORKSPACE": "Selecteer werkruimte", - "ENTER_EMAIL": "Voer e-mail in", - "WORKSPACES_NOT_FOUND": "Werkruimtes niet gevonden" - }, - "authPasscode": { - "HEADING_TITLE": "Bestaand team joinen", - "HEADING_DESCRIPTION": "Voer e-mail en uitnodigingscode in om bestaand team te joinen." - }, - "authLogin": { - "HEADING_TITLE": "Login bij het team", - "HEADING_DESCRIPTION": "Voer e-mail en uitnodigingscode in om in te loggen.", - - "WORKSPACE": "Werkruimte", - "HEADING_WORKSPACE_LINE1": "Het e-mailadres is gekoppeld aan meerdere werkruimtes,", - "HEADING_WORKSPACE_LINE2": "selecteer er een om door te gaan" - }, - "authTeam": { - "HEADING_TITLE": "Nieuw team maken", - "HEADING_DESCRIPTION": "Voer uw teamgegevens in om een nieuw team te maken.", - "LOADING_TEXT": "We maken nu uw nieuwe werkplek aan, even geduld...", - "VERIFY_EMAIL_LOADING_TEXT": "We controleren uw e-mailadres, even geduld...", - "INPUT_TEAM_NAME": "Voer uw teamnaam in", - "JOIN_EXISTING_TEAM": "Bestaand team joinen?", - "CREATE_FIRST_TEAM": "Maak uw eerste team", - "CREATE_TEAM": "Team maken" - }, - "settings": { - "BREADCRUMB": [{ "title": "Dashboard", "href": "/" }, "Instellingen"], - "DANDER_ZONE": "Gevaarlijke zone", - "HEADING_DESCRIPTION": "Stel hier uw persoonlijke dashboard in", - "ARE_YOU_SURE_TO_DELETE_USER": "Weet u zeker dat u deze gebruiker wilt verwijderen?" - }, - "settingsPersonal": { - "HEADING_TITLE": "Algemene instellingen", - "emailNotValid": "Voer een geldig e-mailadres in", - "phoneNotValid": "Voer een geldig telefoonnummer in", - "WORK_SCHEDULE": "Werkschema", - "SUBSCRIPTION": "Abonnement", - "TIMEZONE_SEARCH_PLACEHOLDER": "Uw tijdzone", - "ABOUT_TO_CHANGE_EMAIL": "U staat op het punt het e-mailadres te wijzigen", - "ABOUT_TO_DELETE_ACCOUNT": "U staat op het punt uw account te verwijderen?", - "DATA_SYNCHRONIZATION": "Gegevenssynchronisatie", - "ABOUT_TO_REMOVE_ACCOUNT": "U staat op het punt uw account te verwijderen?" - }, - "settingsTeam": { - "HEADING_TITLE": "Algemene instellingen", - "MEMBER_HEADING_TITLE": "Leden", - "PRIORITIES_HEADING": "Prioriteiten", - "NOTIFICATION_HEADING": "Meldingen", - "SIZES_HEADING": "Formaten", - "TEAM_NAME": "Teamnaam", - "TEAM_TYPE": "Teamtype", - "TIME_TRACKING": "Tijd bijhouden", - - "ADD_NEW_MEMBER": "Nieuw lid toevoegen", - "MANAGE_ASSIGNEES": "Toegewezenen beheren", - "SEARCH_MEMBER": "Lid zoeken", - "TASK_STATUSES": "Taakstatussen", - "TASK_PRIORITIES": "Taakprioriteiten", - "TASK_SIZES": "Taakformaten", - "TASK_LABELS": "Taaklabels", - "ISSUE_TYPES": "Probleemtypen", - "RELATED_TYPE": "Gerelateerd type", - - "INVITATION_HEADING_TITLE": "Uitnodigingen", - "CREATE_NEW_STATUSES": "Nieuwe statussen maken", - "CREATE_NEW_STATUS": "Nieuwe status maken", - "CREATE_NEW_VERSION": "Nieuwe versie maken", - "CREATE_NEW_PRIORITIES": "Nieuwe prioriteiten maken", - "CREATE_NEW_PRIORITY": "Nieuwe prioriteit maken", - "CREATE_NEW_SIZES": "Nieuwe formaten maken", - "CREATE_NEW_SIZE": "Nieuw formaat maken", - "CREATE_NEW_LABELS": "Nieuwe labels maken", - "CREATE_NEW_LABEL": "Nieuw label maken", - "CREATE_NEW_ISSUE_TYPES": "Nieuwe problemen maken", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Persoonlijke ledeninformatie verbergen", - "POSITION_CUSTOM": "Posities aanpassen", - "INVITATION_EXPIRATION": "Verloop uitnodiging", - "NOTIFY_IF": "Melden indien", - "TEAM_REQUEST": "Teamverzoek", - "WORK_SCHEDULE": "Werkschema", - "MEMBER_AND_ROLES": "Leden & rollen", - "INTEGRATIONS": "Integraties", - "DANDER_ZONES": "Gevaarlijke zone", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Verbind met GitHub en begin GitHub-issues te synchroniseren met uw team", - "SELECT_REPOSITORY": "Selecteer opslagplaats", - - "INSTALL": "Installeren", - - "LIST_OF_STATUSES": "Lijst met statussen", - "LIST_OF_PRIORITIES": "Lijst met prioriteiten", - "LIST_OF_SIZES": "Lijst met formaten", - "LIST_OF_LABELS": "Lijst met labels", - "LIST_OF_ISSUES_TYPE": "Lijst met problemen", - - "GENERAL": "Algemeen", - "SOUND": "Geluid", - "EMAIL": "E-mail", - "USERS": "Gebruikers", - "TASKS": "Taken", - "SYSTEM": "Systeem", - "SECURITY": "Beveiliging", - "INAPP": "In app", - "NOTIFICATION_HEADING_TITLE": "Meldingen instellen", - "ISSUE_HEADING_TITLE": "Probleeminstellingen", - - "TASK_PRIVACY": "Taakprivacy", - "MULTIPLE_ASSIGNEES": "Meerdere toegewezenen", - "MANUAL_TIME": "Handmatige tijd", - "GROUP_ESTIMATION": "Groepsschatting", - "ESTIMATION_IN_HOURS": "Schatting in uren", - "ESTIMATION_IN_STORY_POINTS": "Schatting in story points", - "PROOF_OF_COMPLETION": "Bewijs van voltooiing", - "LINKED_ISSUES": "Gelinkte problemen", - "COMMENTS": "Reacties", - "HISTORY": "Geschiedenis", - "ACCEPTANCE_CRITERIA": "Acceptatiecriteria", - "DRAFT_ISSUES": "Conceptproblemen", - "AUTO_CLOSE_ISSUE": "Probleem automatisch sluiten", - "AUTO_ARCHIVE_ISSUE": "Probleem automatisch archiveren", - "AUTO_STATUS": "Automatische status", - "VERSIONS": "Versies", - "LIST_OF_VERSONS": "Lijst met versies", - "ISSUETYPE": "Probleemtypen", - "LIST_OF_ISSUES": "Lijst met problemen", - "RELATED_ISSUE_TYPE": "Gerelateerde probleemtypen", - "LIST_OF_RELATED_TYPE": "Lijst met gerelateerde typen", - "INITIAL": "Initieel", - "COPY_NUMBER": "Kopienummer", - "IN_PROGRESS": "Bezig", - "FINAL": "Eind", - "DISPOSE_TEAM": "U staat op het punt het team op te heffen?", - "QUIT_TEAM": "U staat op het punt het team te verlaten?", - "TEAM_COLOR": "Teamkleur", - "TEAM_SIZE": "Teamgrootte", - "EMOJI": "Emoji", - "ISSUES_HEADING_TITLE": "Probleeminstellingen", - - "TRACK_TIME": "Tijd bijhouden", - "ESTIMATE_ISSUE": "Probleem schatten", - "EPICS_CREATE_CLOSE": "Epics maken/sluiten", - "ISSUE_CREATE_CLOSE": "Probleem maken/sluiten", - "ISSUE_ASSIGN_UNASSIGN": "Probleem toewijzen/intrekken", - "INVITE_MEMBERS": "Leden uitnodigen", - "REMOVE_MEMBERS": "Leden verwijderen", - "HANDLE_REQUESTS": "Verzoeken behandelen", - "ROLES_POSITIONS_CHANGE": "Rollen/posities wijzigen", - "VIEW_DETAILS": "Details bekijken", - - "NO_INVITATIONS": "Er zijn op dit moment geen uitnodigingen!", - "NO_MEMBERS": "Er zijn op dit moment geen leden!" - }, - "invite": { - "HEADING_TITLE": "Invite member to your team", - "HEADING_DESCRIPTION": "Send invitation to a team member by email", - "TEAM_MEMBER_EMAIL": "Team Member's Email", - "TEAM_MEMBER_FULLNAME": "Team Member's Full Name", - "SEND_INVITE": "Send Invitation", - "ERROR_WHILE_ACCEPTING_INVITATION": "Error while accepting invitation", - "ERROR_WHILE_REJECTING_INVITATION": "Error while rejecting invitation", - "INVITE_LABEL_SEND": "Send Invite", - "invitationTable": { - "NAME_AND_EMAIL": "Name & Email", - "POSITION": "Position", - "DATE_AND_TIME_REQUEST": "Date & Time Request", - "CV_OR_ATTACHMENT": "CV / Attachement" - } - }, - "permissions": { - "SELECT_ROLES": "Select Roles" - }, - "unauthorized": { - "TITLE": "Ongeautoriseerd", - "HEADING_TITLE": "U heeft geen toegang tot deze pagina!", - "HEADING_DESCRIPTION": "Onze excuses voor het ongemak, maar u heeft geen toegang tot deze pagina. Als u denkt dat dit een fout is. Log alsjeblieft in" - }, - "page404": { - "HEADING_TITLE": "Not Found", - "HEADING_DESCRIPTION": "Resource you are looking for not found!", - "LINK_LABEL": "Go to homepage" - }, - "offline": { - "HEADING_TITLE": "Netwerk Verbroken!", - "HEADING_DESCRIPTION": "U bent momenteel offline, controleer uw internetverbinding..." - }, - "error": { - "TITLE": "Fout !", - "HEADING_TITLE": "Er is iets fout gegaan !", - "HEADING_DESCRIPTION": "Als het probleem aanhoudt, stuur dan een noodsignaal naar ons ondersteuningsteam." - }, - "maintenance": { - "HEADING_TITLE": "Wij zijn in onderhoud", - "HEADING_DESCRIPTION": "Momenteel zijn wij onze website aan het vernieuwen om u nog beter van dienst te kunnen zijn. Kom later nog eens terug." - } - }, - - "timer": { - "START_TIMER": "Selecteer of maak een nieuwe taak aan om de tijd bij te houden", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Timer gestopt", - "STOPPED_TIMER_TOAST_DESCRIPTION": "Timer gestopt wegens teamwissel" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Schatten" - }, - "DAY_LIST": [{ "title": "7 dagen" }, { "title": "14 dagen" }] - }, - - "task": { - "TITLE": "Taak", - "ASSIGN_NEW_TASK": "Nieuwe taak toewijzen", - "ASSIGNED_BY": "Toegewezen door", - "NO_ONE_FOR_TASK": "Niemand toegewezen aan deze taak", - "WORKED_TODAY_ON_TASK_TOOLTIP": "vandaag gewerkt aan deze taak voor", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "in totaal gewerkt aan deze taak voor", - "WORKED_TODAY_ON_ALL_TOOLTIP": "vandaag gewerkt aan alles voor", - "TASKS_FOR_TOOLTIP": "taken voor", - "taskLabel": { - "WORK_LABEL": "Gewerkt", - "TASK_ASSIGNED": "Toegewezen", - "TASK_UNASSIGNED": "Niet toegewezen", - "BUTTON_LABEL": "Taak toewijzen" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "Dit tabblad toont alle taken waar u aan begonnen bent", - "ASSIGNED_DESCRIPTION": "Dit tabblad toont alle taken die aan u zijn toegewezen", - "UNASSIGNED_DESCRIPTION": "Dit tabblad toont alle taken die niet aan u zijn toegewezen", - "NO_TASK_USER_ASSIGNED": "Niemand toegewezen aan deze taak" - }, - "taskTableHead": { - "TASK_NAME": "Naam", - "TASK_STATUS": "Status", - "TASK_WORK": { - "TITLE": "Gewerkt aan", - "DESCRIPTION": "Taak", - "LABEL": "Gewerkt aan taak" - }, - "TASK_TIME": "Schatting", - "TOTAL_WORK": { - "TITLE": "Totaal gewerkt", - "DESCRIPTION": "Vandaag", - "LABEL": "Totaal gewerkt vandaag" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Hoeveel uur heeft de werknemer in totaal en vandaag aan de taak gewerkt", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Hoeveel uur heeft de werknemer vandaag gewerkt aan alle taken voor het geselecteerde team" - }, - "CONFIRM_CLOSE_TASK": "Bevestig als u de taak wilt sluiten" - }, - - "form": { - "NAME_PLACEHOLDER": "Voer uw naam in", - "FIRST_NAME_PLACEHOLDER": "Voornaam", - "LAST_NAME_PLACEHOLDER": "Achternaam", - "EMAIL_PLACEHOLDER": "Voer uw e-mailadres in", - "PHONE_PLACEHOLDER": "Telefoonnummer", - - "ISSUE_NAME_PLACEHOLDER": "Probleemnaam", - - "TEAM_NAME_PLACEHOLDER": "Voer uw teamnaam in", - "TASK_INPUT_PLACEHOLDER": "Waar werk je aan?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "Teamlidnaam", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "E-mailadres teamlid", - "COMPLETION_DESCRIPTION": "Schrijf de omschrijving", - "UPLOAD_FILES": "Bestanden uploaden", - "ATTACHMENT_FILE": "Bijgevoegde bestanden", - "ADD_COMMENT": "Reactie toevoegen", - "SET_THEME": "Thema instellen", - "CHANGE_AVATAR": "Avatar wijzigen", - "SELECT_TEAM_SIZE": "Selecteer teamgrootte", - "INVALID_ALLOWED_CHARACTER": "Ongeldige waarde voor allowedCharacters. Gebruik alpha, numeriek of alfanumeriek" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "Alle rechten voorbehouden.", - "COPY_RIGHT1": "© {{date}}-Heden,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Gebruiksvoorwaarden", - "PRIVACY_POLICY": "Privacybeleid", - "COOKIES": "Cookiebeleid", - "BY": "Door" - } - }, - - "errors": { - "NETWORK_ISSUE": "netwerkprobleem, probeer het later nog eens", - "ERROR_WHILE_VERIFY_CODE": "Fout tijdens verificatiecode.", - "LENGTH_NUMBER_ERROR": "Lengte moet een getal zijn en groter dan 0", - "INVALID_ALLOWED_CHARACTER": "Ongeldige waarde voor allowedCharacters. Gebruik alpha, numeriek of alfanumeriek", - "VALID_EMAIL": "Voer een geldig e-mailadres in" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Druk op Enter om te valideren" - }, - "team": { - "BACK_LABEL": "Terug naar team", - "PUBLIC_TEAM": "Openbaar team", - "PRIVATE_TEAM": "Privéteam", - "creation": { - "NEW": "Nieuw team maken" - } - }, - "links": { - "common": { - "TASKS": "Taken", - "TEAM": "Team", - "SETTINGS": "Instellingen" - } - } -} diff --git a/apps/web/public/locales/pl/common.json b/apps/web/public/locales/pl/common.json deleted file mode 100644 index 199a30216..000000000 --- a/apps/web/public/locales/pl/common.json +++ /dev/null @@ -1,584 +0,0 @@ -{ - "TITLE": "Ever Teams", - "common": { - "ACCEPT": "Accept", - "ACCEPTED": "Accepted", - "REJECT": "Reject", - "REJECTED": "Rejected", - "VERIFY": "verify", - "INVITE": "Invite", - "INVITED": "Invited", - "EXPIRE": "Expire", - "EXPIRED": "Expired", - "REQUEST": "Request", - "REQUESTED": "Requested", - "LABEL": "Label", - "LABELS": "Labels", - "POSITION": "Position", - "ROLES": "Roles", - "JOIN_OR_LEFT": "Joined / Left", - "PLEASE": "please", - "HERE": "here", - "PEOPLE": "People", - "COLLABORATE": "Collaborate", - "NO": "No", - "ONLY_ME": "Only me", - "YES": "Yes", - "BASIC": "Basic", - "DELETE": "Delete", - "MEET": "Meet", - "BOARD": "Board", - "SECURITY_CODE": "Security Code", - "CONFIRM": "Confirm", - "YOUR_EMAIL": "your email", - "CONTINUE": "Continue", - "EDIT_TASK": "Edit Task", - "ASSIGN_TASK": "Assign Task", - "ASSIGN_TASK_TO": "Assign Task", - "REMOVE_ACCOUNT": "Remove Account", - "REMOVE_EVERYWHERE": "Remove From All Teams", - "DELETE_ACCOUNT": "Delete This Account", - "UNASSIGN_TASK": "Unassign Task", - "MAKE_A_MANAGER": "Make a Manager", - "UNMAKE_A_MANAGER": "Unmake a Manager", - "TRANSFERT_OWNERSHIP": "Transfer Ownership", - "TRANSFERT_OWNERSHIP_TO": "Transfer full ownership of team to another user", - "REMOVE": "Remove", - "REMOVE_TEAM": "Remove Team", - "DISPOSE_TEAM": "Dispose Team", - "QUIT_TEAM": "Quit the Team", - "QUIT": "Quit", - "STATUSES": "Statuses", - "RESEND_INVITATION": "Resend Invitation", - "TODAY": "Today", - "TOTAL": "Total", - "ESTIMATED": "Estimated", - "ESTIMATE": "Estimate", - "STATUS": "Status", - "NAME": "Name", - "TASK": "Task", - "MY_TASKS": "My Tasks", - "WORKED_ON_TASK": "Worked on Task", - "TOTAL_WORKED_TODAY": "Total worked Today", - "TOTAL_WORK": "Today work", - "OPEN": "Open", - "NOW": "Now", - "NEXT": "Next", - "PREV": "Previous", - "DETAILS": "Details", - "CLOSED": "Closed", - "CLOSE": "Close", - "USER_NOT_FOUND": "No users found.", - "TASK_TITTLE": "Task Title", - "PUBLIC_TASK": "This task is Public", - "PRIVATE_TASK": "This task is Private", - "PUBLIC_TASK_LABEL": "Make a public", - "PRIVATE_TASK_LABEL": "Make a private", - "CREATE_TASK": "Create New Task", - "LINK_TASK": "Select Related Issue", - "LINK": "Link", - "LINKS": "Links", - "SHOW": "Show", - "ADD_LINK": "Add Links", - "COMMENT": "Comment", - "DESCRIPTION": "Description", - "CHILD_ISSUE_TASK": "Select Child Issue", - "CREATE_TEAM": "Create New Team", - "VERIFY_ACCOUNT_MSG": "Please Verify your account before start using the app", - "CREATE_ROLE": "Create Role", - "CREATE": "Create", - "CREATE_ISSUE": "Create issue", - "NEW_ISSUE": "New Issue", - "ACTIVATED": "Activated", - "DEACTIVATED": "Activated", - "PERIOD": "Period", - "NEW": "New", - "CREATE_VERSION": "Create Version", - "VERSION": "Version", - "LOADING": "Loading", - "TOTAL_TIME": "Total time", - "LAST_24_HOURS": "Last 24 Hours", - "WORKED": "Worked", - "ASSIGNED": "Assigned", - "SELECT_STATUS": "Select status", - "SELECT_ISSUE": "Select Issue", - "UNASSIGNED": "Unassigned", - "TASK_DETAILS": "Task Details", - "TYPE_SOMETHING": "Type something", - "FILTER": "Filter", - "APPLY": "Apply", - "RESET": "Reset", - "LOGOUT": "Log Out", - "THEMES": "Themes", - "3D_MODE": "3D Mode", - "DARK_MODE": "Dark Mode", - "SETTINGS": "Settings", - "PERSONAL": "Personal", - "USE_SETTING": "Use setting", - "TEAM": "Team", - "MY_TEAM": "My Team", - "FULL_NAME": "Full Name", - "USER_AVATAR": "User Avatar", - "CONTACT": "Contact", - "ENABLED": "Włączać", - "DISABLED": "Wyłączyć", - - "THEME": "Theme", - "TIME_ZONE": "Timezone", - "EDIT": "Edit", - "SAVE": "Save", - "LANGUAGE": "Language", - "DETECT": "Detect", - "TRANSFER": "Transfer", - "TRANSFER_TEAM": "Transfer Team", - "TEAM_MEMBERS": "Team Members", - "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "Świetnie jest pracować z innymi, więc stwórz zespół i zaproś wszystkich do współpracy!", - "NO_TEAM_TOOLTIP": "Musisz zweryfikować swój adres e-mail", - "CANCEL": "Cancel", - "DISCARD": "Discard", - "EXISTING_MEMBER": "Already a Member", - "NEW_MEMBER": "Become a Member", - "BACK": "Back", - "DONT_HAVE_ACCOUNT": "Don't have an account?", - "REGISTER": "Register Now!", - "JOIN_REQUEST": "Request To Join", - "PERMISSION": "Permission", - "SEARCH": "Search", - "ADD_PARENT": "Add Parent", - "BLOCKS": "Blocks", - "CLONES": "Clones", - "DUPLICATES": "Duplicates", - "IS_BLOCKED_BY": "Is Blocked By", - "IS_CLONED_BY": "Is Cloned By", - "IS_DUPLICATED_BY": "Is Duplicated By", - "RELATES_TO": "Relates To", - "CHANGE_PARENT": "Change Parent", - "RELATED_ISSUES": "Related Issues", - "CHILD_ISSUES": "Child Issues", - "REOPEN": "Reopen", - "NO_TASKS": "No Tasks", - "FULL_WIDTH": "Pełna szerokośćh", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Please stop the Timer before changing the Task", - - "COLLABORATE_DIALOG_TITLE": "Start Collaboration", - "COLLABORATE_DIALOG_SUB_TITLE": "Invite member(s) and start collaborating", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Start Meeting or Board Collaboration", - "ISSUE_TYPE": "Issue Type", - "ACTIVITY": "Activity", - "FILTER_ALL": "All", - "FILTER_COMMENTS": "Comments", - "FILTER_HISTORY": "History", - "FILTER_UNSUBSCRIBE": "Unsubscribe", - - "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", - - "GITHUB_LOADING_TEXT": "Aktualnie instalujemy integrację GitHub, proszę czekać...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Automatycznie synchronizuj zadania w swojej aplikacji, aby uzyskać płynne i efektywne aktualizacje.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Synchronizuj zadania selektywnie, łącząc je z konkretną etykietą.", - "GITHUB_AUTO_SYNC_LABEL": "Wybierz etykietę automatycznej synchronizacji" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "W tej chwili pracujemy nad synchronizacją w czasie rzeczywistym. Sprawdź tę funkcję później.", - "ALERT_DELETE_ACCOUNT": "You will be removed from all teams, except where you are the only manager in the team", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Your Account will be deleted permanently with removing from all teams", - "ALERT_REMOVE_ALL_DATA": "Wszystkie dane konta zostaną usunięte ze wszystkich zespołów, w których istnieje TYLKO jeden menedżer.r", - "ALERT_REMOVE_TEAM": "Team will be completely removed for the system and team members lost access", - "ALERT_QUIT_TEAM": "You are about to quit the team" - }, - "pages": { - "home": { - "BREADCRUMB": ["Dashboard"], - "SENT_EMAIL_VERIFICATION": "Code Verification has been sent to your email", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "You need to ", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " your email address. The verification code should already be send to your email, but feel free to click ", - "SENT_EMAIL_VERIFICATION_RESEND": " to resend the code, if you did not received it.", - "INVITATIONS": "You've been invited to join", - "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", - "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" - }, - - "profile": { - "BREADCRUMB": ["Member Tasks"] - }, - - "taskDetails": { - "BREADCRUMB": ["Task Details"], - "DESCRIPTION": "Descriptions", - "ADD_DESCRIPTION": "Add Description here", - "TYPE_OF_ISSUE": "Type of Issue", - "CREATOR": "Creator", - "ASSIGNEES": "Assignees", - "START_DATE": "Start Date", - "DUE_DATE": "Due Date", - "DAYS_REMAINING": "Days Remaining", - "VERSION": "Version", - "EPIC": "Epic", - "STATUS": "Status", - "LABEL": "Label", - "LABELS": "Labels", - "SIZE": "Size", - "PRIORITY": "Priority", - "ESTIMATIONS": "Estimations", - "PROGRESS": "Progress", - "TOTAL_TIME": "Total Time", - "TIME_TODAY": "Time Today", - "TOTAL_GROUP_TIME": "Total Group Time", - "TIME_REMAINING": "Time Remaining", - "CREATED": "Created", - "UPDATED": "Updated", - "RESOLVED": "Resolved", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "We couldn't update Task Title.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "Task Title can't exceed 255 characters.", - - "TASK_IS_ALREADY_EPIC": "Epic Task Type can not be changed.", - "TASK_HAS_PARENT": "Task Type can not be changed as Task has already Parent." - }, - - "auth": { - "SEND_CODE": "send code", - "JOIN": "Join", - "UNRECEIVED_CODE": "Didn't receive code ?", - "JOIN_TEAM": "Join Team", - "INPUT_INVITE_CODE": "Input invitation code.", - "INPUT_INVITE_CODE_DESC": "Enter the invitation code we sent to your email.", - "INVALID_INVITE_CODE_MESSAGE": "Invalid Code", - "WELCOME_TEAMS": "Welcome to Ever Teams", - - "COVER_TITLE": "Open Work and Project Management Platform", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Login", - "SELECT_WORKSPACE": "Select Workspace", - "ENTER_EMAIL": "Enter Email", - "WORKSPACES_NOT_FOUND": "Workspaces Not Found" - }, - "authPasscode": { - "HEADING_TITLE": "Join existing Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to join existing team." - }, - "authLogin": { - "HEADING_TITLE": "Login to the Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to login.", - - "WORKSPACE": "Workspace", - "HEADING_WORKSPACE_LINE1": "The email associated with multiple workspaces,", - "HEADING_WORKSPACE_LINE2": "please select one to continue" - }, - "authTeam": { - "HEADING_TITLE": "Create New Team", - "HEADING_DESCRIPTION": "Please enter your team details to create a new team.", - "LOADING_TEXT": "We are now creating your new workplace, hold on...", - "VERIFY_EMAIL_LOADING_TEXT": "We are verifying your email, hold on...", - "INPUT_TEAM_NAME": "Input your team name", - "JOIN_EXISTING_TEAM": "Joining existing team?", - "CREATE_FIRST_TEAM": "Create your first team", - "CREATE_TEAM": "Create team" - }, - "settings": { - "BREADCRUMB": [{ "title": "Dashboard", "href": "/" }, "Settings"], - "DANDER_ZONE": "Danger Zone", - "HEADING_DESCRIPTION": "Setting dan manage your personal dashboard here", - "ARE_YOU_SURE_TO_DELETE_USER": "Are you sure you want to delete this user?" - }, - "settingsPersonal": { - "HEADING_TITLE": "General Settings", - "emailNotValid": "Please provide a valid Email", - "phoneNotValid": "Please provide a valid Phone Number", - "WORK_SCHEDULE": "Work Schedule", - "SUBSCRIPTION": "Subscription", - "ABOUT_TO_CHANGE_EMAIL": "You are about to change Email", - "ABOUT_TO_DELETE_ACCOUNT": "You are about to Delete your account ?", - "DATA_SYNCHRONIZATION": "Synchronizacja danych", - "ABOUT_TO_REMOVE_ACCOUNT": "You are about to Remove your account ?" - }, - "settingsTeam": { - "HEADING_TITLE": "General Settings", - "MEMBER_HEADING_TITLE": "Members", - "PRIORITIES_HEADING": "Priorities", - "NOTIFICATION_HEADING": "Notifications", - "SIZES_HEADING": "Sizes", - "TEAM_NAME": "Team Name", - "TEAM_TYPE": "Team Type", - "TIME_TRACKING": "Time Tracking", - - "ADD_NEW_MEMBER": "Add new member", - "MANAGE_ASSIGNEES": "Manage Assignees", - "SEARCH_MEMBER": "Search Member", - "TASK_STATUSES": "Task Statuses", - "TASK_PRIORITIES": "Task Priorities", - "TASK_SIZES": "Task Sizes", - "TASK_LABELS": "Task Labels", - "ISSUE_TYPES": "Issue Types", - "RELATED_TYPE": "Related Type", - - "INVITATION_HEADING_TITLE": "Invitations", - "CREATE_NEW_STATUSES": "Create new Statuses", - "CREATE_NEW_STATUS": "Create new Status", - "CREATE_NEW_VERSION": "Create new Version", - "CREATE_NEW_PRIORITIES": "Create new Priorities", - "CREATE_NEW_PRIORITY": "Create new Priority", - "CREATE_NEW_SIZES": "Create new Sizes", - "CREATE_NEW_SIZE": "Create new Size", - "CREATE_NEW_LABELS": "Create new Labels", - "CREATE_NEW_LABEL": "Create new Label", - "CREATE_NEW_ISSUE_TYPES": "Create new Issues", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Hide Personal Members Information", - "POSITION_CUSTOM": "Positions custom", - "INVITATION_EXPIRATION": "Invitation Expiration", - "NOTIFY_IF": "Notify if", - "TEAM_REQUEST": "Team Request", - "WORK_SCHEDULE": "Work schedule", - "MEMBER_AND_ROLES": "Members & Roles", - "INTEGRATIONS": "Integrations", - "DANDER_ZONES": "Danger Zone", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Connect with GitHub and start Syncing GitHub issues with your Team", - "SELECT_REPOSITORY": "Select Repository", - - "INSTALL": "Install", - - "LIST_OF_STATUSES": "List of Statuses", - "LIST_OF_PRIORITIES": "List of Priorities", - "LIST_OF_SIZES": "List of Sizes", - "LIST_OF_LABELS": "List of Labels", - "LIST_OF_ISSUES_TYPE": "List of Issues", - - "GENERAL": "General", - "SOUND": "Sound", - "EMAIL": "Email", - "USERS": "Users", - "TASKS": "Tasks", - "SYSTEM": "System", - "SECURITY": "Security", - "INAPP": "In App", - "NOTIFICATION_HEADING_TITLE": "Notification Settings", - "ISSUE_HEADING_TITLE": "Issue Settings", - - "TASK_PRIVACY": "Task Privacy", - "MULTIPLE_ASSIGNEES": "Multiple Assignees", - "MANUAL_TIME": "Manual Time", - "GROUP_ESTIMATION": "Group Estimation", - "ESTIMATION_IN_HOURS": "Estimation in Hours", - "ESTIMATION_IN_STORY_POINTS": "Estimation in Story Points", - "PROOF_OF_COMPLETION": "Proof of Completion", - "LINKED_ISSUES": "Linked Issues", - "COMMENTS": "Comments", - "HISTORY": "History", - "ACCEPTANCE_CRITERIA": "Acceptance criteria", - "DRAFT_ISSUES": "Draft Issues", - "AUTO_CLOSE_ISSUE": "Auto-close issue", - "AUTO_ARCHIVE_ISSUE": "Auto-archive issue", - "AUTO_STATUS": "Auto-Status", - "VERSIONS": "Versions", - "LIST_OF_VERSONS": "List of Versions", - "ISSUETYPE": "Issue Types", - "LIST_OF_ISSUES": "List of Issues", - "RELATED_ISSUE_TYPE": "Related Issue Types", - "LIST_OF_RELATED_TYPE": "List of Related Types", - "INITIAL": "Initial", - "COPY_NUMBER": "Copy Number", - "IN_PROGRESS": "In Progress", - "FINAL": "Final", - "DISPOSE_TEAM": "You are about to Dispose team ?", - "QUIT_TEAM": "You are about to Quit team ?", - "TEAM_COLOR": "Team Color", - "TEAM_SIZE": "Team Size", - "EMOJI": "Emoji", - "ISSUES_HEADING_TITLE": "Issues Settings", - - "TRACK_TIME": "Track Time", - "ESTIMATE_ISSUE": "Estimate issue", - "EPICS_CREATE_CLOSE": "Epics Create/Close", - "ISSUE_CREATE_CLOSE": "Issue Create/Close", - "ISSUE_ASSIGN_UNASSIGN": "Issue Assign/Unassign", - "INVITE_MEMBERS": "Invite members", - "REMOVE_MEMBERS": "Remove members", - "HANDLE_REQUESTS": "Handle requests", - "ROLES_POSITIONS_CHANGE": "Roles/Positions change", - "VIEW_DETAILS": "View Details", - - "NO_INVITATIONS": "There are no Invitations at the moment!", - "NO_MEMBERS": "There are no Members at the moment!" - }, - "invite": { - "HEADING_TITLE": "Invite member to your team", - "HEADING_DESCRIPTION": "Send invitation to a team member by email", - "TEAM_MEMBER_EMAIL": "Team Member's Email", - "TEAM_MEMBER_FULLNAME": "Team Member's Full Name", - "SEND_INVITE": "Send Invitation", - "ERROR_WHILE_ACCEPTING_INVITATION": "Error while accepting invitation", - "ERROR_WHILE_REJECTING_INVITATION": "Error while rejecting invitation", - "INVITE_LABEL_SEND": "Send Invite", - "invitationTable": { - "NAME_AND_EMAIL": "Name & Email", - "POSITION": "Position", - "DATE_AND_TIME_REQUEST": "Date & Time Request", - "CV_OR_ATTACHMENT": "CV / Attachement" - } - }, - "permissions": { - "SELECT_ROLES": "Select Roles" - }, - "unauthorized": { - "TITLE": "Nieautoryzowany", - "HEADING_TITLE": "Nie masz uprawnień, aby uzyskać dostęp do tej strony !", - "HEADING_DESCRIPTION": "Przepraszamy za niedogodności, ale nie masz uprawnień dostępu do tej strony. Jeśli uważasz, że to błąd. Proszę się zalogować." - }, - "page404": { - "HEADING_TITLE": "Not Found", - "HEADING_DESCRIPTION": "Resource you are looking for not found!", - "LINK_LABEL": "Go to homepage" - }, - "offline": { - "HEADING_TITLE": "Rozłączono sieć!", - "HEADING_DESCRIPTION": "Jesteś obecnie offline, sprawdź swoje połączenie z internetem..." - }, - "error": { - "TITLE": "Błąd !", - "HEADING_TITLE": "Coś poszło nie tak !", - "HEADING_DESCRIPTION": "Jeśli problem będzie się powtarzał, wyślij sygnał o niebezpieczeństwie do naszego zespołu wsparcia." - }, - "maintenance": { - "HEADING_TITLE": "Jesteśmy w trakcie konserwacji", - "HEADING_DESCRIPTION": "Obecnie aktualizujemy naszą stronę internetową, aby lepiej Ci służyć. Sprawdź ponownie później." - } - }, - - "timer": { - "START_TIMER": "Please, select or create a new task to start tracking the time", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Timer Stopped", - "STOPPED_TIMER_TOAST_DESCRIPTION": "Timer Stopped due to Team Switch" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Estimate" - }, - "DAY_LIST": [{ "title": "7 days" }, { "title": "14 days" }], - "TIME_ACTIVITY": "Activity", - "TOTAL_HOURS": "Total Hours", - "NO_SCREENSHOOT": "No Screenshoots", - "PERCENT_OF_MINUTES": " % of 10 Minutes", - "APPS": "Apps", - "VISITED_DATES": "Visited Dates", - "PERCENT_USED": "Percent Used", - "TIME_SPENT_IN_HOURS": "Time spent (Hours)", - "THERE_IS_NO_APPS_VISITED": "There is no Apps Visited.", - "OTHER_DETAILS": "Other details", - "KEYBOARD": "keyboard", - - "MOUSE": "Mouse", - "TIMES": "Times", - "ACTIVE": "Active", - "INACTIVE": "Inactive", - "ARCHIVED": "Archived", - "NOT_ARCHIVED": "Not archived" - }, - - "task": { - "TITLE": "Task", - "ASSIGN_NEW_TASK": "Assign new task", - "ASSIGNED_BY": "Assigned By", - "NO_ONE_FOR_TASK": "No One Assigned to this Task", - "WORKED_TODAY_ON_TASK_TOOLTIP": "pracował dziś nad tym zadaniem przez", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "pracował nad tym zadaniem przez łącznie", - "WORKED_TODAY_ON_ALL_TOOLTIP": "pracował dziś nad wszystkimi", - "TASKS_FOR_TOOLTIP": "zadania dla", - "taskLabel": { - "WORK_LABEL": "Worked", - "TASK_ASSIGNED": "Assigned", - "TASK_UNASSIGNED": "Unassigned", - "BUTTON_LABEL": "Assign Task" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "This tab shows all tasks you started working on", - "ASSIGNED_DESCRIPTION": "This tab shows all tasks that are assigned to you", - "UNASSIGNED_DESCRIPTION": "This tab shows all tasks that are not assigned to you", - "NO_TASK_USER_ASSIGNED": "No one assigned to this Task" - }, - "taskTableHead": { - "TASK_NAME": "Name", - "TASK_STATUS": "Status", - "TASK_WORK": { - "TITLE": "Worked on", - "DESCRIPTION": "Task", - "LABEL": "Worked on task" - }, - "TASK_TIME": "Estimate", - "TOTAL_WORK": { - "TITLE": "Total Worked", - "DESCRIPTION": "Today", - "LABEL": "Total worked Today" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Ile godzin pracował pracownik ogółem i dzisiaj nad zadaniem", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Ile godzin pracował pracownik dzisiaj nad wszystkimi zadaniami dla wybranego zespołu" - }, - "CONFIRM_CLOSE_TASK": "Please confirm if you want to close the task" - }, - - "form": { - "NAME_PLACEHOLDER": "Enter your name", - "FIRST_NAME_PLACEHOLDER": "First Name", - "LAST_NAME_PLACEHOLDER": "Last Name", - "EMAIL_PLACEHOLDER": "Enter your email address", - "PHONE_PLACEHOLDER": "Phone Number", - - "ISSUE_NAME_PLACEHOLDER": "Issue name", - - "TEAM_NAME_PLACEHOLDER": "Please Enter your team name", - "TASK_INPUT_PLACEHOLDER": "What you working on?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "Team member name", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "Team member email address", - "COMPLETION_DESCRIPTION": "Write the description", - "UPLOAD_FILES": "Upload Files", - "ATTACHMENT_FILE": "Attachment files", - "ADD_COMMENT": "Add Comment here", - "SET_THEME": "Set Theme", - "CHANGE_AVATAR": "Change Avatar", - "SELECT_TEAM_SIZE": "Select Team Size", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "All rights reserved.", - "COPY_RIGHT1": "© {{date}}-Present,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Terms of Service", - "PRIVACY_POLICY": "Privacy Policy", - "COOKIES": "Cookie Policy", - "BY": "By" - } - }, - - "errors": { - "NETWORK_ISSUE": "network issue, please try again later", - "ERROR_WHILE_VERIFY_CODE": "Error while verifying code.", - "LENGTH_NUMBER_ERROR": "Length should be a number and greater than 0", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric", - "VALID_EMAIL": "Please enter valid email" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Press Enter to validate" - }, - "team": { - "BACK_LABEL": "Back to Team", - "PUBLIC_TEAM": "Public Team", - "PRIVATE_TEAM": "Private Team", - "creation": { - "NEW": "Create new team" - } - }, - "links": { - "common": { - "TASKS": "Tasks", - "TEAM": "Team", - "SETTINGS": "Settings" - } - } -} diff --git a/apps/web/public/locales/pt/common.json b/apps/web/public/locales/pt/common.json deleted file mode 100644 index e97234736..000000000 --- a/apps/web/public/locales/pt/common.json +++ /dev/null @@ -1,584 +0,0 @@ -{ - "TITLE": "Ever Teams", - "common": { - "ACCEPT": "Accept", - "ACCEPTED": "Accepted", - "REJECT": "Reject", - "REJECTED": "Rejected", - "VERIFY": "verify", - "INVITE": "Invite", - "INVITED": "Invited", - "EXPIRE": "Expire", - "EXPIRED": "Expired", - "REQUEST": "Request", - "REQUESTED": "Requested", - "LABEL": "Label", - "LABELS": "Labels", - "POSITION": "Position", - "ROLES": "Roles", - "JOIN_OR_LEFT": "Joined / Left", - "PLEASE": "please", - "HERE": "here", - "PEOPLE": "People", - "COLLABORATE": "Collaborate", - "NO": "No", - "ONLY_ME": "Only me", - "YES": "Yes", - "BASIC": "Basic", - "DELETE": "Delete", - "MEET": "Meet", - "BOARD": "Board", - "SECURITY_CODE": "Security Code", - "CONFIRM": "Confirm", - "YOUR_EMAIL": "your email", - "CONTINUE": "Continue", - "EDIT_TASK": "Edit Task", - "ASSIGN_TASK": "Assign Task", - "ASSIGN_TASK_TO": "Assign Task", - "REMOVE_ACCOUNT": "Remove Account", - "REMOVE_EVERYWHERE": "Remove From All Teams", - "DELETE_ACCOUNT": "Delete This Account", - "UNASSIGN_TASK": "Unassign Task", - "MAKE_A_MANAGER": "Make a Manager", - "UNMAKE_A_MANAGER": "Unmake a Manager", - "TRANSFERT_OWNERSHIP": "Transfer Ownership", - "TRANSFERT_OWNERSHIP_TO": "Transfer full ownership of team to another user", - "REMOVE": "Remove", - "REMOVE_TEAM": "Remove Team", - "DISPOSE_TEAM": "Dispose Team", - "QUIT_TEAM": "Quit the Team", - "QUIT": "Quit", - "STATUSES": "Statuses", - "RESEND_INVITATION": "Resend Invitation", - "TODAY": "Today", - "TOTAL": "Total", - "ESTIMATED": "Estimated", - "ESTIMATE": "Estimate", - "STATUS": "Status", - "NAME": "Name", - "TASK": "Task", - "MY_TASKS": "My Tasks", - "WORKED_ON_TASK": "Worked on Task", - "TOTAL_WORKED_TODAY": "Total worked Today", - "TOTAL_WORK": "Today work", - "OPEN": "Open", - "NOW": "Now", - "NEXT": "Next", - "PREV": "Previous", - "DETAILS": "Details", - "CLOSED": "Closed", - "CLOSE": "Close", - "USER_NOT_FOUND": "No users found.", - "TASK_TITTLE": "Task Title", - "PUBLIC_TASK": "This task is Public", - "PRIVATE_TASK": "This task is Private", - "PUBLIC_TASK_LABEL": "Make a public", - "PRIVATE_TASK_LABEL": "Make a private", - "CREATE_TASK": "Create New Task", - "LINK_TASK": "Select Related Issue", - "LINK": "Link", - "LINKS": "Links", - "SHOW": "Show", - "ADD_LINK": "Add Links", - "COMMENT": "Comment", - "DESCRIPTION": "Description", - "CHILD_ISSUE_TASK": "Select Child Issue", - "CREATE_TEAM": "Create New Team", - "VERIFY_ACCOUNT_MSG": "Please Verify your account before start using the app", - "CREATE_ROLE": "Create Role", - "CREATE": "Create", - "CREATE_ISSUE": "Create issue", - "NEW_ISSUE": "New Issue", - "ACTIVATED": "Activated", - "DEACTIVATED": "Activated", - "PERIOD": "Period", - "NEW": "New", - "CREATE_VERSION": "Create Version", - "VERSION": "Version", - "LOADING": "Loading", - "TOTAL_TIME": "Total time", - "LAST_24_HOURS": "Last 24 Hours", - "WORKED": "Worked", - "ASSIGNED": "Assigned", - "SELECT_STATUS": "Select status", - "SELECT_ISSUE": "Select Issue", - "UNASSIGNED": "Unassigned", - "TASK_DETAILS": "Task Details", - "TYPE_SOMETHING": "Type something", - "FILTER": "Filter", - "APPLY": "Apply", - "RESET": "Reset", - "LOGOUT": "Log Out", - "THEMES": "Themes", - "3D_MODE": "3D Mode", - "DARK_MODE": "Dark Mode", - "SETTINGS": "Settings", - "PERSONAL": "Personal", - "USE_SETTING": "Use setting", - "TEAM": "Team", - "MY_TEAM": "My Team", - "FULL_NAME": "Full Name", - "USER_AVATAR": "User Avatar", - "CONTACT": "Contact", - "ENABLED": "Habilitar", - "DISABLED": "Desativar", - - "THEME": "Theme", - "TIME_ZONE": "Timezone", - "EDIT": "Edit", - "SAVE": "Save", - "LANGUAGE": "Language", - "DETECT": "Detect", - "TRANSFER": "Transfer", - "TRANSFER_TEAM": "Transfer Team", - "TEAM_MEMBERS": "Team Members", - "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "É ótimo trabalhar com os outros, então crie uma equipe e convide todos para colaborar!", - "NO_TEAM_TOOLTIP": "Você precisa verificar seu endereço de e-mail", - "CANCEL": "Cancel", - "DISCARD": "Discard", - "EXISTING_MEMBER": "Already a Member", - "NEW_MEMBER": "Become a Member", - "BACK": "Back", - "DONT_HAVE_ACCOUNT": "Don't have an account?", - "REGISTER": "Register Now!", - "JOIN_REQUEST": "Request To Join", - "PERMISSION": "Permission", - "SEARCH": "Search", - "ADD_PARENT": "Add Parent", - "BLOCKS": "Blocks", - "CLONES": "Clones", - "DUPLICATES": "Duplicates", - "IS_BLOCKED_BY": "Is Blocked By", - "IS_CLONED_BY": "Is Cloned By", - "IS_DUPLICATED_BY": "Is Duplicated By", - "RELATES_TO": "Relates To", - "CHANGE_PARENT": "Change Parent", - "RELATED_ISSUES": "Related Issues", - "CHILD_ISSUES": "Child Issues", - "REOPEN": "Reopen", - "NO_TASKS": "No Tasks", - "FULL_WIDTH": "Largura total", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Please stop the Timer before changing the Task", - - "COLLABORATE_DIALOG_TITLE": "Start Collaboration", - "COLLABORATE_DIALOG_SUB_TITLE": "Invite member(s) and start collaborating", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Start Meeting or Board Collaboration", - "ISSUE_TYPE": "Issue Type", - "ACTIVITY": "Activity", - "FILTER_ALL": "All", - "FILTER_COMMENTS": "Comments", - "FILTER_HISTORY": "History", - "FILTER_UNSUBSCRIBE": "Unsubscribe", - - "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", - - "GITHUB_LOADING_TEXT": "Estamos agora a instalar a sua integração do GitHub, aguarde...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Sincronize automaticamente tarefas em seu aplicativo para atualizações sem interrupções e eficientes.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Sincronize tarefas seletivamente associando-as a uma etiqueta específica.", - "GITHUB_AUTO_SYNC_LABEL": "Selecionar rótulo de sincronização automática" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "Estamos trabalhando na sincronização em tempo real no momento. Verifique esse recurso mais tarde.", - "ALERT_DELETE_ACCOUNT": "You will be removed from all teams, except where you are the only manager in the team", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Your Account will be deleted permanently with removing from all teams", - "ALERT_REMOVE_TEAM": "Team will be completely removed for the system and team members lost access", - "ALERT_REMOVE_ALL_DATA": "Todos os dados da conta serão removidos de todas as equipas em que exista APENAS um gestor", - "ALERT_QUIT_TEAM": "You are about to quit the team" - }, - "pages": { - "home": { - "BREADCRUMB": ["Dashboard"], - "SENT_EMAIL_VERIFICATION": "Code Verification has been sent to your email", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "You need to ", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " your email address. The verification code should already be send to your email, but feel free to click ", - "SENT_EMAIL_VERIFICATION_RESEND": " to resend the code, if you did not received it.", - "INVITATIONS": "You've been invited to join", - "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", - "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" - }, - - "profile": { - "BREADCRUMB": ["Member Tasks"] - }, - - "taskDetails": { - "BREADCRUMB": ["Task Details"], - "DESCRIPTION": "Descriptions", - "ADD_DESCRIPTION": "Add Description here", - "TYPE_OF_ISSUE": "Type of Issue", - "CREATOR": "Creator", - "ASSIGNEES": "Assignees", - "START_DATE": "Start Date", - "DUE_DATE": "Due Date", - "DAYS_REMAINING": "Days Remaining", - "VERSION": "Version", - "EPIC": "Epic", - "STATUS": "Status", - "LABEL": "Label", - "LABELS": "Labels", - "SIZE": "Size", - "PRIORITY": "Priority", - "ESTIMATIONS": "Estimations", - "PROGRESS": "Progress", - "TOTAL_TIME": "Total Time", - "TIME_TODAY": "Time Today", - "TOTAL_GROUP_TIME": "Total Group Time", - "TIME_REMAINING": "Time Remaining", - "CREATED": "Created", - "UPDATED": "Updated", - "RESOLVED": "Resolved", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "We couldn't update Task Title.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "Task Title can't exceed 255 characters.", - - "TASK_IS_ALREADY_EPIC": "Epic Task Type can not be changed.", - "TASK_HAS_PARENT": "Task Type can not be changed as Task has already Parent." - }, - - "auth": { - "SEND_CODE": "send code", - "JOIN": "Join", - "UNRECEIVED_CODE": "Didn't receive code ?", - "JOIN_TEAM": "Join Team", - "INPUT_INVITE_CODE": "Input invitation code.", - "INPUT_INVITE_CODE_DESC": "Enter the invitation code we sent to your email.", - "INVALID_INVITE_CODE_MESSAGE": "Invalid Code", - "WELCOME_TEAMS": "Welcome to Ever Teams", - - "COVER_TITLE": "Open Work and Project Management Platform", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Login", - "SELECT_WORKSPACE": "Select Workspace", - "ENTER_EMAIL": "Enter Email", - "WORKSPACES_NOT_FOUND": "Workspaces Not Found" - }, - "authPasscode": { - "HEADING_TITLE": "Join existing Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to join existing team." - }, - "authLogin": { - "HEADING_TITLE": "Login to the Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to login.", - - "WORKSPACE": "Workspace", - "HEADING_WORKSPACE_LINE1": "The email associated with multiple workspaces,", - "HEADING_WORKSPACE_LINE2": "please select one to continue" - }, - "authTeam": { - "HEADING_TITLE": "Create New Team", - "HEADING_DESCRIPTION": "Please enter your team details to create a new team.", - "LOADING_TEXT": "We are now creating your new workplace, hold on...", - "VERIFY_EMAIL_LOADING_TEXT": "We are verifying your email, hold on...", - "INPUT_TEAM_NAME": "Input your team name", - "JOIN_EXISTING_TEAM": "Joining existing team?", - "CREATE_FIRST_TEAM": "Create your first team", - "CREATE_TEAM": "Create team" - }, - "settings": { - "BREADCRUMB": [{ "title": "Dashboard", "href": "/" }, "Settings"], - "DANDER_ZONE": "Danger Zone", - "HEADING_DESCRIPTION": "Setting dan manage your personal dashboard here", - "ARE_YOU_SURE_TO_DELETE_USER": "Are you sure you want to delete this user?" - }, - "settingsPersonal": { - "HEADING_TITLE": "General Settings", - "emailNotValid": "Please provide a valid Email", - "phoneNotValid": "Please provide a valid Phone Number", - "WORK_SCHEDULE": "Work Schedule", - "SUBSCRIPTION": "Subscription", - "ABOUT_TO_CHANGE_EMAIL": "You are about to change Email", - "ABOUT_TO_DELETE_ACCOUNT": "You are about to Delete your account ?", - "DATA_SYNCHRONIZATION": "Sincronização de dados", - "ABOUT_TO_REMOVE_ACCOUNT": "You are about to Remove your account ?" - }, - "settingsTeam": { - "HEADING_TITLE": "General Settings", - "MEMBER_HEADING_TITLE": "Members", - "PRIORITIES_HEADING": "Priorities", - "NOTIFICATION_HEADING": "Notifications", - "SIZES_HEADING": "Sizes", - "TEAM_NAME": "Team Name", - "TEAM_TYPE": "Team Type", - "TIME_TRACKING": "Time Tracking", - - "ADD_NEW_MEMBER": "Add new member", - "MANAGE_ASSIGNEES": "Manage Assignees", - "SEARCH_MEMBER": "Search Member", - "TASK_STATUSES": "Task Statuses", - "TASK_PRIORITIES": "Task Priorities", - "TASK_SIZES": "Task Sizes", - "TASK_LABELS": "Task Labels", - "ISSUE_TYPES": "Issue Types", - "RELATED_TYPE": "Related Type", - - "INVITATION_HEADING_TITLE": "Invitations", - "CREATE_NEW_STATUSES": "Create new Statuses", - "CREATE_NEW_STATUS": "Create new Status", - "CREATE_NEW_VERSION": "Create new Version", - "CREATE_NEW_PRIORITIES": "Create new Priorities", - "CREATE_NEW_PRIORITY": "Create new Priority", - "CREATE_NEW_SIZES": "Create new Sizes", - "CREATE_NEW_SIZE": "Create new Size", - "CREATE_NEW_LABELS": "Create new Labels", - "CREATE_NEW_LABEL": "Create new Label", - "CREATE_NEW_ISSUE_TYPES": "Create new Issues", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Hide Personal Members Information", - "POSITION_CUSTOM": "Positions custom", - "INVITATION_EXPIRATION": "Invitation Expiration", - "NOTIFY_IF": "Notify if", - "TEAM_REQUEST": "Team Request", - "WORK_SCHEDULE": "Work schedule", - "MEMBER_AND_ROLES": "Members & Roles", - "INTEGRATIONS": "Integrations", - "DANDER_ZONES": "Danger Zone", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Connect with GitHub and start Syncing GitHub issues with your Team", - "SELECT_REPOSITORY": "Select Repository", - - "INSTALL": "Install", - - "LIST_OF_STATUSES": "List of Statuses", - "LIST_OF_PRIORITIES": "List of Priorities", - "LIST_OF_SIZES": "List of Sizes", - "LIST_OF_LABELS": "List of Labels", - "LIST_OF_ISSUES_TYPE": "List of Issues", - - "GENERAL": "General", - "SOUND": "Sound", - "EMAIL": "Email", - "USERS": "Users", - "TASKS": "Tasks", - "SYSTEM": "System", - "SECURITY": "Security", - "INAPP": "In App", - "NOTIFICATION_HEADING_TITLE": "Notification Settings", - "ISSUE_HEADING_TITLE": "Issue Settings", - - "TASK_PRIVACY": "Task Privacy", - "MULTIPLE_ASSIGNEES": "Multiple Assignees", - "MANUAL_TIME": "Manual Time", - "GROUP_ESTIMATION": "Group Estimation", - "ESTIMATION_IN_HOURS": "Estimation in Hours", - "ESTIMATION_IN_STORY_POINTS": "Estimation in Story Points", - "PROOF_OF_COMPLETION": "Proof of Completion", - "LINKED_ISSUES": "Linked Issues", - "COMMENTS": "Comments", - "HISTORY": "History", - "ACCEPTANCE_CRITERIA": "Acceptance criteria", - "DRAFT_ISSUES": "Draft Issues", - "AUTO_CLOSE_ISSUE": "Auto-close issue", - "AUTO_ARCHIVE_ISSUE": "Auto-archive issue", - "AUTO_STATUS": "Auto-Status", - "VERSIONS": "Versions", - "LIST_OF_VERSONS": "List of Versions", - "ISSUETYPE": "Issue Types", - "LIST_OF_ISSUES": "List of Issues", - "RELATED_ISSUE_TYPE": "Related Issue Types", - "LIST_OF_RELATED_TYPE": "List of Related Types", - "INITIAL": "Initial", - "COPY_NUMBER": "Copy Number", - "IN_PROGRESS": "In Progress", - "FINAL": "Final", - "DISPOSE_TEAM": "You are about to Dispose team ?", - "QUIT_TEAM": "You are about to Quit team ?", - "TEAM_COLOR": "Team Color", - "TEAM_SIZE": "Team Size", - "EMOJI": "Emoji", - "ISSUES_HEADING_TITLE": "Issues Settings", - - "TRACK_TIME": "Track Time", - "ESTIMATE_ISSUE": "Estimate issue", - "EPICS_CREATE_CLOSE": "Epics Create/Close", - "ISSUE_CREATE_CLOSE": "Issue Create/Close", - "ISSUE_ASSIGN_UNASSIGN": "Issue Assign/Unassign", - "INVITE_MEMBERS": "Invite members", - "REMOVE_MEMBERS": "Remove members", - "HANDLE_REQUESTS": "Handle requests", - "ROLES_POSITIONS_CHANGE": "Roles/Positions change", - "VIEW_DETAILS": "View Details", - - "NO_INVITATIONS": "There are no Invitations at the moment!", - "NO_MEMBERS": "There are no Members at the moment!" - }, - "invite": { - "HEADING_TITLE": "Invite member to your team", - "HEADING_DESCRIPTION": "Send invitation to a team member by email", - "TEAM_MEMBER_EMAIL": "Team Member's Email", - "TEAM_MEMBER_FULLNAME": "Team Member's Full Name", - "SEND_INVITE": "Send Invitation", - "ERROR_WHILE_ACCEPTING_INVITATION": "Error while accepting invitation", - "ERROR_WHILE_REJECTING_INVITATION": "Error while rejecting invitation", - "INVITE_LABEL_SEND": "Send Invite", - "invitationTable": { - "NAME_AND_EMAIL": "Name & Email", - "POSITION": "Position", - "DATE_AND_TIME_REQUEST": "Date & Time Request", - "CV_OR_ATTACHMENT": "CV / Attachement" - } - }, - "permissions": { - "SELECT_ROLES": "Select Roles" - }, - "unauthorized": { - "TITLE": "Não autorizado", - "HEADING_TITLE": "Você não está autorizado à acessar essa página !", - "HEADING_DESCRIPTION": "Pedimos desculpas pelo transtorno, mas você não está autorizado a acessar esta página. Se você acredita que isso é um erro. Por favor entre." - }, - "page404": { - "HEADING_TITLE": "Not Found", - "HEADING_DESCRIPTION": "Resource you are looking for not found!", - "LINK_LABEL": "Go to homepage" - }, - "offline": { - "HEADING_TITLE": "Rede Desconectada!", - "HEADING_DESCRIPTION": "Você está atualmente offline, por favor, verifique sua conexão com a Internet..." - }, - "error": { - "TITLE": "Erro!", - "HEADING_TITLE": "Algo deu errado!", - "HEADING_DESCRIPTION": "Se o problema persistir, envie um sinal de socorro à nossa equipe de suporte." - }, - "maintenance": { - "HEADING_TITLE": "Estamos em manutenção", - "HEADING_DESCRIPTION": "Estamos atualizando nosso site para melhor atendê-lo. Por favor, volte mais tarde." - } - }, - - "timer": { - "START_TIMER": "Please, select or create a new task to start tracking the time", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Timer Stopped", - "STOPPED_TIMER_TOAST_DESCRIPTION": "Timer Stopped due to Team Switch" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Estimate" - }, - "DAY_LIST": [{ "title": "7 days" }, { "title": "14 days" }], - "TIME_ACTIVITY": "Activity", - "TOTAL_HOURS": "Total Hours", - "NO_SCREENSHOOT": "No Screenshoots", - "PERCENT_OF_MINUTES": " % of 10 Minutes", - "APPS": "Apps", - "VISITED_DATES": "Visited Dates", - "PERCENT_USED": "Percent Used", - "TIME_SPENT_IN_HOURS": "Time spent (Hours)", - "THERE_IS_NO_APPS_VISITED": "There is no Apps Visited.", - "OTHER_DETAILS": "Other details", - "KEYBOARD": "keyboard", - - "MOUSE": "Mouse", - "TIMES": "Times", - "ACTIVE": "Active", - "INACTIVE": "Inactive", - "ARCHIVED": "Archived", - "NOT_ARCHIVED": "Not archived" - }, - - "task": { - "TITLE": "Task", - "ASSIGN_NEW_TASK": "Assign new task", - "ASSIGNED_BY": "Assigned By", - "NO_ONE_FOR_TASK": "No One Assigned to this Task", - "WORKED_TODAY_ON_TASK_TOOLTIP": "trabalhou hoje nesta tarefa por", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "trabalhou nesta tarefa por um total de", - "WORKED_TODAY_ON_ALL_TOOLTIP": "trabalhou hoje em todas", - "TASKS_FOR_TOOLTIP": "tarefas para", - "taskLabel": { - "WORK_LABEL": "Worked", - "TASK_ASSIGNED": "Assigned", - "TASK_UNASSIGNED": "Unassigned", - "BUTTON_LABEL": "Assign Task" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "This tab shows all tasks you started working on", - "ASSIGNED_DESCRIPTION": "This tab shows all tasks that are assigned to you", - "UNASSIGNED_DESCRIPTION": "This tab shows all tasks that are not assigned to you", - "NO_TASK_USER_ASSIGNED": "No one assigned to this Task" - }, - "taskTableHead": { - "TASK_NAME": "Name", - "TASK_STATUS": "Status", - "TASK_WORK": { - "TITLE": "Worked on", - "DESCRIPTION": "Task", - "LABEL": "Worked on task" - }, - "TASK_TIME": "Estimate", - "TOTAL_WORK": { - "TITLE": "Total Worked", - "DESCRIPTION": "Today", - "LABEL": "Total worked Today" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Quantas horas o funcionário trabalhou no total e hoje na tarefa", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Quantas horas o funcionário trabalhou hoje em todas as tarefas para a equipe selecionada" - }, - "CONFIRM_CLOSE_TASK": "Please confirm if you want to close the task" - }, - - "form": { - "NAME_PLACEHOLDER": "Enter your name", - "FIRST_NAME_PLACEHOLDER": "First Name", - "LAST_NAME_PLACEHOLDER": "Last Name", - "EMAIL_PLACEHOLDER": "Enter your email address", - "PHONE_PLACEHOLDER": "Phone Number", - - "ISSUE_NAME_PLACEHOLDER": "Issue name", - - "TEAM_NAME_PLACEHOLDER": "Please Enter your team name", - "TASK_INPUT_PLACEHOLDER": "What you working on?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "Team member name", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "Team member email address", - "COMPLETION_DESCRIPTION": "Write the description", - "UPLOAD_FILES": "Upload Files", - "ATTACHMENT_FILE": "Attachment files", - "ADD_COMMENT": "Add Comment here", - "SET_THEME": "Set Theme", - "CHANGE_AVATAR": "Change Avatar", - "SELECT_TEAM_SIZE": "Select Team Size", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "All rights reserved.", - "COPY_RIGHT1": "© {{date}}-Present,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Terms of Service", - "PRIVACY_POLICY": "Privacy Policy", - "COOKIES": "Cookie Policy", - "BY": "By" - } - }, - - "errors": { - "NETWORK_ISSUE": "network issue, please try again later", - "ERROR_WHILE_VERIFY_CODE": "Error while verifying code.", - "LENGTH_NUMBER_ERROR": "Length should be a number and greater than 0", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric", - "VALID_EMAIL": "Please enter valid email" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Press Enter to validate" - }, - "team": { - "BACK_LABEL": "Back to Team", - "PUBLIC_TEAM": "Public Team", - "PRIVATE_TEAM": "Private Team", - "creation": { - "NEW": "Create new team" - } - }, - "links": { - "common": { - "TASKS": "Tasks", - "TEAM": "Team", - "SETTINGS": "Settings" - } - } -} diff --git a/apps/web/public/locales/ru/common.json b/apps/web/public/locales/ru/common.json deleted file mode 100644 index 5625e3f3c..000000000 --- a/apps/web/public/locales/ru/common.json +++ /dev/null @@ -1,583 +0,0 @@ -{ - "TITLE": "Ever Teams", - "common": { - "ACCEPT": "Accept", - "ACCEPTED": "Accepted", - "REJECT": "Reject", - "REJECTED": "Rejected", - "VERIFY": "verify", - "INVITE": "Invite", - "INVITED": "Invited", - "EXPIRE": "Expire", - "EXPIRED": "Expired", - "REQUEST": "Request", - "REQUESTED": "Requested", - "LABEL": "Label", - "LABELS": "Labels", - "POSITION": "Position", - "ROLES": "Roles", - "JOIN_OR_LEFT": "Joined / Left", - "PLEASE": "please", - "HERE": "here", - "PEOPLE": "People", - "COLLABORATE": "Collaborate", - "NO": "No", - "ONLY_ME": "Only me", - "YES": "Yes", - "BASIC": "Basic", - "DELETE": "Delete", - "MEET": "Meet", - "BOARD": "Board", - "SECURITY_CODE": "Security Code", - "CONFIRM": "Confirm", - "YOUR_EMAIL": "your email", - "CONTINUE": "Continue", - "EDIT_TASK": "Edit Task", - "ASSIGN_TASK": "Assign Task", - "ASSIGN_TASK_TO": "Assign Task", - "REMOVE_ACCOUNT": "Remove Account", - "REMOVE_EVERYWHERE": "Remove Everywhere", - "DELETE_ACCOUNT": "Delete This Account", - "UNASSIGN_TASK": "Unassign Task", - "MAKE_A_MANAGER": "Make a Manager", - "UNMAKE_A_MANAGER": "Unmake a Manager", - "TRANSFERT_OWNERSHIP": "Transfer Ownership", - "TRANSFERT_OWNERSHIP_TO": "Transfer full ownership of team to another user", - "REMOVE": "Remove", - "REMOVE_TEAM": "Remove Team", - "DISPOSE_TEAM": "Dispose Team", - "QUIT_TEAM": "Quit the Team", - "QUIT": "Quit", - "STATUSES": "Statuses", - "RESEND_INVITATION": "Resend Invitation", - "TODAY": "Today", - "TOTAL": "Total", - "ESTIMATED": "Estimated", - "ESTIMATE": "Estimate", - "STATUS": "Status", - "NAME": "Name", - "TASK": "Task", - "MY_TASKS": "My Tasks", - "WORKED_ON_TASK": "Worked on Task", - "TOTAL_WORKED_TODAY": "Total worked Today", - "TOTAL_WORK": "Today work", - "OPEN": "Open", - "NOW": "Now", - "NEXT": "Next", - "PREV": "Previous", - "DETAILS": "Details", - "CLOSED": "Closed", - "CLOSE": "Close", - "USER_NOT_FOUND": "No users found.", - "TASK_TITTLE": "Task Title", - "PUBLIC_TASK": "This task is Public", - "PRIVATE_TASK": "This task is Private", - "PUBLIC_TASK_LABEL": "Make a public", - "PRIVATE_TASK_LABEL": "Make a private", - "CREATE_TASK": "Create New Task", - "LINK_TASK": "Select Related Issue", - "LINK": "Link", - "LINKS": "Links", - "SHOW": "Show", - "ADD_LINK": "Add Links", - "COMMENT": "Comment", - "DESCRIPTION": "Description", - "CHILD_ISSUE_TASK": "Select Child Issue", - "CREATE_TEAM": "Create New Team", - "VERIFY_ACCOUNT_MSG": "Please Verify your account before start using the app", - "CREATE_ROLE": "Create Role", - "CREATE": "Create", - "CREATE_ISSUE": "Create issue", - "NEW_ISSUE": "New Issue", - "ACTIVATED": "Activated", - "DEACTIVATED": "Activated", - "PERIOD": "Period", - "NEW": "New", - "CREATE_VERSION": "Create Version", - "VERSION": "Version", - "LOADING": "Loading", - "TOTAL_TIME": "Total time", - "LAST_24_HOURS": "Last 24 Hours", - "WORKED": "Worked", - "ASSIGNED": "Assigned", - "SELECT_STATUS": "Select status", - "SELECT_ISSUE": "Select Issue", - "UNASSIGNED": "Unassigned", - "TASK_DETAILS": "Task Details", - "TYPE_SOMETHING": "Type something", - "FILTER": "Filter", - "APPLY": "Apply", - "RESET": "Reset", - "LOGOUT": "Log Out", - "THEMES": "Themes", - "3D_MODE": "3D Mode", - "DARK_MODE": "Dark Mode", - "SETTINGS": "Settings", - "PERSONAL": "Personal", - "USE_SETTING": "Use setting", - "TEAM": "Team", - "MY_TEAM": "My Team", - "FULL_NAME": "Full Name", - "USER_AVATAR": "User Avatar", - "CONTACT": "Contact", - "ENABLED": "Давать возможность", - "DISABLED": "Запрещать", - - "THEME": "Theme", - "TIME_ZONE": "Timezone", - "EDIT": "Edit", - "SAVE": "Save", - "LANGUAGE": "Language", - "DETECT": "Detect", - "TRANSFER": "Transfer", - "TRANSFER_TEAM": "Transfer Team", - "TEAM_MEMBERS": "Team Members", - "NO_TEAM": "Create your own team or join existed", - "NO_TEAM_SUB": "Замечательно работать с другими, поэтому создайте команду и пригласите всех к сотрудничеству!", - "NO_TEAM_TOOLTIP": "Вы должны подтвердить свой адрес электронной почты", - "CANCEL": "Cancel", - "DISCARD": "Discard", - "EXISTING_MEMBER": "Already a Member", - "NEW_MEMBER": "Become a Member", - "BACK": "Back", - "DONT_HAVE_ACCOUNT": "Don't have an account?", - "JOIN_REQUEST": "Request To Join", - "PERMISSION": "Permission", - "SEARCH": "Search", - "ADD_PARENT": "Add Parent", - "BLOCKS": "Blocks", - "CLONES": "Clones", - "DUPLICATES": "Duplicates", - "IS_BLOCKED_BY": "Is Blocked By", - "IS_CLONED_BY": "Is Cloned By", - "IS_DUPLICATED_BY": "Is Duplicated By", - "RELATES_TO": "Relates To", - "CHANGE_PARENT": "Change Parent", - "RELATED_ISSUES": "Related Issues", - "CHILD_ISSUES": "Child Issues", - "REOPEN": "Reopen", - "NO_TASKS": "No Tasks", - "FULL_WIDTH": "Полная ширинаh", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "Please stop the Timer before changing the Task", - - "COLLABORATE_DIALOG_TITLE": "Start Collaboration", - "COLLABORATE_DIALOG_SUB_TITLE": "Invite member(s) and start collaborating", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "Start Meeting or Board Collaboration", - "ISSUE_TYPE": "Issue Type", - "ACTIVITY": "Activity", - "FILTER_ALL": "All", - "FILTER_COMMENTS": "Comments", - "FILTER_HISTORY": "History", - "FILTER_UNSUBSCRIBE": "Unsubscribe", - - "KEYBOARD_SHORTCUTS": "Keyboard Shortcuts", - - "GITHUB_LOADING_TEXT": "Мы сейчас устанавливаем вашу интеграцию GitHub, подождите...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "Автоматическая синхронизация задач в вашем приложении для бесперебойных и эффективных обновлений.", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "Синхронизация задач выборочно путем ассоциирования их с конкретной меткой.", - "GITHUB_AUTO_SYNC_LABEL": "Выберите метку автосинхронизации" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "В настоящее время мы работаем над синхронизацией в реальном времени, пожалуйста, проверьте эту функцию позже.", - "ALERT_DELETE_ACCOUNT": "You will be removed from all teams, except where you are the only manager in the team", - "ALERT_ACCOUNT_PERMANENT_DELETE": "Your Account will be deleted permanently with removing from all teams", - "ALERT_REMOVE_TEAM": "Team will be completely removed for the system and team members lost access", - "ALERT_REMOVE_ALL_DATA": "Все данные учетной записи будут удалены из всех команд, в которых вы являетесь только одним существующим менеджером", - "ALERT_QUIT_TEAM": "You are about to quit the team" - }, - "pages": { - "home": { - "BREADCRUMB": ["Dashboard"], - "SENT_EMAIL_VERIFICATION": "Code Verification has been sent to your email", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "You need to ", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " your email address. The verification code should already be send to your email, but feel free to click ", - "SENT_EMAIL_VERIFICATION_RESEND": " to resend the code, if you did not received it.", - "INVITATIONS": "You've been invited to join", - "CONFIRM_ACCEPT_INVITATION": "Are you sure you want to accept the invitation?", - "CONFIRM_REJECT_INVITATION": "Are you sure you want to reject the invitation?" - }, - - "profile": { - "BREADCRUMB": ["Member Tasks"] - }, - - "taskDetails": { - "BREADCRUMB": ["Task Details"], - "DESCRIPTION": "Descriptions", - "ADD_DESCRIPTION": "Add Description here", - "TYPE_OF_ISSUE": "Type of Issue", - "CREATOR": "Creator", - "ASSIGNEES": "Assignees", - "START_DATE": "Start Date", - "DUE_DATE": "Due Date", - "DAYS_REMAINING": "Days Remaining", - "VERSION": "Version", - "EPIC": "Epic", - "STATUS": "Status", - "LABEL": "Label", - "LABELS": "Labels", - "SIZE": "Size", - "PRIORITY": "Priority", - "ESTIMATIONS": "Estimations", - "PROGRESS": "Progress", - "TOTAL_TIME": "Total Time", - "TIME_TODAY": "Time Today", - "TOTAL_GROUP_TIME": "Total Group Time", - "TIME_REMAINING": "Time Remaining", - "CREATED": "Created", - "UPDATED": "Updated", - "RESOLVED": "Resolved", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "We couldn't update Task Title.", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "Task Title can't exceed 255 characters.", - - "TASK_IS_ALREADY_EPIC": "Epic Task Type can not be changed.", - "TASK_HAS_PARENT": "Task Type can not be changed as Task has already Parent." - }, - - "auth": { - "SEND_CODE": "send code", - "JOIN": "Join", - "UNRECEIVED_CODE": "Didn't receive code ?", - "JOIN_TEAM": "Join Team", - "INPUT_INVITE_CODE": "Input invitation code.", - "INPUT_INVITE_CODE_DESC": "Enter the invitation code we sent to your email.", - "INVALID_INVITE_CODE_MESSAGE": "Invalid Code", - "WELCOME_TEAMS": "Welcome to Ever Teams", - - "COVER_TITLE": "Open Work and Project Management Platform", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "Login", - "SELECT_WORKSPACE": "Select Workspace", - "ENTER_EMAIL": "Enter Email", - "WORKSPACES_NOT_FOUND": "Workspaces Not Found" - }, - "authPasscode": { - "HEADING_TITLE": "Join existing Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to join existing team." - }, - "authLogin": { - "HEADING_TITLE": "Login to the Team", - "HEADING_DESCRIPTION": "Please enter email and invitation code to login.", - - "WORKSPACE": "Workspace", - "HEADING_WORKSPACE_LINE1": "The email associated with multiple workspaces,", - "HEADING_WORKSPACE_LINE2": "please select one to continue" - }, - "authTeam": { - "HEADING_TITLE": "Create New Team", - "HEADING_DESCRIPTION": "Please enter your team details to create a new team.", - "LOADING_TEXT": "We are now creating your new workplace, hold on...", - "VERIFY_EMAIL_LOADING_TEXT": "We are verifying your email, hold on...", - "INPUT_TEAM_NAME": "Input your team name", - "JOIN_EXISTING_TEAM": "Joining existing team?", - "CREATE_FIRST_TEAM": "Create your first team", - "CREATE_TEAM": "Create team" - }, - "settings": { - "BREADCRUMB": [{ "title": "Dashboard", "href": "/" }, "Settings"], - "DANDER_ZONE": "Danger Zone", - "HEADING_DESCRIPTION": "Setting dan manage your personal dashboard here", - "ARE_YOU_SURE_TO_DELETE_USER": "Are you sure you want to delete this user?" - }, - "settingsPersonal": { - "HEADING_TITLE": "General Settings", - "emailNotValid": "Please provide a valid Email", - "phoneNotValid": "Please provide a valid Phone Number", - "WORK_SCHEDULE": "Work Schedule", - "SUBSCRIPTION": "Subscription", - "ABOUT_TO_CHANGE_EMAIL": "You are about to change Email", - "ABOUT_TO_DELETE_ACCOUNT": "You are about to Delete your account ?", - "DATA_SYNCHRONIZATION": "Синхронизация данных", - "ABOUT_TO_REMOVE_ACCOUNT": "You are about to Remove your account ?" - }, - "settingsTeam": { - "HEADING_TITLE": "General Settings", - "MEMBER_HEADING_TITLE": "Members", - "PRIORITIES_HEADING": "Priorities", - "NOTIFICATION_HEADING": "Notifications", - "SIZES_HEADING": "Sizes", - "TEAM_NAME": "Team Name", - "TEAM_TYPE": "Team Type", - "TIME_TRACKING": "Time Tracking", - - "ADD_NEW_MEMBER": "Add new member", - "MANAGE_ASSIGNEES": "Manage Assignees", - "SEARCH_MEMBER": "Search Member", - "TASK_STATUSES": "Task Statuses", - "TASK_PRIORITIES": "Task Priorities", - "TASK_SIZES": "Task Sizes", - "TASK_LABELS": "Task Labels", - "ISSUE_TYPES": "Issue Types", - "RELATED_TYPE": "Related Type", - - "INVITATION_HEADING_TITLE": "Invitations", - "CREATE_NEW_STATUSES": "Create new Statuses", - "CREATE_NEW_STATUS": "Create new Status", - "CREATE_NEW_VERSION": "Create new Version", - "CREATE_NEW_PRIORITIES": "Create new Priorities", - "CREATE_NEW_PRIORITY": "Create new Priority", - "CREATE_NEW_SIZES": "Create new Sizes", - "CREATE_NEW_SIZE": "Create new Size", - "CREATE_NEW_LABELS": "Create new Labels", - "CREATE_NEW_LABEL": "Create new Label", - "CREATE_NEW_ISSUE_TYPES": "Create new Issues", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "Hide Personal Members Information", - "POSITION_CUSTOM": "Positions custom", - "INVITATION_EXPIRATION": "Invitation Expiration", - "NOTIFY_IF": "Notify if", - "TEAM_REQUEST": "Team Request", - "WORK_SCHEDULE": "Work schedule", - "MEMBER_AND_ROLES": "Members & Roles", - "INTEGRATIONS": "Integrations", - "DANDER_ZONES": "Danger Zone", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "Connect with GitHub and start Syncing GitHub issues with your Team", - "SELECT_REPOSITORY": "Select Repository", - - "INSTALL": "Install", - - "LIST_OF_STATUSES": "List of Statuses", - "LIST_OF_PRIORITIES": "List of Priorities", - "LIST_OF_SIZES": "List of Sizes", - "LIST_OF_LABELS": "List of Labels", - "LIST_OF_ISSUES_TYPE": "List of Issues", - - "GENERAL": "General", - "SOUND": "Sound", - "EMAIL": "Email", - "USERS": "Users", - "TASKS": "Tasks", - "SYSTEM": "System", - "SECURITY": "Security", - "INAPP": "In App", - "NOTIFICATION_HEADING_TITLE": "Notification Settings", - "ISSUE_HEADING_TITLE": "Issue Settings", - - "TASK_PRIVACY": "Task Privacy", - "MULTIPLE_ASSIGNEES": "Multiple Assignees", - "MANUAL_TIME": "Manual Time", - "GROUP_ESTIMATION": "Group Estimation", - "ESTIMATION_IN_HOURS": "Estimation in Hours", - "ESTIMATION_IN_STORY_POINTS": "Estimation in Story Points", - "PROOF_OF_COMPLETION": "Proof of Completion", - "LINKED_ISSUES": "Linked Issues", - "COMMENTS": "Comments", - "HISTORY": "History", - "ACCEPTANCE_CRITERIA": "Acceptance criteria", - "DRAFT_ISSUES": "Draft Issues", - "AUTO_CLOSE_ISSUE": "Auto-close issue", - "AUTO_ARCHIVE_ISSUE": "Auto-archive issue", - "AUTO_STATUS": "Auto-Status", - "VERSIONS": "Versions", - "LIST_OF_VERSONS": "List of Versions", - "ISSUETYPE": "Issue Types", - "LIST_OF_ISSUES": "List of Issues", - "RELATED_ISSUE_TYPE": "Related Issue Types", - "LIST_OF_RELATED_TYPE": "List of Related Types", - "INITIAL": "Initial", - "COPY_NUMBER": "Copy Number", - "IN_PROGRESS": "In Progress", - "FINAL": "Final", - "DISPOSE_TEAM": "You are about to Dispose team ?", - "QUIT_TEAM": "You are about to Quit team ?", - "TEAM_COLOR": "Team Color", - "TEAM_SIZE": "Team Size", - "EMOJI": "Emoji", - "ISSUES_HEADING_TITLE": "Issues Settings", - - "TRACK_TIME": "Track Time", - "ESTIMATE_ISSUE": "Estimate issue", - "EPICS_CREATE_CLOSE": "Epics Create/Close", - "ISSUE_CREATE_CLOSE": "Issue Create/Close", - "ISSUE_ASSIGN_UNASSIGN": "Issue Assign/Unassign", - "INVITE_MEMBERS": "Invite members", - "REMOVE_MEMBERS": "Remove members", - "HANDLE_REQUESTS": "Handle requests", - "ROLES_POSITIONS_CHANGE": "Roles/Positions change", - "VIEW_DETAILS": "View Details", - - "NO_INVITATIONS": "There are no Invitations at the moment!", - "NO_MEMBERS": "There are no Members at the moment!" - }, - "invite": { - "HEADING_TITLE": "Invite member to your team", - "HEADING_DESCRIPTION": "Send invitation to a team member by email", - "TEAM_MEMBER_EMAIL": "Team Member's Email", - "TEAM_MEMBER_FULLNAME": "Team Member's Full Name", - "SEND_INVITE": "Send Invitation", - "ERROR_WHILE_ACCEPTING_INVITATION": "Error while accepting invitation", - "ERROR_WHILE_REJECTING_INVITATION": "Error while rejecting invitation", - "INVITE_LABEL_SEND": "Send Invite", - "invitationTable": { - "NAME_AND_EMAIL": "Name & Email", - "POSITION": "Position", - "DATE_AND_TIME_REQUEST": "Date & Time Request", - "CV_OR_ATTACHMENT": "CV / Attachement" - } - }, - "permissions": { - "SELECT_ROLES": "Select Roles" - }, - "unauthorized": { - "TITLE": "Несанкционированный", - "HEADING_TITLE": "Вы не авторизованы для просмотра этой страницы !", - "HEADING_DESCRIPTION": "Приносим извинения за неудобства, но у вас нет прав доступа к этой странице. Если вы считаете, что это ошибка. Пожалуйста, войдите." - }, - "page404": { - "HEADING_TITLE": "Not Found", - "HEADING_DESCRIPTION": "Resource you are looking for not found!", - "LINK_LABEL": "Go to homepage" - }, - "offline": { - "HEADING_TITLE": "Сеть отключена!", - "HEADING_DESCRIPTION": "В настоящее время вы не подключены к Интернету, проверьте ваше соединение..." - }, - "error": { - "TITLE": "Ошибка !", - "HEADING_TITLE": "Что-то пошло не так !", - "HEADING_DESCRIPTION": "Если проблема не устранена, отправьте сигнал бедствия в нашу службу поддержки." - }, - "maintenance": { - "HEADING_TITLE": "Мы на обслуживании ", - "HEADING_DESCRIPTION": "В настоящее время мы обновляем наш веб-сайт, чтобы лучше обслуживать вас. Пожалуйста, зайдите позже." - } - }, - - "timer": { - "START_TIMER": "Please, select or create a new task to start tracking the time", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "Timer Stopped", - "STOPPED_TIMER_TOAST_DESCRIPTION": "Timer Stopped due to Team Switch" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "Estimate" - }, - "DAY_LIST": [{ "title": "7 days" }, { "title": "14 days" }], - "TIME_ACTIVITY": "Activity", - "TOTAL_HOURS": "Total Hours", - "NO_SCREENSHOOT": "No Screenshoots", - "PERCENT_OF_MINUTES": " % of 10 Minutes", - "APPS": "Apps", - "VISITED_DATES": "Visited Dates", - "PERCENT_USED": "Percent Used", - "TIME_SPENT_IN_HOURS": "Time spent (Hours)", - "THERE_IS_NO_APPS_VISITED": "There is no Apps Visited.", - "OTHER_DETAILS": "Other details", - "KEYBOARD": "keyboard", - - "MOUSE": "Mouse", - "TIMES": "Times", - "ACTIVE": "Active", - "INACTIVE": "Inactive", - "ARCHIVED": "Archived", - "NOT_ARCHIVED": "Not archived" - }, - - "task": { - "TITLE": "Task", - "ASSIGN_NEW_TASK": "Assign new task", - "ASSIGNED_BY": "Assigned By", - "NO_ONE_FOR_TASK": "No One Assigned to this Task", - "WORKED_TODAY_ON_TASK_TOOLTIP": "сегодня поработал по этой задаче", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "поработал на этой задаче в общей сложности", - "WORKED_TODAY_ON_ALL_TOOLTIP": "сегодня поработал над всеми", - "TASKS_FOR_TOOLTIP": "задачами для", - "taskLabel": { - "WORK_LABEL": "Worked", - "TASK_ASSIGNED": "Assigned", - "TASK_UNASSIGNED": "Unassigned", - "BUTTON_LABEL": "Assign Task" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "This tab shows all tasks you started working on", - "ASSIGNED_DESCRIPTION": "This tab shows all tasks that are assigned to you", - "UNASSIGNED_DESCRIPTION": "This tab shows all tasks that are not assigned to you", - "NO_TASK_USER_ASSIGNED": "No one assigned to this Task" - }, - "taskTableHead": { - "TASK_NAME": "Name", - "TASK_STATUS": "Status", - "TASK_WORK": { - "TITLE": "Worked on", - "DESCRIPTION": "Task", - "LABEL": "Worked on task" - }, - "TASK_TIME": "Estimate", - "TOTAL_WORK": { - "TITLE": "Total Worked", - "DESCRIPTION": "Today", - "LABEL": "Total worked Today" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "Сколько часов сотрудник поработал всего и сегодня по задаче", - "WORKED_ON_TASK_HEADER_TOOLTIP": "Сколько часов сотрудник поработал сегодня по всем задачам для выбранной команды" - }, - "CONFIRM_CLOSE_TASK": "Please confirm if you want to close the task" - }, - - "form": { - "NAME_PLACEHOLDER": "Enter your name", - "FIRST_NAME_PLACEHOLDER": "First Name", - "LAST_NAME_PLACEHOLDER": "Last Name", - "EMAIL_PLACEHOLDER": "Enter your email address", - "PHONE_PLACEHOLDER": "Phone Number", - - "ISSUE_NAME_PLACEHOLDER": "Issue name", - - "TEAM_NAME_PLACEHOLDER": "Please Enter your team name", - "TASK_INPUT_PLACEHOLDER": "What you working on?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "Team member name", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "Team member email address", - "COMPLETION_DESCRIPTION": "Write the description", - "UPLOAD_FILES": "Upload Files", - "ATTACHMENT_FILE": "Attachment files", - "ADD_COMMENT": "Add Comment here", - "SET_THEME": "Set Theme", - "CHANGE_AVATAR": "Change Avatar", - "SELECT_TEAM_SIZE": "Select Team Size", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "All rights reserved.", - "COPY_RIGHT1": "© {{date}}-Present,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "Ever Co.", - "COMPANY_NAME": "Ever Co. LTD.", - "TERMS": "Terms of Service", - "PRIVACY_POLICY": "Privacy Policy", - "COOKIES": "Cookie Policy", - "BY": "By" - } - }, - - "errors": { - "NETWORK_ISSUE": "network issue, please try again later", - "ERROR_WHILE_VERIFY_CODE": "Error while verifying code.", - "LENGTH_NUMBER_ERROR": "Length should be a number and greater than 0", - "INVALID_ALLOWED_CHARACTER": "Invalid value for allowedCharacters. Use alpha, numeric, or alphanumeric", - "VALID_EMAIL": "Please enter valid email" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "Press Enter to validate" - }, - "team": { - "BACK_LABEL": "Back to Team", - "PUBLIC_TEAM": "Public Team", - "PRIVATE_TEAM": "Private Team", - "creation": { - "NEW": "Create new team" - } - }, - "links": { - "common": { - "TASKS": "Tasks", - "TEAM": "Team", - "SETTINGS": "Settings" - } - } -} diff --git a/apps/web/public/locales/zh/common.json b/apps/web/public/locales/zh/common.json deleted file mode 100644 index 6d49063ce..000000000 --- a/apps/web/public/locales/zh/common.json +++ /dev/null @@ -1,541 +0,0 @@ -{ - "TITLE": "永恒团队", - "common": { - "ACCEPT": "接受", - "ACCEPTED": "已接受", - "REJECT": "拒绝", - "REJECTED": "已拒绝", - "VERIFY": "验证", - "INVITE": "邀请", - "INVITED": "已邀请", - "EXPIRE": "到期", - "EXPIRED": "已过期", - "REQUEST": "请求", - "REQUESTED": "已请求", - "LABEL": "标签", - "LABELS": "标签", - "POSITION": "职位", - "ROLES": "角色", - "JOIN_OR_LEFT": "加入/离开", - "PLEASE": "请", - "HERE": "这里", - "PEOPLE": "成员", - "COLLABORATE": "协作", - "NO": "否", - "ONLY_ME": "仅我", - "YES": "是", - "BASIC": "基本", - "DELETE": "删除", - "MEET": "会议", - "BOARD": "看板", - "SECURITY_CODE": "安全码", - "CONFIRM": "确认", - "YOUR_EMAIL": "您的电子邮件", - "CONTINUE": "继续", - "EDIT_TASK": "编辑任务", - "ASSIGN_TASK": "分配任务", - "ASSIGN_TASK_TO": "分配任务给", - "REMOVE_ACCOUNT": "移除账户", - "REMOVE_EVERYWHERE": "完全移除", - "DELETE_ACCOUNT": "删除此账户", - "UNASSIGN_TASK": "取消分配任务", - "MAKE_A_MANAGER": "设为管理员", - "UNMAKE_A_MANAGER": "取消管理员", - "TRANSFERT_OWNERSHIP": "转让所有权", - "TRANSFERT_OWNERSHIP_TO": "将团队全部所有权转让给另一个用户", - "REMOVE": "移除", - "REMOVE_TEAM": "移除团队", - "DISPOSE_TEAM": "处理团队", - "QUIT_TEAM": "退出团队", - "QUIT": "退出", - "STATUSES": "状态", - "RESEND_INVITATION": "重新发送邀请", - "TODAY": "今天", - "TOTAL": "总计", - "ESTIMATED": "预计", - "ESTIMATE": "估计", - "STATUS": "状态", - "NAME": "名称", - "TASK": "任务", - "MY_TASKS": "我的任务", - "WORKED_ON_TASK": "处理过的任务", - "TOTAL_WORKED_TODAY": "今天总共处理", - "TOTAL_WORK": "今天工作", - "OPEN": "开放", - "NOW": "现在", - "NEXT": "下一个", - "PREV": "上一个", - "DETAILS": "详情", - "CLOSED": "已关闭", - "CLOSE": "关闭", - "USER_NOT_FOUND": "未找到用户。", - "TASK_TITTLE": "任务标题", - "PUBLIC_TASK": "此任务为公开", - "PRIVATE_TASK": "此任务为私密", - "PUBLIC_TASK_LABEL": "设为公开", - "PRIVATE_TASK_LABEL": "设为私密", - "CREATE_TASK": "创建新任务", - "LINK_TASK": "选择相关议题", - "LINK": "链接", - "LINKS": "链接", - "SHOW": "显示", - "ADD_LINK": "添加链接", - "COMMENT": "评论", - "DESCRIPTION": "描述", - "CHILD_ISSUE_TASK": "选择子议题", - "CREATE_TEAM": "创建新团队", - "VERIFY_ACCOUNT_MSG": "使用应用前请先验证您的账户", - "CREATE_ROLE": "创建角色", - "CREATE": "创建", - "CREATE_ISSUE": "创建议题", - "NEW_ISSUE": "新议题", - "ACTIVATED": "已激活", - "DEACTIVATED": "已停用", - "PERIOD": "周期", - "NEW": "新增", - "CREATE_VERSION": "创建版本", - "VERSION": "版本", - "LOADING": "加载中", - "TOTAL_TIME": "总计时间", - "LAST_24_HOURS": "过去24小时", - "WORKED": "已处理", - "ASSIGNED": "已分配", - "SELECT_STATUS": "选择状态", - "SELECT_ISSUE": "选择议题", - "UNASSIGNED": "未分配", - "TASK_DETAILS": "任务详情", - "TYPE_SOMETHING": "输入些内容", - "FILTER": "筛选", - "APPLY": "应用", - "RESET": "重置", - "LOGOUT": "登出", - "THEMES": "主题", - "3D_MODE": "3D模式", - "DARK_MODE": "夜间模式", - "SETTINGS": "设置", - "PERSONAL": "个人", - "USE_SETTING": "使用设置", - "TEAM": "团队", - "MY_TEAM": "我的团队", - "FULL_NAME": "全名", - "USER_AVATAR": "用户头像", - "CONTACT": "联系", - "ENABLED": "使能夠", - "DISABLED": "停用", - - "THEME": "主题", - "TIME_ZONE": "时区", - "EDIT": "编辑", - "SAVE": "保存", - "LANGUAGE": "语言", - "DETECT": "检测", - "TRANSFER": "转让", - "TRANSFER_TEAM": "转让团队", - "TEAM_MEMBERS": "团队成员", - "NO_TEAM": "创建您自己的团队或加入已有团队", - "NO_TEAM_SUB": "与他人合作是很棒的,所以创建一个团队,邀请每个人一起合作!", - "NO_TEAM_TOOLTIP": "您需要验证您的电子邮件地址", - "CANCEL": "取消", - "DISCARD": "放弃", - "EXISTING_MEMBER": "已是成员", - "NEW_MEMBER": "成为成员", - "BACK": "返回", - "JOIN_REQUEST": "请求加入", - "PERMISSION": "权限", - "SEARCH": "搜索", - "ADD_PARENT": "添加父项", - "BLOCKS": "阻塞", - "CLONES": "克隆", - "DUPLICATES": "重复", - "IS_BLOCKED_BY": "被阻塞", - "IS_CLONED_BY": "被克隆", - "IS_DUPLICATED_BY": "被重复", - "RELATES_TO": "相关", - "CHANGE_PARENT": "更改父项", - "RELATED_ISSUES": "相关议题", - "CHILD_ISSUES": "子议题", - "REOPEN": "重新开启", - "NO_TASKS": "无任务", - "FULL_WIDTH": "全螢幕寬度", - "TASK_INPUT_DISABLED_MESSAGE_WHEN_TIMER_RUNNING": "改变任务前请先停止计时器", - - "COLLABORATE_DIALOG_TITLE": "开始协作", - "COLLABORATE_DIALOG_SUB_TITLE": "邀请成员并开始协作", - "COLLABORATE_DIALOG_FOOTER_MESSAGE": "开始会议或看板协作", - "ISSUE_TYPE": "议题类型", - "ACTIVITY": "活动", - "FILTER_ALL": "全部", - "FILTER_COMMENTS": "评论", - "FILTER_HISTORY": "历史", - "FILTER_UNSUBSCRIBE": "取消订阅", - - "KEYBOARD_SHORTCUTS": "快捷键", - - "GITHUB_LOADING_TEXT": "我们正在安装您的 GitHub 集成,请稍等...", - "GITHUB_INTEGRATION_AUTO_SYNC_TASK_TEXT": "在您的应用程序中自动同步任务,实现无缝和高效的更新。", - "GITHUB_INTEGRATION_LABEL_SYNC_TASK_TEXT": "通过将任务与特定标签关联,有选择地进行同步。", - "GITHUB_AUTO_SYNC_LABEL": "选择自动同步标签" - }, - "alerts": { - "REAL_TIME_ON_WORKING": "我們目前正在開發即時同步功能,請稍後查看此功能。", - "ALERT_DELETE_ACCOUNT": "账户将从所有团队中移除,您作为管理员的团队除外", - "ALERT_ACCOUNT_PERMANENT_DELETE": "您的账户将被永久删除,并从所有团队中移除", - "ALERT_REMOVE_TEAM": "团队将被完全移除出系统,成员也将失去访问权限", - "ALERT_REMOVE_ALL_DATA": "所有账户数据都将从您是唯一存在经理的所有团队中删除", - "ALERT_QUIT_TEAM": "您将要退出团队" - }, - "pages": { - "home": { - "BREADCRUMB": ["仪表板"], - "SENT_EMAIL_VERIFICATION": "验证码已发送至您的电子邮箱", - "SENT_EMAIL_VERIFICATION_YOU_NEED_TO": "您需要", - "SENT_EMAIL_VERIFICATION_YOUR_EMAIL_ADDRESS": " 您的电子邮箱。验证码应已发送至您的邮箱,如未收到可点击", - "SENT_EMAIL_VERIFICATION_RESEND": " 重新发送验证码。", - "INVITATIONS": "您被邀请加入", - "CONFIRM_ACCEPT_INVITATION": "您确定要接受邀请吗?", - "CONFIRM_REJECT_INVITATION": "您确定要拒绝邀请吗?" - }, - - "profile": { - "BREADCRUMB": ["成员任务"] - }, - - "taskDetails": { - "BREADCRUMB": ["任务详情"], - "DESCRIPTION": "描述", - "ADD_DESCRIPTION": "在此添加描述", - "TYPE_OF_ISSUE": "议题类型", - "CREATOR": "创建人", - "ASSIGNEES": "受分配者", - "START_DATE": "开始日期", - "DUE_DATE": "到期日期", - "DAYS_REMAINING": "剩余天数", - "VERSION": "版本", - "EPIC": "史诗", - "STATUS": "状态", - "LABEL": "标签", - "LABELS": "标签", - "SIZE": "大小", - "PRIORITY": "优先级", - "ESTIMATIONS": "估计", - "PROGRESS": "进度", - "TOTAL_TIME": "总计时间", - "TIME_TODAY": "今日时间", - "TOTAL_GROUP_TIME": "小组总计时间", - "TIME_REMAINING": "剩余时间", - "CREATED": "创建时间", - "UPDATED": "更新时间", - "RESOLVED": "解决时间", - - "TASK_TITLE_CHARACTER_LIMIT_ERROR_TITLE": "无法更新任务标题。", - "TASK_TITLE_CHARACTER_LIMIT_ERROR_DESCRIPTION": "任务标题不能超过255个字符。", - - "TASK_IS_ALREADY_EPIC": "史诗类型任务无法更改。", - "TASK_HAS_PARENT": "任务已有父任务,无法更改任务类型。" - }, - - "auth": { - "SEND_CODE": "发送验证码", - "JOIN": "加入", - "UNRECEIVED_CODE": "未收到验证码?", - "JOIN_TEAM": "加入团队", - "INPUT_INVITE_CODE": "输入邀请码。", - "INPUT_INVITE_CODE_DESC": "输入我们发送到您电子邮件的邀请码。", - "INVALID_INVITE_CODE_MESSAGE": "无效的邀请码", - "WELCOME_TEAMS": "欢迎使用永恒团队", - - "COVER_TITLE": "实时跟踪您团队的工作进度!", - "COVER_DESCRIPTION": "All-In-One Work & Workforce Management, Time Management, Time Tracking, Activity Tracking, Productivity Tracking & Metrics, Projects / Tasks & Issues Management, Organizations & Teams, Integrations (GitHub, JIRA, ...) and More!", - "LOGIN": "登录", - "SELECT_WORKSPACE": "选择工作区", - "ENTER_EMAIL": "输入电子邮箱", - "WORKSPACES_NOT_FOUND": "工作区未找到" - }, - "authPasscode": { - "HEADING_TITLE": "加入已有团队", - "HEADING_DESCRIPTION": "请输入电子邮箱和邀请码加入已有团队。" - }, - "authLogin": { - "HEADING_TITLE": "登录团队", - "HEADING_DESCRIPTION": "请输入电子邮箱和邀请码进行登录。", - - "WORKSPACE": "工作区", - "HEADING_WORKSPACE_LINE1": "此电子邮箱关联了多个工作区,", - "HEADING_WORKSPACE_LINE2": "请选择一个以继续" - }, - "authTeam": { - "HEADING_TITLE": "创建新团队", - "HEADING_DESCRIPTION": "请输入团队信息以创建新团队。", - "LOADING_TEXT": "正在为您创建新的工作区,请稍候......", - "VERIFY_EMAIL_LOADING_TEXT": "正在验证您的电子邮箱,请稍候......", - "INPUT_TEAM_NAME": "输入您的团队名称", - "JOIN_EXISTING_TEAM": "加入已有团队?", - "CREATE_FIRST_TEAM": "创建您的第一个团队", - "CREATE_TEAM": "创建团队" - }, - "settings": { - "BREADCRUMB": [{ "title": "仪表板", "href": "/" }, "设置"], - "DANDER_ZONE": "危险区域", - "HEADING_DESCRIPTION": "在此设置和管理您的个人仪表板", - "ARE_YOU_SURE_TO_DELETE_USER": "您确定要删除此用户吗?" - }, - "settingsPersonal": { - "HEADING_TITLE": "常规设置", - "emailNotValid": "请输入有效的电子邮箱", - "phoneNotValid": "请输入有效的手机号码", - "WORK_SCHEDULE": "工作时间表", - "SUBSCRIPTION": "订阅", - "TIMEZONE_SEARCH_PLACEHOLDER": "您的时区", - "ABOUT_TO_CHANGE_EMAIL": "您即将更改电子邮箱", - "ABOUT_TO_DELETE_ACCOUNT": "您即将删除账户?", - "DATA_SYNCHRONIZATION": "資料同步", - "ABOUT_TO_REMOVE_ACCOUNT": "您即将移除账户?" - }, - "settingsTeam": { - "HEADING_TITLE": "常规设置", - "MEMBER_HEADING_TITLE": "成员", - "PRIORITIES_HEADING": "优先级", - "NOTIFICATION_HEADING": "通知", - "SIZES_HEADING": "大小", - "TEAM_NAME": "团队名称", - "TEAM_TYPE": "团队类型", - "TIME_TRACKING": "时间跟踪", - - "ADD_NEW_MEMBER": "添加新成员", - "MANAGE_ASSIGNEES": "管理受分配者", - "SEARCH_MEMBER": "搜索成员", - "TASK_STATUSES": "任务状态", - "TASK_PRIORITIES": "任务优先级", - "TASK_SIZES": "任务大小", - "TASK_LABELS": "任务标签", - "ISSUE_TYPES": "议题类型", - "RELATED_TYPE": "相关类型", - - "INVITATION_HEADING_TITLE": "邀请", - "CREATE_NEW_STATUSES": "创建新状态", - "CREATE_NEW_STATUS": "创建新状态", - "CREATE_NEW_VERSION": "创建新版本", - "CREATE_NEW_PRIORITIES": "创建新优先级", - "CREATE_NEW_PRIORITY": "创建新优先级", - "CREATE_NEW_SIZES": "创建新大小", - "CREATE_NEW_SIZE": "创建新大小", - "CREATE_NEW_LABELS": "创建新标签", - "CREATE_NEW_LABEL": "创建新标签", - "CREATE_NEW_ISSUE_TYPES": "创建新议题", - - "HIDE_PERSONAL_MEMBERS_INFOTMATION": "隐藏成员个人信息", - "POSITION_CUSTOM": "自定义职位", - "INVITATION_EXPIRATION": "邀请过期", - "NOTIFY_IF": "如果通知", - "TEAM_REQUEST": "团队请求", - "WORK_SCHEDULE": "工作时间表", - "MEMBER_AND_ROLES": "成员与角色", - "INTEGRATIONS": "集成", - "DANDER_ZONES": "危险区域", - - "GITHUB": "GitHub", - "GITHUB_INTEGRATION_DESCRIPTION": "与GitHub集成并开始与团队同步GitHub议题", - "SELECT_REPOSITORY": "选择仓库", - - "INSTALL": "安装", - - "LIST_OF_STATUSES": "状态列表", - "LIST_OF_PRIORITIES": "优先级列表", - "LIST_OF_SIZES": "大小列表", - "LIST_OF_LABELS": "标签列表", - "LIST_OF_ISSUES_TYPE": "议题列表", - - "GENERAL": "常规", - "SOUND": "声音", - "EMAIL": "电子邮箱", - "USERS": "用户", - "TASKS": "任务", - "SYSTEM": "系统", - "SECURITY": "安全", - "INAPP": "应用内", - "NOTIFICATION_HEADING_TITLE": "通知设置", - "ISSUE_HEADING_TITLE": "议题设置", - - "TASK_PRIVACY": "任务隐私", - "MULTIPLE_ASSIGNEES": "多重受分配者", - "MANUAL_TIME": "手动计时", - "GROUP_ESTIMATION": "小组估计", - "ESTIMATION_IN_HOURS": "以小时估", - "ESTIMATION_IN_STORY_POINTS": "以故事点估计", - "PROOF_OF_COMPLETION": "完成证明", - "LINKED_ISSUES": "链接的议题", - "COMMENTS": "评论", - "HISTORY": "历史", - "ACCEPTANCE_CRITERIA": "验收标准", - "DRAFT_ISSUES": "草稿议题", - "AUTO_CLOSE_ISSUE": "自动关闭议题", - "AUTO_ARCHIVE_ISSUE": "自动归档议题", - "AUTO_STATUS": "自动状态", - "VERSIONS": "版本", - "LIST_OF_VERSONS": "版本列表", - "ISSUETYPE": "议题类型", - "LIST_OF_ISSUES": "议题列表", - "RELATED_ISSUE_TYPE": "相关议题类型", - "LIST_OF_RELATED_TYPE": "相关类型列表", - "INITIAL": "初始", - "COPY_NUMBER": "复制数量", - "IN_PROGRESS": "进行中", - "FINAL": "最终", - "DISPOSE_TEAM": "您即将处理团队?", - "QUIT_TEAM": "您即将退出团队?", - "TEAM_COLOR": "团队颜色", - "TEAM_SIZE": "团队大小", - "EMOJI": "表情", - "ISSUES_HEADING_TITLE": "议题设置", - - "TRACK_TIME": "跟踪时间", - "ESTIMATE_ISSUE": "估算议题", - "EPICS_CREATE_CLOSE": "史诗创建/关闭", - "ISSUE_CREATE_CLOSE": "议题创建/关闭", - "ISSUE_ASSIGN_UNASSIGN": "议题分配/取消分配", - "INVITE_MEMBERS": "邀请成员", - "REMOVE_MEMBERS": "移除成员", - "HANDLE_REQUESTS": "处理请求", - "ROLES_POSITIONS_CHANGE": "角色/职位更改", - "VIEW_DETAILS": "查看详情", - - "NO_INVITATIONS": "目前没有邀请!", - "NO_MEMBERS": "目前没有成员!" - }, - "unauthorized": { - "TITLE": "未經授權", - "HEADING_TITLE": "您無權訪問此頁面 !", - "HEADING_DESCRIPTION": "對於造成您的不便,我們深表歉意,但您無權造訪此頁面。 如果您認為這是一個錯誤。 請登入。" - }, - "offline": { - "HEADING_TITLE": "网络断开连接!", - "HEADING_DESCRIPTION": "您目前处于离线状态,请检查您的互联网连接..." - }, - "error": { - "TITLE": "錯誤 !", - "HEADING_TITLE": "出了點問題 !", - "HEADING_DESCRIPTION": "如果問題仍然存在,請向我們的支援團隊發送求救訊號。" - }, - "maintenance": { - "HEADING_TITLE": "我們正在維護中", - "HEADING_DESCRIPTION": "目前,我們正在更新我們的網站,以便更好地為您服務。請稍後再回來查看。" - } - }, - - "timer": { - "START_TIMER": "请选择或创建新任务以开始计时", - "TEAM_SWITCH": { - "STOPPED_TIMER_TOAST_TITLE": "计时器已停止", - "STOPPED_TIMER_TOAST_DESCRIPTION": "由于切换团队,计时器已停止" - }, - "ESTIMATION": { - "ESTIMATE_LABEL": "估计" - }, - "DAY_LIST": [{ "title": "7天" }, { "title": "14天" }] - }, - - "task": { - "TITLE": "任务", - "ASSIGN_NEW_TASK": "分配新任务", - "ASSIGNED_BY": "分配者", - "NO_ONE_FOR_TASK": "此任务未分配", - "WORKED_TODAY_ON_TASK_TOOLTIP": "今天在这个任务上工作了", - "WORKED_TOTAL_ON_TASK_TOOLTIP": "总共在这个任务上工作了", - "WORKED_TODAY_ON_ALL_TOOLTIP": "今天在所有任务上工作了", - "TASKS_FOR_TOOLTIP": "的任务", - "taskLabel": { - "WORK_LABEL": "已处理", - "TASK_ASSIGNED": "已分配", - "TASK_UNASSIGNED": "未分配", - "BUTTON_LABEL": "分配任务" - }, - "tabFilter": { - "WORKED_DESCRIPTION": "此标签显示您开始处理的所有任务", - "ASSIGNED_DESCRIPTION": "此标签显示分配给您的所有任务", - "UNASSIGNED_DESCRIPTION": "此标签显示未分配给您的任务", - "NO_TASK_USER_ASSIGNED": "此任务未分配" - }, - "taskTableHead": { - "TASK_NAME": "名称", - "TASK_STATUS": "状态", - "TASK_WORK": { - "TITLE": "已处理", - "DESCRIPTION": "任务", - "LABEL": "处理过的任务" - }, - "TASK_TIME": "估计", - "TOTAL_WORK": { - "TITLE": "总共处理", - "DESCRIPTION": "今天", - "LABEL": "今天总共处理" - }, - "TOTAL_WORKED_TODAY_HEADER_TOOLTIP": "员工今天和总共在任务上工作了多少小时", - "WORKED_ON_TASK_HEADER_TOOLTIP": "员工今天在所选团队的所有任务上工作了多少小时" - }, - "CONFIRM_CLOSE_TASK": "请确认您是否要关闭此任务" - }, - - "form": { - "NAME_PLACEHOLDER": "输入您的姓名", - "FIRST_NAME_PLACEHOLDER": "名", - "LAST_NAME_PLACEHOLDER": "姓", - "EMAIL_PLACEHOLDER": "输入您的电子邮箱", - "PHONE_PLACEHOLDER": "电话号码", - - "ISSUE_NAME_PLACEHOLDER": "议题名称", - - "TEAM_NAME_PLACEHOLDER": "请输入您的团队名称", - "TASK_INPUT_PLACEHOLDER": "您在做什么?", - - "TEAM_MEMBER_NAME_PLACEHOLDER": "团队成员姓名", - "TEAM_MEMBER_EMAIL_PLACEHOLDER": "团队成员电子邮箱", - "COMPLETION_DESCRIPTION": "编写描述", - "UPLOAD_FILES": "上传文件", - "ATTACHMENT_FILE": "附件文件", - "ADD_COMMENT": "在此添加评论", - "SET_THEME": "设置主题", - "CHANGE_AVATAR": "更改头像", - "SELECT_TEAM_SIZE": "选择团队规模", - "INVALID_ALLOWED_CHARACTER": "allowedCharacters的值无效。请使用字母、数字或字母数字" - }, - - "layout": { - "footer": { - "RIGHTS_RESERVED": "版权所有。", - "COPY_RIGHT1": "© {{date}}-至今,", - "COPY_RIGHT2": "Ever Teams", - "COPY_RIGHT4": "永恒公司", - "COMPANY_NAME": "永恒有限公司", - "TERMS": "服务条款", - "PRIVACY_POLICY": "隐私政策", - "COOKIES": "Cookie政策", - "BY": "by" - } - }, - - "errors": { - "NETWORK_ISSUE": "网络问题,请稍后再试", - "ERROR_WHILE_VERIFY_CODE": "验证码验证时出错。", - "LENGTH_NUMBER_ERROR": "长度应为数字且大于0", - "INVALID_ALLOWED_CHARACTER": "allowedCharacters的值无效。请使用字母、数字或字母数字", - "VALID_EMAIL": "请输入有效的电子邮箱" - }, - "placeholders": { - "ENTER_TO_VALIDATE": "按Enter键验证" - }, - "team": { - "BACK_LABEL": "返回团队", - "PUBLIC_TEAM": "公开团队", - "PRIVATE_TEAM": "私密团队", - "creation": { - "NEW": "创建新团队" - } - }, - "links": { - "common": { - "TASKS": "任务", - "TEAM": "团队", - "SETTINGS": "设置" - } - } -} diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index efaf42bb2..ea316f538 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -1,49 +1,31 @@ { - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "target": "ES2015", - "lib": [ - "dom", - "dom.iterable", - "esnext", - "es2015" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "baseUrl": ".", - "paths": { - "@components/*": [ - "./components/*" - ], - "@app/*": [ - "./app/*" - ] - }, - "incremental": true, - "plugins": [ - { - "name": "next" - } - ] - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - "**/*.js", - "**/*.jsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "ES2015", + "lib": ["dom", "dom.iterable", "esnext", "es2015"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "baseUrl": ".", + "paths": { + "@components/*": ["./components/*"], + "@app/*": ["./app/*"] + }, + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/package.json b/package.json index 650906547..f410d53f0 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,10 @@ "postinstall.electron": "yarn electron-builder install-app-deps && yarn node tools/electron/postinstall", "postinstall.web": "yarn node tools/web/postinstall", "spell": "cspell . --config .cspell.json", - "spellcheck": "cspell ." + "spellcheck": "cspell .", + "dev:server-web": "yarn build:web:desktop && yarn copy:build:web && cd apps/server-web && yarn run start", + "build:web:desktop": "cross-env NEXT_BUILD_OUTPUT_TYPE=standalone NEXT_SHARP_PATH=/temp/node_modules/sharp yarn build:web", + "copy:build:web": "cp -r apps/web/.next/standalone apps/server-web/release/app/dist && cp -r apps/web/.next/static apps/server-web/release/app/dist/standalone/apps/web/.next && cp -r apps/web/public apps/server-web/release/app/dist/standalone/apps/web/" }, "config": { "commitizen": { @@ -122,6 +125,7 @@ "workspaces": { "packages": [ "apps/web", + "apps/server-web", "packages/*", "libs/*", "tools" @@ -196,7 +200,8 @@ "pretty-quick": "^4.0.0", "rimraf": "^5.0.5", "semantic-release": "^22.0.12", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "@types/electron": "^1.6.10" }, "engines": { "node": ">=20.11.0", diff --git a/project.json b/project.json index 47a0c4433..a3cf48cfd 100644 --- a/project.json +++ b/project.json @@ -17,6 +17,9 @@ }, "desktop": { "tags": [] + }, + "server-web": { + "tags": [] } } } diff --git a/yarn.lock b/yarn.lock index bf7d3fd88..328aa8903 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"7zip-bin@~5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" + integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== + "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" @@ -12,6 +17,11 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.2.tgz#a6abc715fb6884851fca9dad37fc34739a04fd11" integrity sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw== +"@adobe/css-tools@^4.3.2": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== + "@aduh95/viz.js@3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@aduh95/viz.js/-/viz.js-3.4.0.tgz#635a020d95386c8acafbe025b2158238de889668" @@ -128,6 +138,19 @@ ora "5.4.1" rxjs "7.8.1" +"@auth/core@0.31.0", "@auth/core@^0.31.0": + version "0.31.0" + resolved "https://registry.yarnpkg.com/@auth/core/-/core-0.31.0.tgz#b2b43a8a1c21dc1065cd15e627a4dc47e3cfcab2" + integrity sha512-UKk3psvA1cRbk4/c9CkpWB8mdWrkKvzw0DmEYRsWolUQytQ2cRqx+hYuV6ZCsngw/xbj9hpmkZmAZEyq2g4fMg== + dependencies: + "@panva/hkdf" "^1.1.1" + "@types/cookie" "0.6.0" + cookie "0.6.0" + jose "^5.1.3" + oauth4webapi "^2.4.0" + preact "10.11.3" + preact-render-to-string "5.2.3" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" @@ -1184,6 +1207,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.20.7": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.6.tgz#5b76eb89ad45e2e4a0a8db54c456251469a3358e" + integrity sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.22.5", "@babel/runtime@^7.9.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" @@ -2038,6 +2068,106 @@ debug "^3.1.0" lodash.once "^4.1.1" +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@electron/asar@^3.2.1": + version "3.2.10" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.10.tgz#615cf346b734b23cafa4e0603551010bd0e50aa8" + integrity sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw== + dependencies: + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + +"@electron/get@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" + integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^11.8.5" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + +"@electron/notarize@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.2.1.tgz#d0aa6bc43cba830c41bfd840b85dbe0e273f59fe" + integrity sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + promise-retry "^2.0.1" + +"@electron/notarize@^2.1.0": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.3.2.tgz#20a52a961747be8542a35003380988a0d3fe15e6" + integrity sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + promise-retry "^2.0.1" + +"@electron/osx-sign@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" + integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== + dependencies: + compare-version "^0.1.2" + debug "^4.3.4" + fs-extra "^10.0.0" + isbinaryfile "^4.0.8" + minimist "^1.2.6" + plist "^3.0.5" + +"@electron/rebuild@^3.3.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.6.0.tgz#60211375a5f8541a71eb07dd2f97354ad0b2b96f" + integrity sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw== + dependencies: + "@malept/cross-spawn-promise" "^2.0.0" + chalk "^4.0.0" + debug "^4.1.1" + detect-libc "^2.0.1" + fs-extra "^10.0.0" + got "^11.7.0" + node-abi "^3.45.0" + node-api-version "^0.2.0" + node-gyp "^9.0.0" + ora "^5.1.0" + read-binary-file-arch "^1.0.6" + semver "^7.3.5" + tar "^6.0.5" + yargs "^17.0.1" + +"@electron/universal@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.5.1.tgz#f338bc5bcefef88573cf0ab1d5920fac10d06ee5" + integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== + dependencies: + "@electron/asar" "^3.2.1" + "@malept/cross-spawn-promise" "^1.1.0" + debug "^4.3.1" + dir-compare "^3.0.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + "@emoji-mart/data@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@emoji-mart/data/-/data-1.1.2.tgz#777c976f8f143df47cbb23a7077c9ca9fe5fc513" @@ -2048,7 +2178,7 @@ resolved "https://registry.yarnpkg.com/@emoji-mart/react/-/react-1.1.1.tgz#ddad52f93a25baf31c5383c3e7e4c6e05554312a" integrity sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== @@ -2060,6 +2190,11 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== +"@eslint-community/regexpp@^4.5.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + "@eslint/eslintrc@^2.1.1", "@eslint/eslintrc@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" @@ -2442,7 +2577,7 @@ dependencies: tslib "^2.4.0" -"@gar/promisify@^1.0.1": +"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== @@ -2647,6 +2782,52 @@ jest-util "^29.6.3" slash "^3.0.0" +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + "@jest/environment@^29.6.4": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.4.tgz#78ec2c9f8c8829a37616934ff4fea0c028c79f4f" @@ -2657,6 +2838,16 @@ "@types/node" "*" jest-mock "^29.6.3" +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + "@jest/expect-utils@^29.6.4": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.4.tgz#17c7dfe6cec106441f218b0aff4b295f98346679" @@ -2664,6 +2855,13 @@ dependencies: jest-get-type "^29.6.3" +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + "@jest/expect@^29.6.4": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.4.tgz#1d6ae17dc68d906776198389427ab7ce6179dba6" @@ -2672,6 +2870,14 @@ expect "^29.6.4" jest-snapshot "^29.6.4" +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + "@jest/fake-timers@^29.6.4": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.4.tgz#45a27f093c43d5d989362a3e7a8c70c83188b4f6" @@ -2684,6 +2890,18 @@ jest-mock "^29.6.3" jest-util "^29.6.3" +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + "@jest/globals@^29.6.4": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.4.tgz#4f04f58731b062b44ef23036b79bdb31f40c7f63" @@ -2694,6 +2912,16 @@ "@jest/types" "^29.6.3" jest-mock "^29.6.3" +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + "@jest/reporters@^29.4.1": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.4.tgz#9d6350c8a2761ece91f7946e97ab0dabc06deab7" @@ -2724,6 +2952,36 @@ strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + "@jest/schemas@^29.4.3", "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -2750,6 +3008,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^29.6.4": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz#86aef66aaa22b181307ed06c26c82802fb836d7b" @@ -2760,6 +3028,16 @@ jest-haste-map "^29.6.4" slash "^3.0.0" +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + "@jest/transform@^29.6.4": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.4.tgz#a6bc799ef597c5d85b2e65a11fd96b6b239bab5a" @@ -2781,6 +3059,27 @@ slash "^3.0.0" write-file-atomic "^4.0.2" +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -2860,6 +3159,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.20": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@juggle/resize-observer@^3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" @@ -3197,6 +3504,35 @@ dependencies: "@lexical/offset" "0.8.1" +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@mdn/browser-compat-data@^5.2.34", "@mdn/browser-compat-data@^5.3.13": + version "5.5.31" + resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.5.31.tgz#dcc829bf4a348cf532d8a8ee298e41c38ebc3368" + integrity sha512-k2cK7WJKjWkcU3TY7yIc1dK6RZY8nqm+wNiR9uX9+Qcy5Gy9XzWoWNm+sQ/78OtBi6aTTXrK3HEopidhXasD+w== + "@messageformat/core@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@messageformat/core/-/core-3.2.0.tgz#fcb1e530f4ae4ed61c9c7a0b49cc119a79468da1" @@ -3243,10 +3579,10 @@ jsonc-parser "3.2.0" pluralize "8.0.0" -"@next/env@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.4.tgz#d5cda0c4a862d70ae760e58c0cd96a8899a2e49a" - integrity sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ== +"@next/env@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" + integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== "@next/eslint-plugin-next@14.0.4": version "14.0.4" @@ -3262,50 +3598,50 @@ dependencies: glob "7.1.7" -"@next/swc-darwin-arm64@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz#27b1854c2cd04eb1d5e75081a1a792ad91526618" - integrity sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg== - -"@next/swc-darwin-x64@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz#9940c449e757d0ee50bb9e792d2600cc08a3eb3b" - integrity sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw== - -"@next/swc-linux-arm64-gnu@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz#0eafd27c8587f68ace7b4fa80695711a8434de21" - integrity sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w== - -"@next/swc-linux-arm64-musl@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz#2b0072adb213f36dada5394ea67d6e82069ae7dd" - integrity sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ== - -"@next/swc-linux-x64-gnu@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz#68c67d20ebc8e3f6ced6ff23a4ba2a679dbcec32" - integrity sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A== - -"@next/swc-linux-x64-musl@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz#67cd81b42fb2caf313f7992fcf6d978af55a1247" - integrity sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw== - -"@next/swc-win32-arm64-msvc@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz#be06585906b195d755ceda28f33c633e1443f1a3" - integrity sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w== - -"@next/swc-win32-ia32-msvc@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz#e76cabefa9f2d891599c3d85928475bd8d3f6600" - integrity sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg== - -"@next/swc-win32-x64-msvc@14.0.4": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz#e74892f1a9ccf41d3bf5979ad6d3d77c07b9cba1" - integrity sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A== +"@next/swc-darwin-arm64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" + integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== + +"@next/swc-darwin-x64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" + integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== + +"@next/swc-linux-arm64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" + integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== + +"@next/swc-linux-arm64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" + integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== + +"@next/swc-linux-x64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" + integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== + +"@next/swc-linux-x64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" + integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== + +"@next/swc-win32-arm64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" + integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== + +"@next/swc-win32-ia32-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" + integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== + +"@next/swc-win32-x64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" + integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3446,6 +3782,14 @@ "@gar/promisify" "^1.0.1" semver "^7.3.5" +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + "@npmcli/fs@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" @@ -3503,6 +3847,14 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@npmcli/name-from-folder@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" @@ -4948,6 +5300,11 @@ dependencies: "@opentelemetry/core" "^1.1.0" +"@panva/hkdf@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.1.1.tgz#ab9cd8755d1976e72fc77a00f7655a64efe6cd5d" + integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA== + "@parcel/watcher@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" @@ -4968,6 +5325,24 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.11": + version "0.5.14" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.14.tgz#93418c8b35beaebec7d996b995b4edc0bd1e83ad" + integrity sha512-kmivGoNIyf4MolK7HoxvmIoR/J1ccM8iEShIlYzG27CdBmWsJEWNTwzocnlCkiF4iOSoWhf1QoQt71VGwq9r6Q== + dependencies: + ansi-html "^0.0.9" + core-js-pure "^3.23.3" + error-stack-parser "^2.0.6" + html-entities "^2.1.0" + loader-utils "^2.0.4" + schema-utils "^4.2.0" + source-map "^0.7.3" + "@pnpm/config.env-replace@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" @@ -4989,6 +5364,11 @@ "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.25" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" + integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== + "@popperjs/core@^2.11.5", "@popperjs/core@^2.11.6": version "2.11.8" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" @@ -5086,6 +5466,22 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-accordion@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz#738441f7343e5142273cdef94d12054c3287966f" + integrity sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collapsible" "1.0.3" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-arrow@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" @@ -5105,6 +5501,21 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-layout-effect" "1.0.1" +"@radix-ui/react-collapsible@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz#df0e22e7a025439f13f62d4e4a9e92c4a0df5b81" + integrity sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-collection@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.3.tgz#9595a66e09026187524a36c6e7e9c7d286469159" @@ -5229,6 +5640,20 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-escape-keydown" "1.0.3" +"@radix-ui/react-dropdown-menu@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz#cdf13c956c5e263afe4e5f3587b3071a25755b63" + integrity sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-menu" "2.0.6" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-focus-guards@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz#339c1c69c41628c1a5e655f15f7020bf11aa01fa" @@ -5310,6 +5735,31 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "1.0.1" +"@radix-ui/react-menu@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.0.6.tgz#2c9e093c1a5d5daa87304b2a2f884e32288ae79e" + integrity sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.3" + "@radix-ui/react-portal" "1.0.4" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + "@radix-ui/react-popover@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.6.tgz#19bb81e7450482c625b8cd05bf4dcd1d2cd91a8b" @@ -5424,19 +5874,51 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-slot" "1.0.2" -"@radix-ui/react-select@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.0.0.tgz#a3511792a51a7018d6559357323a7f52e0e38887" - integrity sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w== +"@radix-ui/react-roving-focus@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974" + integrity sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ== dependencies: "@babel/runtime" "^7.13.10" - "@radix-ui/number" "1.0.1" "@radix-ui/primitive" "1.0.1" "@radix-ui/react-collection" "1.0.3" "@radix-ui/react-compose-refs" "1.0.1" "@radix-ui/react-context" "1.0.1" "@radix-ui/react-direction" "1.0.1" - "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-scroll-area@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz#01160c6893f24a2ddb5aa399ae5b3ba84ad4d3cc" + integrity sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.1" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-select@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.0.0.tgz#a3511792a51a7018d6559357323a7f52e0e38887" + integrity sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.1" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" "@radix-ui/react-focus-guards" "1.0.1" "@radix-ui/react-focus-scope" "1.0.4" "@radix-ui/react-id" "1.0.1" @@ -5585,6 +6067,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@remix-run/router@1.16.1": + version "1.16.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd" + integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== + "@rollup/plugin-commonjs@24.0.0": version "24.0.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.0.tgz#fb7cf4a6029f07ec42b25daa535c75b05a43f75c" @@ -5939,7 +6426,7 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sindresorhus/is@^4.6.0": +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== @@ -6069,13 +6556,26 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" -"@swc/helpers@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.5": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" + integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== dependencies: + "@swc/counter" "^0.1.3" tslib "^2.4.0" +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + "@tailwindcss/typography@^0.5.9": version "0.5.9" resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.9.tgz#027e4b0674929daaf7c921c900beee80dbad93e8" @@ -6098,6 +6598,17 @@ resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.10.7.tgz#577e8a635048875de4c9d6d6a3c21d26ff9f9d08" integrity sha512-KQk5OMg5OH6rmbHZxuNROvdI+hKDIUxANaHlV+dPlNN7ED3qYQ/WkpY2qlXww1SIdeMlkIhpN/2L00rof0fXFw== +"@teamsupercell/typings-for-css-modules-loader@^2.5.2": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@teamsupercell/typings-for-css-modules-loader/-/typings-for-css-modules-loader-2.5.2.tgz#b29deee5ebf6dac48693a2039a3b68b5ad821c1d" + integrity sha512-3sqH2B4itcm5XgV1IHENt4NOaW7bOC1CwJr63vrdKWWyKVxNxtBM+ABVhJZYFCCVAwNy7ulA64z6HyQqw96m4A== + dependencies: + camelcase "^5.3.1" + loader-utils "^1.4.2" + schema-utils "^2.0.1" + optionalDependencies: + prettier "*" + "@teppeis/multimaps@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@teppeis/multimaps/-/multimaps-2.0.0.tgz#2114ee964b702f9777d0e07899087ad9cd89a0de" @@ -6117,6 +6628,20 @@ lz-string "^1.5.0" pretty-format "^27.0.2" +"@testing-library/jest-dom@^6.1.3": + version "6.4.5" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz#badb40296477149136dabef32b572ddd3b56adf1" + integrity sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A== + dependencies: + "@adobe/css-tools" "^4.3.2" + "@babel/runtime" "^7.9.2" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.21" + redent "^3.0.0" + "@testing-library/react@^14.0.0": version "14.0.0" resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c" @@ -6269,6 +6794,16 @@ dependencies: "@types/node" "*" +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + "@types/connect-history-api-fallback@^1.3.5": version "1.5.0" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" @@ -6296,10 +6831,10 @@ resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.8.tgz#6742a5971f490dc41e59d277eee71361fea0b537" integrity sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg== -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== +"@types/cookie@0.6.0", "@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== "@types/cookie@^0.5.1": version "0.5.1" @@ -6316,6 +6851,18 @@ "@types/keygrip" "*" "@types/node" "*" +"@types/country-flag-icons@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/country-flag-icons/-/country-flag-icons-1.2.2.tgz#8f51089cab857f0f700feabd38b3960d006d64f2" + integrity sha512-CefEn/J336TBDp7NX8JqzlDtCBOsm8M3r1Li0gEOt0HOMHF1XemNyrx9lSHjsafcb1yYWybU0N8ZAXuyCaND0w== + +"@types/debug@^4.1.6": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + "@types/detox@^18.1.0": version "18.1.0" resolved "https://registry.yarnpkg.com/@types/detox/-/detox-18.1.0.tgz#5d204f08c8db3a03827f9146b043fc2421327753" @@ -6323,6 +6870,13 @@ dependencies: detox "*" +"@types/electron@^1.6.10": + version "1.6.10" + resolved "https://registry.yarnpkg.com/@types/electron/-/electron-1.6.10.tgz#7e87888ed3888767cca68e92772c2c8ea46bc873" + integrity sha512-MOCVyzIwkBEloreoCVrTV108vSf8fFIJPsGruLCoAoBZdxtnJUqKA4lNonf/2u1twSjAspPEfmEheC+TLm/cMw== + dependencies: + electron "*" + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -6344,6 +6898,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== +"@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.36" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" @@ -6374,6 +6933,13 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" @@ -6422,11 +6988,21 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + "@types/http-assert@*": version "1.5.5" resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.5.tgz#dfb1063eb7c240ee3d3fe213dac5671cfb6a8dbf" integrity sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g== +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + "@types/http-errors@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" @@ -6470,16 +7046,38 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@^29.5.5": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/js-cookie@^3.0.2": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-3.0.3.tgz#d6bfbbdd0c187354ca555213d1962f6d0691ff4e" integrity sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww== +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.12" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.5": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -6497,6 +7095,13 @@ resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.6.tgz#1749535181a2a9b02ac04a797550a8787345b740" integrity sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ== +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + "@types/koa-compose@*": version "3.2.8" resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.8.tgz#dec48de1f6b3d87f87320097686a915f1e954b57" @@ -6581,6 +7186,11 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + "@types/mysql@2.15.22": version "2.15.22" resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.22.tgz#8705edb9872bf4aa9dbc004cd494e00334e5cdb4" @@ -6613,6 +7223,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.48.tgz#3bc872236cdb31cb51024d8875d655e25db489a4" integrity sha512-mlaecDKQ7rIZrYD7iiKNdzFb6e/qD5I9U1rAhq+Fd+DWvYVs+G2kv74UFHmSOlg5+i/vF3XxuR522V4u8BqO+Q== +"@types/node@^18.11.18": + version "18.19.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.33.tgz#98cd286a1b8a5e11aa06623210240bcc28e95c48" + integrity sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A== + dependencies: + undici-types "~5.26.4" + "@types/node@^20.12.2": version "20.12.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" @@ -6620,6 +7237,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@^20.9.0": + version "20.13.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.13.0.tgz#011a76bc1e71ae9a026dddcfd7039084f752c4b6" + integrity sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ== + dependencies: + undici-types "~5.26.4" + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -6665,6 +7289,14 @@ pg-protocol "*" pg-types "^2.2.0" +"@types/plist@^3.0.1": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0" + integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -6718,6 +7350,13 @@ hoist-non-react-statics "^3.3.0" redux "^4.0.0" +"@types/react-test-renderer@^18.0.1": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.3.0.tgz#839502eae70058a4ae161f63385a8e7929cef4c0" + integrity sha512-HW4MuEYxfDbOHQsVlY/XtOvNHftCVEPhJF2pQXXwcUiUF+Oyb0usgp48HSgpK5rt8m9KZb22yqOeZm+rrVG8gw== + dependencies: + "@types/react" "*" + "@types/react@*": version "18.2.21" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" @@ -6736,6 +7375,13 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" @@ -6751,6 +7397,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/send@*": version "0.17.1" resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" @@ -6809,6 +7460,18 @@ dependencies: "@types/node" "*" +"@types/terser-webpack-plugin@^5.0.4": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/terser-webpack-plugin/-/terser-webpack-plugin-5.2.0.tgz#6aaec696593216917f9f03266bed222f8253483b" + integrity sha512-iHDR2pRfFjGyDqCALX2tgUgFtGoQf2AJhKpC2XD1IMBQVJF2bny6WChGRDKj9eaZJl4F2RmvBhxJNtVPj7aTRw== + dependencies: + terser-webpack-plugin "*" + +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/uuid@8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" @@ -6819,6 +7482,20 @@ resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.1.tgz#6560af76ed54490e68c42f717ab4e742ba7be74b" integrity sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A== +"@types/verror@^1.10.3": + version "1.10.10" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.10.tgz#d5a4b56abac169bfbc8b23d291363a682e6fa087" + integrity sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg== + +"@types/webpack-bundle-analyzer@^4.6.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz#fe199e724ce3d38705f6f1ba4d62429b7c360541" + integrity sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg== + dependencies: + "@types/node" "*" + tapable "^2.2.0" + webpack "^5" + "@types/ws@^8.5.5": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" @@ -6868,6 +7545,23 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^6.7.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/parser@5.60.1": version "5.60.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.1.tgz#0f2f58209c0862a73e3d5a56099abfdfa21d0fd3" @@ -6889,6 +7583,17 @@ "@typescript-eslint/visitor-keys" "6.5.0" debug "^4.3.4" +"@typescript-eslint/parser@^6.7.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + "@typescript-eslint/parser@^6.7.5": version "6.8.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.8.0.tgz#bb2a969d583db242f1ee64467542f8b05c2e28cb" @@ -6916,6 +7621,14 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/scope-manager@6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz#f2cb20895aaad41b3ad27cc3a338ce8598f261c5" @@ -6942,6 +7655,16 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/types@5.60.1": version "5.60.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.1.tgz#a17473910f6b8d388ea83c9d7051af89c4eb7561" @@ -6952,6 +7675,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + "@typescript-eslint/types@6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.5.0.tgz#f4e55cfd99ac5346ea772770bf212a3e689a8f04" @@ -6988,6 +7716,20 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/typescript-estree@6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz#1cef6bc822585e9ef89d88834bc902d911d747ed" @@ -7028,7 +7770,20 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@^5.58.0": +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.58.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== @@ -7058,6 +7813,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + "@typescript-eslint/visitor-keys@6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz#1a6f474a0170a447b76f0699ce6700110fd11436" @@ -7097,6 +7860,14 @@ "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" @@ -7112,6 +7883,11 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" @@ -7136,6 +7912,16 @@ "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/wasm-gen" "1.11.6" +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/ieee754@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" @@ -7169,6 +7955,20 @@ "@webassemblyjs/wasm-parser" "1.11.6" "@webassemblyjs/wast-printer" "1.11.6" +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + "@webassemblyjs/wasm-gen@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" @@ -7180,6 +7980,17 @@ "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + "@webassemblyjs/wasm-opt@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" @@ -7190,6 +8001,16 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" @@ -7202,6 +8023,18 @@ "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + "@webassemblyjs/wast-printer@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" @@ -7210,6 +8043,34 @@ "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== + +"@webpack-cli/info@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== + +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== + +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -7248,11 +8109,16 @@ JSONStream@^1.0.3, JSONStream@^1.0.4, JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.5: +abab@^2.0.5, abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + abbrev@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" @@ -7273,6 +8139,14 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-import-assertions@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" @@ -7297,6 +8171,11 @@ acorn-walk@^7.0.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.0.0, acorn-walk@^8.0.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" @@ -7307,6 +8186,11 @@ acorn@^7.0.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.8.1: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" @@ -7373,7 +8257,7 @@ ajv-formats@2.1.1, ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== @@ -7395,7 +8279,7 @@ ajv@8.12.0, ajv@^8.0.0, ajv@^8.11.0, ajv@^8.6.3, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -7450,6 +8334,11 @@ ansi-html-community@^0.0.8: resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== +ansi-html@^0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.9.tgz#6512d02342ae2cc68131952644a129cb734cd3f0" + integrity sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg== + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -7524,6 +8413,44 @@ apache-md5@^1.0.6: resolved "https://registry.yarnpkg.com/apache-md5/-/apache-md5-1.1.8.tgz#ea79c6feb03abfed42b2830dde06f75df5e3bbd9" integrity sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA== +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.13.3.tgz#36e47b65fecb8780bb73bff0fee4e0480c28274b" + integrity sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig== + dependencies: + "@develar/schema-utils" "~2.6.5" + "@electron/notarize" "2.2.1" + "@electron/osx-sign" "1.0.5" + "@electron/universal" "1.5.1" + "@malept/flatpak-bundler" "^0.4.0" + "@types/fs-extra" "9.0.13" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.8" + electron-publish "24.13.1" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^5.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^5.1.1" + read-config-file "6.3.2" + sanitize-filename "^1.6.3" + semver "^7.3.8" + tar "^6.1.12" + temp-file "^3.4.0" + "aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" @@ -7596,7 +8523,7 @@ aria-query@5.1.3: dependencies: deep-equal "^2.0.5" -aria-query@^5.3.0: +aria-query@^5.0.0, aria-query@^5.1.3, aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== @@ -7611,6 +8538,14 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" @@ -7662,6 +8597,17 @@ array-union@^3.0.1: resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== +array.prototype.find@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.2.3.tgz#675a233dbcd9b65ecf1fb3f915741aebc45461e6" + integrity sha512-fO/ORdOELvjbbeIfZfzrXFMhYHGofRGqd+am9zm3tZ4GlJINj/pA2eITyfd65Vg6+ZbHd/Cys7stpoRSWtQFdA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + array.prototype.findlastindex@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" @@ -7736,6 +8682,20 @@ arraybuffer.prototype.slice@^1.0.1: is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -7785,6 +8745,13 @@ assertion-error-formatter@^3.0.0: pad-right "^0.2.2" repeat-string "^1.6.1" +ast-metadata-inferer@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz#0f94c3425e310d8da45823ab2161142e3f134343" + integrity sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA== + dependencies: + "@mdn/browser-compat-data" "^5.2.34" + ast-transform@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/ast-transform/-/ast-transform-0.0.0.tgz#74944058887d8283e189d954600947bc98fe0062" @@ -7794,6 +8761,11 @@ ast-transform@0.0.0: esprima "~1.0.4" through "~2.3.4" +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + ast-types-flow@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" @@ -7809,6 +8781,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + async@^2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -7838,6 +8815,11 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atomically@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" + integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== + autoprefixer@^10.4.12, autoprefixer@^10.4.9: version "10.4.15" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.15.tgz#a1230f4aeb3636b89120b34a1f513e2f6834d530" @@ -7855,6 +8837,13 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -7870,6 +8859,11 @@ axe-core@=4.7.0: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.6.2: + version "4.9.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae" + integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== + axios@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" @@ -7879,16 +8873,7 @@ axios@1.1.3: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.0.0, axios@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" - integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axios@^1.6.0: +axios@^1.0.0, axios@^1.1.2, axios@^1.6.0: version "1.6.8" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== @@ -7897,7 +8882,7 @@ axios@^1.6.0: form-data "^4.0.0" proxy-from-env "^1.1.0" -axobject-query@^3.2.1: +axobject-query@^3.1.1, axobject-query@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== @@ -7922,6 +8907,19 @@ babel-jest@^29.6.4: graceful-fs "^4.2.9" slash "^3.0.0" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-loader@^9.1.2: version "9.1.3" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" @@ -8046,7 +9044,7 @@ base64-js@1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -8119,7 +9117,14 @@ blob-util@^2.0.2: resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== -bluebird@^3.5.4, bluebird@^3.7.2: +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.4, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -8167,6 +9172,11 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + boolify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/boolify/-/boolify-1.0.1.tgz#b5c09e17cacd113d11b7bb3ed384cc012994d86b" @@ -8430,6 +9440,11 @@ browserify@^17.0.0: vm-browserify "^1.0.0" xtend "^4.0.0" +browserslist-config-erb@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/browserslist-config-erb/-/browserslist-config-erb-0.0.3.tgz#db7f06fe5b1ce2ab9f09e78ac4d5a9f572e188a4" + integrity sha512-y47DryCY92lxkKyRVMlaZvXAolIY7U33q9e4CS0MdWeJkoAht7OzsrkfdZFCBOP3H5q1EVUxS0L7VVsKM6gZCQ== + browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: version "4.21.10" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" @@ -8440,6 +9455,13 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^ node-releases "^2.0.13" update-browserslist-db "^1.0.11" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -8462,6 +9484,11 @@ buffer-equal@0.0.1: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA== +buffer-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" + integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -8472,7 +9499,7 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.1.0, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -8496,13 +9523,51 @@ buffer@~5.2.1: base64-js "^1.0.2" ieee754 "^1.1.4" -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== +builder-util-runtime@9.2.3: + version "9.2.3" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz#0a82c7aca8eadef46d67b353c638f052c206b83c" + integrity sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw== + dependencies: + debug "^4.3.4" + sax "^1.2.4" -builtins@^1.0.3: - version "1.0.3" +builder-util-runtime@9.2.4: + version "9.2.4" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz#13cd1763da621e53458739a1e63f7fcba673c42a" + integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.13.1.tgz#4a4c4f9466b016b85c6990a0ea15aa14edec6816" + integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA== + dependencies: + "7zip-bin" "~5.2.0" + "@types/debug" "^4.1.6" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +builtins@^1.0.3: + version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== @@ -8576,6 +9641,30 @@ cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + cacache@^17.0.0: version "17.1.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" @@ -8612,6 +9701,24 @@ cacache@^18.0.0, cacache@^18.0.2: tar "^6.1.11" unique-filename "^3.0.0" +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz#865576dfef39c0d6a7defde794d078f5308e3ef3" @@ -8640,6 +9747,17 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + callsite@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" @@ -8650,6 +9768,14 @@ callsites@^3.0.0, callsites@^3.1.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" @@ -8699,11 +9825,21 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: version "1.0.30001603" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz#605046a5bdc95ba4a92496d67e062522dce43381" integrity sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q== +caniuse-lite@^1.0.30001524: + version "1.0.30001626" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001626.tgz#328623664a28493b4a9019af7ce03ea39fbe898c" + integrity sha512-JRW7kAH8PFJzoPCJhLSHgDgKg5348hsQ68aqb+slnzuB5QFERv846oA/mRChmlLAOdEDeOkRn3ynb1gSFnjt3w== + +caniuse-lite@^1.0.30001579: + version "1.0.30001617" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" + integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== + capital-case@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" @@ -8853,6 +9989,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + ci-info@^3.2.0, ci-info@^3.6.1: version "3.8.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" @@ -8904,6 +10045,13 @@ class-variance-authority@^0.7.0: dependencies: clsx "2.0.0" +clean-css@^5.2.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -9020,6 +10168,13 @@ clone-deep@4.0.1, clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + clone@^1.0.2, clone@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -9121,7 +10276,7 @@ colord@^2.9.1: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10, colorette@^2.0.16: +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -9196,7 +10351,7 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^5.1.0: +commander@^5.0.0, commander@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== @@ -9211,6 +10366,11 @@ commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + commander@^9.0.0: version "9.5.0" resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" @@ -9275,6 +10435,11 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== + compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -9325,7 +10490,7 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concurrently@^8.2.2: +concurrently@^8.2.1, concurrently@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== @@ -9340,6 +10505,22 @@ concurrently@^8.2.2: tree-kill "^1.2.2" yargs "^17.7.2" +conf@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/conf/-/conf-10.2.0.tgz#838e757be963f1a2386dfe048a98f8f69f7b55d6" + integrity sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg== + dependencies: + ajv "^8.6.3" + ajv-formats "^2.1.1" + atomically "^1.7.0" + debounce-fn "^4.0.0" + dot-prop "^6.0.1" + env-paths "^2.2.1" + json-schema-typed "^7.0.3" + onetime "^5.1.2" + pkg-up "^3.1.0" + semver "^7.3.5" + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -9348,6 +10529,14 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" +config-file-ts@^0.2.4: + version "0.2.6" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.6.tgz#b424ff74612fb37f626d6528f08f92ddf5d22027" + integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== + dependencies: + glob "^10.3.10" + typescript "^5.3.3" + configstore@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" @@ -9359,7 +10548,7 @@ configstore@^6.0.0: write-file-atomic "^3.0.3" xdg-basedir "^5.0.1" -confusing-browser-globals@^1.0.9: +confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.9: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== @@ -9705,19 +10894,19 @@ cookie@0.5.0, cookie@^0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.6.0, cookie@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -cookies-next@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cookies-next/-/cookies-next-4.1.0.tgz#1ecf2e4a65abe2ad3ffb3f4ad3d303ae008303c3" - integrity sha512-BREVc4TJT4NwXfyKjdjnYFXM6iRns+MYpCd34ClXuYqeisXnkPkbq7Ok9xaqi9mHmV6H2rwPE+p3EpMz4pF/kQ== +cookies-next@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/cookies-next/-/cookies-next-4.1.1.tgz#54498efe867bb5c1a47b5a99a7ea8563601c2413" + integrity sha512-20QaN0iQSz87Os0BhNg9M71eM++gylT3N5szTlhq2rK6QvXn1FYGPB4eAgU4qFTunbQKhD35zfQ95ZWgzUy3Cg== dependencies: - "@types/cookie" "^0.4.1" + "@types/cookie" "^0.6.0" "@types/node" "^16.10.2" - cookie "^0.4.0" + cookie "^0.6.0" copy-anything@^2.0.1: version "2.0.6" @@ -9745,11 +10934,21 @@ core-js-compat@^3.31.0: dependencies: browserslist "^4.21.10" +core-js-pure@^3.23.3: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.37.1.tgz#2b4b34281f54db06c9a9a5bd60105046900553bd" + integrity sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA== + core-js@3.6.5: version "3.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== +core-js@^3.32.2: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.1.tgz#d21751ddb756518ac5a00e4d66499df981a62db9" + integrity sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw== + core-js@^3.33.0: version "3.33.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.1.tgz#ef3766cfa382482d0a2c2bc5cb52c6d88805da52" @@ -9835,6 +11034,18 @@ cosmiconfig@^8.2.0: parse-json "^5.2.0" path-type "^4.0.0" +country-flag-icons@^1.5.11: + version "1.5.11" + resolved "https://registry.yarnpkg.com/country-flag-icons/-/country-flag-icons-1.5.11.tgz#04c0556728e517a6207946656355698ac6237080" + integrity sha512-B+mvFywunkRJs270k7kCBjhogvIA0uNn6GAXv6m2cPn3rrwqZzZVr2gBWcz+Cz7OGVWlcbERlYRIX0S6OGr8Bw== + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -9866,6 +11077,19 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -10064,7 +11288,21 @@ css-loader@^6.4.0: postcss-value-parser "^4.2.0" semver "^7.3.8" -css-minimizer-webpack-plugin@^5.0.0: +css-loader@^6.8.1: + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" + +css-minimizer-webpack-plugin@^5.0.0, css-minimizer-webpack-plugin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz#33effe662edb1a0bf08ad633c32fa75d0f7ec565" integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== @@ -10076,6 +11314,17 @@ css-minimizer-webpack-plugin@^5.0.0: schema-utils "^4.0.1" serialize-javascript "^6.0.1" +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + css-select@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" @@ -10103,11 +11352,16 @@ css-tree@~2.2.0: mdn-data "2.0.28" source-map-js "^1.0.1" -css-what@^6.1.0: +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -10168,6 +11422,23 @@ csso@^5.0.5: dependencies: css-tree "~2.2.0" +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + csstype@^3.0.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" @@ -10275,6 +11546,42 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + date-fns@^2.30.0: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -10292,6 +11599,18 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== +debounce-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7" + integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ== + dependencies: + mimic-fn "^3.0.0" + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -10313,6 +11632,13 @@ debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.0.1, debug@^4.3.1: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + decache@^4.6.1: version "4.6.2" resolved "https://registry.yarnpkg.com/decache/-/decache-4.6.2.tgz#c1df1325a2f36d53922e08f33380f083148199cd" @@ -10338,6 +11664,11 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -10420,6 +11751,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + define-data-property@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" @@ -10429,6 +11765,15 @@ define-data-property@^1.0.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -10543,6 +11888,11 @@ detect-libc@^2.0.0, detect-libc@^2.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== +detect-libc@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -10689,6 +12039,14 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-compare@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" + integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg== + dependencies: + buffer-equal "^1.0.0" + minimatch "^3.0.4" + dir-glob@^3.0.0, dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -10706,6 +12064,34 @@ dlv@^1.1.0, dlv@^1.1.3: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +dmg-builder@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.13.3.tgz#95d5b99c587c592f90d168a616d7ec55907c7e55" + integrity sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ== + dependencies: + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + fs-extra "^10.1.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.11" + +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -10737,6 +12123,18 @@ dom-accessibility-api@^0.5.9: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" @@ -10770,7 +12168,14 @@ domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.2.0, domhandler@^4.2.2: +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== @@ -10784,7 +12189,7 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -domutils@^2.8.0: +domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -10829,6 +12234,11 @@ dot@^2.0.0-beta.1: resolved "https://registry.yarnpkg.com/dot/-/dot-2.0.0-beta.1.tgz#12bcb18f39f590f9426910e1d19188dad225af25" integrity sha512-kxM7fSnNQTXOmaeGuBSXM8O3fEsBb7XSDBllkGbRwa0lJSJTxxDE/4eSNGLKZUmlFw0f1vJ5qSV2BljrgQtgIA== +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + dotenv-expand@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" @@ -10849,6 +12259,11 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + dotenv@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" @@ -10868,7 +12283,7 @@ duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2, duplexer2@~0.1.4: dependencies: readable-stream "^2.0.2" -duplexer@^0.1.1, duplexer@~0.1.1: +duplexer@^0.1.1, duplexer@^0.1.2, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -10903,18 +12318,141 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.7: - version "3.1.9" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" - integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== +ejs@^3.1.7, ejs@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" +electron-builder@^24.6.4: + version "24.13.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.13.3.tgz#c506dfebd36d9a50a83ee8aa32d803d83dbe4616" + integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg== + dependencies: + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + dmg-builder "24.13.3" + fs-extra "^10.1.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.3.2" + simple-update-notifier "2.0.0" + yargs "^17.6.2" + +electron-debug@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-3.2.0.tgz#46a15b555c3b11872218c65ea01d058aa0814920" + integrity sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow== + dependencies: + electron-is-dev "^1.1.0" + electron-localshortcut "^3.1.0" + +electron-devtools-installer@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz#acc48d24eb7033fe5af284a19667e73b78d406d0" + integrity sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ== + dependencies: + rimraf "^3.0.2" + semver "^7.2.1" + tslib "^2.1.0" + unzip-crx-3 "^0.2.0" + +electron-is-accelerator@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" + integrity sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA== + +electron-is-dev@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" + integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== + +electron-localshortcut@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz#cfc83a3eff5e28faf98ddcc87f80a2ce4f623cd3" + integrity sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q== + dependencies: + debug "^4.0.1" + electron-is-accelerator "^0.1.0" + keyboardevent-from-electron-accelerator "^2.0.0" + keyboardevents-areequal "^0.2.1" + +electron-log@^4.4.8: + version "4.4.8" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.4.8.tgz#fcb9f714dbcaefb6ac7984c4683912c74730248a" + integrity sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA== + +electron-publish@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.13.1.tgz#57289b2f7af18737dc2ad134668cdd4a1b574a0c" + integrity sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + fs-extra "^10.1.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron-store@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.2.0.tgz#114e6e453e8bb746ab4ccb542424d8c881ad2ca1" + integrity sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw== + dependencies: + conf "^10.2.0" + type-fest "^2.17.0" + electron-to-chromium@^1.4.477: version "1.4.508" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== +electron-updater@^6.1.4: + version "6.1.8" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.1.8.tgz#17637bca165322f4e526b13c99165f43e6f697d8" + integrity sha512-hhOTfaFAd6wRHAfUaBhnAOYc+ymSGCWJLtFkw4xJqOvtpHmIdNHnXDV9m1MHC+A6q08Abx4Ykgyz/R5DGKNAMQ== + dependencies: + builder-util-runtime "9.2.3" + fs-extra "^10.1.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + lodash.escaperegexp "^4.1.2" + lodash.isequal "^4.5.0" + semver "^7.3.8" + tiny-typed-emitter "^2.1.0" + +electron@*: + version "30.0.9" + resolved "https://registry.yarnpkg.com/electron/-/electron-30.0.9.tgz#b11400e4642a4b635e79244ba365f1d401ee60b5" + integrity sha512-ArxgdGHVu3o5uaP+Tqj8cJDvU03R6vrGrOqiMs7JXLnvQHMqXJIIxmFKQAIdJW8VoT3ac3hD21tA7cPO10RLow== + dependencies: + "@electron/get" "^2.0.0" + "@types/node" "^20.9.0" + extract-zip "^2.0.1" + +electron@28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-28.1.0.tgz#9de1ecdaafcb0ec5753827f14dfb199e6c84545e" + integrity sha512-82Y7o4PSWPn1o/aVwYPsgmBw6Gyf2lVHpaBu3Ef8LrLWXxytg7ZRZr/RtDqEMOzQp3+mcuy3huH84MyjdmP50Q== + dependencies: + "@electron/get" "^2.0.0" + "@types/node" "^18.11.18" + extract-zip "^2.0.1" + +electronmon@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/electronmon/-/electronmon-2.0.3.tgz#93236d062ebb91268a713a7d214e7cc8dac66f5f" + integrity sha512-vpsNupi9sCzOCvx8GACbSHKEImkNF2a6pU5Io2yabARbJeQ/8ZuY7t/43LilF6Qw0nZ0MbKQt4sO3x0F3drpQQ== + dependencies: + chalk "^3.0.0" + import-from "^3.0.0" + runtime-required "^1.1.0" + watchboy "^0.4.3" + elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -10995,6 +12533,15 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +enhanced-resolve@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + integrity sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + enhanced-resolve@^5.0.0, enhanced-resolve@^5.12.0, enhanced-resolve@^5.15.0, enhanced-resolve@^5.7.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -11003,6 +12550,14 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.12.0, enhanced-resolve@^5.15.0, enh graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.16.0: + version "5.16.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" + integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.6: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -11041,7 +12596,7 @@ env-ci@^10.0.0: execa "^8.0.0" java-properties "^1.0.2" -env-paths@^2.2.0: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== @@ -11061,6 +12616,11 @@ envinfo@7.8.1: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +envinfo@^7.7.3: + version "7.13.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" + integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== + err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -11080,7 +12640,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -error-stack-parser@^2.1.4: +error-stack-parser@^2.0.6, error-stack-parser@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== @@ -11132,6 +12692,70 @@ es-abstract@^1.20.4, es-abstract@^1.22.1: unbox-primitive "^1.0.2" which-typed-array "^1.1.10" +es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-get-iterator@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" @@ -11192,6 +12816,13 @@ es-module-lexer@^1.2.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + es-set-tostringtag@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" @@ -11201,6 +12832,15 @@ es-set-tostringtag@^2.0.1: has "^1.0.3" has-tostringtag "^1.0.0" +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -11208,6 +12848,13 @@ es-shim-unscopables@^1.0.0: dependencies: has "^1.0.3" +es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -11227,6 +12874,11 @@ es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14: esniff "^2.0.1" next-tick "^1.1.0" +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" @@ -11310,6 +12962,17 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + escodegen@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.2.0.tgz#09de7967791cc958b7f89a2ddb6d23451af327e1" @@ -11321,6 +12984,51 @@ escodegen@~1.2.0: optionalDependencies: source-map "~0.1.30" +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz#fda960eee4a510f092a9a1c139035ac588937ddc" + integrity sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig== + dependencies: + eslint-config-airbnb-base "^15.0.0" + +eslint-config-airbnb@^19.0.4: + version "19.0.4" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz#84d4c3490ad70a0ffa571138ebcdea6ab085fdc3" + integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew== + dependencies: + eslint-config-airbnb-base "^15.0.0" + object.assign "^4.1.2" + object.entries "^1.1.5" + +eslint-config-erb@^4.1.0-0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-erb/-/eslint-config-erb-4.1.0.tgz#7ebc016bd52452a79b66a2462c751fa60172f17f" + integrity sha512-30Ysy1JJmxu+VElnNcBZLOsDRWHJh1exfCLMIwe1lscnby8WeTAWJNS0j+WgS9GzYm+5JoNeas90O1wq2bLnJQ== + dependencies: + "@typescript-eslint/eslint-plugin" "^6.7.0" + "@typescript-eslint/parser" "^6.7.0" + eslint-config-airbnb "^19.0.4" + eslint-config-airbnb-typescript "^17.1.0" + eslint-config-prettier "^9.0.0" + eslint-plugin-compat "^4.2.0" + eslint-plugin-import "^2.28.1" + eslint-plugin-jest "^27.4.0" + eslint-plugin-jsx-a11y "6.7.1" + eslint-plugin-prettier "^5.0.0" + eslint-plugin-promise "^6.1.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.6.0" + eslint-config-next@^14.0.4: version "14.0.4" resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.4.tgz#7cd2c0a3b310203d41cf0dbf9d31f9b0a6235b4a" @@ -11341,7 +13049,12 @@ eslint-config-prettier@^8.5.0: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: +eslint-config-prettier@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -11363,6 +13076,36 @@ eslint-import-resolver-typescript@^3.5.2: is-core-module "^2.11.0" is-glob "^4.0.3" +eslint-import-resolver-typescript@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-import-resolver-webpack@^0.13.7: + version "0.13.8" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.8.tgz#5f64d1d653eefa19cdfd0f0165c996b6be7012f9" + integrity sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA== + dependencies: + array.prototype.find "^2.2.2" + debug "^3.2.7" + enhanced-resolve "^0.9.1" + find-root "^1.1.0" + hasown "^2.0.0" + interpret "^1.4.0" + is-core-module "^2.13.1" + is-regex "^1.1.4" + lodash "^4.17.21" + resolve "^2.0.0-next.5" + semver "^5.7.2" + eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" @@ -11370,6 +13113,19 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" +eslint-plugin-compat@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz#eeaf80daa1afe495c88a47e9281295acae45c0aa" + integrity sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w== + dependencies: + "@mdn/browser-compat-data" "^5.3.13" + ast-metadata-inferer "^0.8.0" + browserslist "^4.21.10" + caniuse-lite "^1.0.30001524" + find-up "^5.0.0" + lodash.memoize "^4.1.2" + semver "^7.5.4" + eslint-plugin-cypress@2.13.4: version "2.13.4" resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.13.4.tgz#cb4724c22ca0ad7191b25ec4798f4fe9436f299e" @@ -11400,6 +13156,35 @@ eslint-plugin-import@^2.28.1: semver "^6.3.1" tsconfig-paths "^3.15.0" +eslint-plugin-jest@^27.4.0: + version "27.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" + integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-jsx-a11y@6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + eslint-plugin-jsx-a11y@^6.7.1: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" @@ -11429,11 +13214,29 @@ eslint-plugin-prettier@^4.2.1: dependencies: prettier-linter-helpers "^1.0.0" +eslint-plugin-prettier@^5.0.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.8.6" + +eslint-plugin-promise@^6.1.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.2.0.tgz#e24ab0e3c0a25fa227d98d9ff612156b5af15945" + integrity sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA== + "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": version "4.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== +eslint-plugin-react-hooks@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + eslint-plugin-react@^7.31.8, eslint-plugin-react@^7.33.2: version "7.33.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" @@ -11845,6 +13648,17 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + expect@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.4.tgz#a6e6f66d4613717859b2fe3da98a739437b6f4b8" @@ -11919,7 +13733,7 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extract-zip@2.0.1: +extract-zip@2.0.1, extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== @@ -12005,7 +13819,7 @@ fast-glob@^3.3.2: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -12020,7 +13834,7 @@ fast-safe-stringify@^2.0.7: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== -fastest-levenshtein@^1.0.16: +fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== @@ -12164,7 +13978,7 @@ find-node-modules@^2.1.2: findup-sync "^4.0.0" merge "^2.1.1" -find-root@1.1.0: +find-root@1.1.0, find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== @@ -12189,6 +14003,13 @@ find-up@^2.0.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -12369,7 +14190,7 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.1.0: +fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -12379,7 +14200,7 @@ fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^10.0.0: +fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -12397,7 +14218,16 @@ fs-extra@^11.0.0, fs-extra@^11.1.0, fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== @@ -12436,7 +14266,7 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -12532,6 +14362,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -12607,6 +14448,15 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + get-tsconfig@^4.5.0: version "4.7.0" resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.0.tgz#06ce112a1463e93196aa90320c35df5039147e34" @@ -12843,6 +14693,18 @@ glob@^9.2.0: minipass "^4.2.4" path-scurry "^1.6.1" +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -12889,6 +14751,14 @@ globals@^13.19.0, globals@^13.20.0: dependencies: type-fest "^0.20.2" +globalthis@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -12939,6 +14809,23 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +got@^11.7.0, got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -12959,6 +14846,13 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + hamt_plus@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/hamt_plus/-/hamt_plus-1.0.2.tgz#e21c252968c7e33b20f6a1b094cd85787a265601" @@ -13032,11 +14926,23 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + has-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -13049,6 +14955,13 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-unicode@2.0.1, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -13085,6 +14998,13 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -13140,7 +15060,7 @@ hosted-git-info@^3.0.6: dependencies: lru-cache "^6.0.0" -hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1, hosted-git-info@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== @@ -13183,28 +15103,60 @@ html-encoding-sniffer@^3.0.0: dependencies: whatwg-encoding "^2.0.0" +html-entities@^2.1.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== + html-entities@^2.3.2, html-entities@^2.3.3: version "2.4.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== -html-escaper@^2.0.0: +html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" - integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: - void-elements "3.1.0" + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-webpack-plugin@^5.5.3: + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" htmlescape@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" integrity sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg== +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + htmlparser2@^8.0.1: version "8.0.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" @@ -13240,7 +15192,7 @@ http-auth@4.1.9: bcryptjs "^2.4.3" uuid "^8.3.2" -http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -13350,12 +15302,20 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -13424,6 +15384,14 @@ i18next@^23.6.0: dependencies: "@babel/runtime" "^7.22.5" +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -13448,7 +15416,7 @@ idb@3.0.2: resolved "https://registry.yarnpkg.com/idb/-/idb-3.0.2.tgz#c8e9122d5ddd40f13b60ae665e4862f8b13fa384" integrity sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw== -identity-obj-proxy@3.0.0: +identity-obj-proxy@3.0.0, identity-obj-proxy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== @@ -13525,6 +15493,13 @@ import-from@4.0.0: resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + import-in-the-middle@1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz#2a266676e3495e72c04bbaa5ec14756ba168391b" @@ -13535,7 +15510,7 @@ import-in-the-middle@1.4.2: cjs-module-lexer "^1.2.2" module-details-from-path "^1.0.3" -import-local@3.1.0: +import-local@3.1.0, import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== @@ -13742,6 +15717,25 @@ internal-slot@^1.0.4, internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + intl-messageformat@^9.3.18: version "9.13.0" resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.13.0.tgz#97360b73bd82212e4f6005c712a4a16053165468" @@ -13812,6 +15806,14 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: get-intrinsic "^1.2.0" is-typed-array "^1.1.10" +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -13889,6 +15891,13 @@ is-core-module@^2.13.1: dependencies: hasown "^2.0.0" +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -13970,6 +15979,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -14029,6 +16043,11 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-reference@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" @@ -14061,6 +16080,13 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + is-ssh@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" @@ -14118,6 +16144,13 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: dependencies: which-typed-array "^1.1.11" +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -14185,6 +16218,16 @@ isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isbinaryfile@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.2.tgz#fe6e4dfe2e34e947ffa240c113444876ba393ae0" + integrity sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -14323,6 +16366,15 @@ java-properties@^1.0.2: resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + jest-circus@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.4.tgz#f074c8d795e0cc0f2ebf0705086b1be6a9a8722f" @@ -14349,6 +16401,49 @@ jest-circus@^29.6.4: slash "^3.0.0" stack-utils "^2.0.3" +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + jest-config@^29.4.1: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.4.tgz#eff958ee41d4e1ee7a6106d02b74ad9fc427d79e" @@ -14377,7 +16472,35 @@ jest-config@^29.4.1: slash "^3.0.0" strip-json-comments "^3.1.1" -"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1: +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1, jest-diff@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== @@ -14404,6 +16527,13 @@ jest-docblock@^29.6.3: dependencies: detect-newline "^3.0.0" +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + jest-each@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.3.tgz#1956f14f5f0cb8ae0b2e7cabc10bb03ec817c142" @@ -14415,6 +16545,31 @@ jest-each@^29.6.3: jest-util "^29.6.3" pretty-format "^29.6.3" +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" + jest-environment-node@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.4.tgz#4ce311549afd815d3cafb49e60a1e4b25f06d29f" @@ -14427,6 +16582,18 @@ jest-environment-node@^29.6.4: jest-mock "^29.6.3" jest-util "^29.6.3" +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" @@ -14451,6 +16618,25 @@ jest-haste-map@^29.6.4: optionalDependencies: fsevents "^2.3.2" +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + jest-leak-detector@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz#b9661bc3aec8874e59aff361fa0c6d7cd507ea01" @@ -14459,6 +16645,14 @@ jest-leak-detector@^29.6.3: jest-get-type "^29.6.3" pretty-format "^29.6.3" +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-matcher-utils@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz#327db7ababea49455df3b23e5d6109fe0c709d24" @@ -14469,6 +16663,16 @@ jest-matcher-utils@^29.6.4: jest-get-type "^29.6.3" pretty-format "^29.6.3" +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-message-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.3.tgz#bce16050d86801b165f20cfde34dc01d3cf85fbf" @@ -14484,6 +16688,21 @@ jest-message-util@^29.6.3: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.3.tgz#433f3fd528c8ec5a76860177484940628bdf5e0a" @@ -14493,6 +16712,15 @@ jest-mock@^29.6.3: "@types/node" "*" jest-util "^29.6.3" +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" @@ -14503,6 +16731,14 @@ jest-regex-util@^29.6.3: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + jest-resolve@^29.4.1, jest-resolve@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.4.tgz#e34cb06f2178b429c38455d98d1a07572ac9faa3" @@ -14518,6 +16754,21 @@ jest-resolve@^29.4.1, jest-resolve@^29.6.4: resolve.exports "^2.0.0" slash "^3.0.0" +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + jest-runner@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.4.tgz#b3b8ccb85970fde0fae40c73ee11eb75adccfacf" @@ -14545,6 +16796,33 @@ jest-runner@^29.6.4: p-limit "^3.1.0" source-map-support "0.5.13" +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + jest-runtime@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.4.tgz#b0bc495c9b6b12a0a7042ac34ca9bb85f8cd0ded" @@ -14573,6 +16851,34 @@ jest-runtime@^29.6.4: slash "^3.0.0" strip-bom "^4.0.0" +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-snapshot@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.4.tgz#9833eb6b66ff1541c7fd8ceaa42d541f407b4876" @@ -14599,6 +16905,44 @@ jest-snapshot@^29.6.4: pretty-format "^29.6.3" semver "^7.5.3" +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-util@^29.4.1, jest-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.3.tgz#e15c3eac8716440d1ed076f09bc63ace1aebca63" @@ -14623,6 +16967,18 @@ jest-validate@^29.6.3: leven "^3.1.0" pretty-format "^29.6.3" +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + jest-watcher@^29.6.4: version "29.6.4" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.4.tgz#633eb515ae284aa67fd6831f1c9d1b534cf0e0ba" @@ -14637,6 +16993,20 @@ jest-watcher@^29.6.4: jest-util "^29.6.3" string-length "^4.0.1" +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -14656,6 +17026,26 @@ jest-worker@^29.4.3, jest-worker@^29.6.4: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + jiti@^1.18.2: version "1.19.3" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" @@ -14672,6 +17062,11 @@ joi@^17.3.0: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" +jose@^5.1.3: + version "5.3.0" + resolved "https://registry.yarnpkg.com/jose/-/jose-5.3.0.tgz#61dadf6399e0141d621ad18c1b36a0d6ab17a972" + integrity sha512-IChe9AtAE79ru084ow8jzkN2lNrG3Ntfiv65Cvj9uOCE2m5LNsdHG+9EbxWxAoWRF9TgDOqLN5jm08++owDVRg== + js-cookie@^3.0.1: version "3.0.5" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" @@ -14719,6 +17114,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -14776,6 +17203,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema-typed@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" + integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -14803,14 +17235,14 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.2: +json5@^1.0.1, json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -14820,6 +17252,13 @@ jsonc-parser@3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -14865,7 +17304,7 @@ jsprim@^2.0.2: json-schema "0.4.0" verror "1.10.0" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3, jsx-ast-utils@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== @@ -14875,6 +17314,16 @@ jsprim@^2.0.2: object.assign "^4.1.4" object.values "^1.1.6" +jszip@^3.1.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + just-diff-apply@^5.2.0: version "5.5.0" resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" @@ -14907,6 +17356,23 @@ jwt-decode@^3.1.2: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== +keyboardevent-from-electron-accelerator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz#ace21b1aa4e47148815d160057f9edb66567c50c" + integrity sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA== + +keyboardevents-areequal@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" + integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw== + +keyv@^4.0.0: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + keyv@^4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" @@ -14919,6 +17385,11 @@ kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + klona@^2.0.4, klona@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" @@ -14944,6 +17415,18 @@ language-subtag-registry@^0.3.20: resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== +language-subtag-registry@~0.3.2: + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + language-tags@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" @@ -14964,6 +17447,11 @@ lazy-ass@^1.6.0: resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + lerna-changelog@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/lerna-changelog/-/lerna-changelog-2.2.0.tgz#c43813bba81e30cdeb20aabaef4da390f0f38e41" @@ -15262,6 +17750,13 @@ lie@3.1.1: dependencies: immediate "~3.0.5" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -15337,7 +17832,16 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0, loader-utils@^2.0.3: +loader-utils@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0, loader-utils@^2.0.3, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -15361,6 +17865,14 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -15412,6 +17924,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== + lodash.escaperegexp@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" @@ -15427,6 +17944,11 @@ lodash.isboolean@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.isfunction@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" @@ -15467,7 +17989,7 @@ lodash.map@^4.5.1: resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== -lodash.memoize@^4.1.2: +lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== @@ -15532,7 +18054,7 @@ lodash.words@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.words/-/lodash.words-4.2.0.tgz#5ecfeaf8ecf8acaa8e0c8386295f1993c9cf4036" integrity sha512-mXxqd8Yx9BGPij3lZKFSdOsjOTbL4krbCCp9slEozaN4EMppA2dFmK/f8HeohodprY6W0vOdiQ5WFgPaTI75xQ== -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -15602,6 +18124,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^10.0.1, lru-cache@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" @@ -15714,11 +18241,33 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -make-error@^1.1.1: +make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" @@ -15833,6 +18382,13 @@ marked@^9.0.0: resolved "https://registry.yarnpkg.com/marked/-/marked-9.1.6.tgz#5d2a3f8180abfbc5d62e3258a38a1c19c0381695" integrity sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q== +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -15874,6 +18430,11 @@ memoize-one@^5.1.1: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + integrity sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng== + meow@^12.0.1: version "12.1.1" resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" @@ -15961,6 +18522,11 @@ mime@1.6.0, mime@^1.4.1, mime@^1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mime@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.1.tgz#ad7563d1bfe30253ad97dedfae2b1009d01b9470" @@ -15971,11 +18537,21 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + mimic-fn@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -15986,6 +18562,14 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +mini-css-extract-plugin@^2.7.6: + version "2.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235" + integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + mini-css-extract-plugin@~2.4.7: version "2.4.7" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz#b9f4c4f4d727c7a3cd52a11773bb739f00177fac" @@ -16024,7 +18608,7 @@ minimatch@9.0.3, minimatch@^9.0.0, minimatch@^9.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.1: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -16096,6 +18680,17 @@ minipass-fetch@^1.3.2: optionalDependencies: encoding "^0.1.12" +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-fetch@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" @@ -16136,7 +18731,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -16176,7 +18771,7 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.5, mkdirp@^0.5.6, mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@^0.5.6, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -16257,6 +18852,11 @@ mri@^1.2.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -16352,6 +18952,11 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + nanoid@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e" @@ -16401,6 +19006,13 @@ nerf-dart@^1.0.0: resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" integrity sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g== +next-auth@^5.0.0-beta.18: + version "5.0.0-beta.18" + resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-5.0.0-beta.18.tgz#4211d0b2bef9e47652cf7388ee85e415e7acfc5d" + integrity sha512-x55L8wZb8PcPGCYA3e/l9tdpd7YL3FDuhas4W8pxq3PjrWJ9OoDxNN0otK9axJamJBbBgjfzTJjVQB6hXoe0ZQ== + dependencies: + "@auth/core" "0.31.0" + next-intl@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/next-intl/-/next-intl-3.3.2.tgz#7660fe9929e9192d101398e47dc77f291fc64ab9" @@ -16420,29 +19032,28 @@ next-tick@^1.1.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== -next@^14.0.4: - version "14.0.4" - resolved "https://registry.yarnpkg.com/next/-/next-14.0.4.tgz#bf00b6f835b20d10a5057838fa2dfced1d0d84dc" - integrity sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA== +next@^14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" + integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== dependencies: - "@next/env" "14.0.4" - "@swc/helpers" "0.5.2" + "@next/env" "14.2.3" + "@swc/helpers" "0.5.5" busboy "1.6.0" - caniuse-lite "^1.0.30001406" + caniuse-lite "^1.0.30001579" graceful-fs "^4.2.11" postcss "8.4.31" styled-jsx "5.1.1" - watchpack "2.4.0" optionalDependencies: - "@next/swc-darwin-arm64" "14.0.4" - "@next/swc-darwin-x64" "14.0.4" - "@next/swc-linux-arm64-gnu" "14.0.4" - "@next/swc-linux-arm64-musl" "14.0.4" - "@next/swc-linux-x64-gnu" "14.0.4" - "@next/swc-linux-x64-musl" "14.0.4" - "@next/swc-win32-arm64-msvc" "14.0.4" - "@next/swc-win32-ia32-msvc" "14.0.4" - "@next/swc-win32-x64-msvc" "14.0.4" + "@next/swc-darwin-arm64" "14.2.3" + "@next/swc-darwin-x64" "14.2.3" + "@next/swc-linux-arm64-gnu" "14.2.3" + "@next/swc-linux-arm64-musl" "14.2.3" + "@next/swc-linux-x64-gnu" "14.2.3" + "@next/swc-linux-x64-musl" "14.2.3" + "@next/swc-win32-arm64-msvc" "14.2.3" + "@next/swc-win32-ia32-msvc" "14.2.3" + "@next/swc-win32-x64-msvc" "14.2.3" ni18n@^1.1.0: version "1.1.0" @@ -16467,11 +19078,23 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" +node-abi@^3.45.0: + version "3.63.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.63.0.tgz#9bfbe68b87357f8b508554608b323e9b1052d045" + integrity sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw== + dependencies: + semver "^7.3.5" + node-abort-controller@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" @@ -16482,6 +19105,13 @@ node-addon-api@^6.1.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== +node-api-version@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.2.0.tgz#5177441da2b1046a4d4547ab9e0972eed7b1ac1d" + integrity sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg== + dependencies: + semver "^7.3.5" + node-emoji@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" @@ -16537,6 +19167,23 @@ node-gyp@^10.0.0, node-gyp@^10.0.1: tar "^6.1.2" which "^4.0.0" +node-gyp@^9.0.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -16566,6 +19213,13 @@ node-version@^1.0.0: resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ== +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + nopt@^7.0.0, nopt@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" @@ -16613,6 +19267,13 @@ normalize-package-data@^6.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -16623,6 +19284,11 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + normalize-url@^8.0.0: version "8.0.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" @@ -16856,7 +19522,7 @@ npm@^10.5.0: which "^4.0.0" write-file-atomic "^5.0.1" -npmlog@^6.0.2: +npmlog@^6.0.0, npmlog@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== @@ -16883,6 +19549,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nwsapi@^2.2.2: + version "2.2.10" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" + integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== + nx-cloud@16.3.0: version "16.3.0" resolved "https://registry.yarnpkg.com/nx-cloud/-/nx-cloud-16.3.0.tgz#f916c0be1d7eb5d017d542fea349e09893502ee9" @@ -17002,6 +19673,11 @@ nx@18.2.1, "nx@>=17.1.2 < 19": "@nx/nx-win32-arm64-msvc" "18.2.1" "@nx/nx-win32-x64-msvc" "18.2.1" +oauth4webapi@^2.4.0: + version "2.10.4" + resolved "https://registry.yarnpkg.com/oauth4webapi/-/oauth4webapi-2.10.4.tgz#4194b784e0ff995edd64bd90177fd7f25b7fbb17" + integrity sha512-DSoj8QoChzOCQlJkRmYxAJCIpnXFW32R0Uq7avyghIeB6iJq0XAblOD7pcq3mx4WEBDwMuKr0Y1qveCBleG2Xw== + object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1, object-assign@latest: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -17017,6 +19693,11 @@ object-inspect@^1.12.3, object-inspect@^1.6.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" @@ -17030,6 +19711,16 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object.assign@^4.1.2, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" @@ -17040,6 +19731,15 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.entries@^1.1.5: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + object.entries@^1.1.6, object.entries@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" @@ -17153,7 +19853,7 @@ opencollective-postinstall@^2.0.3: resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== -opener@^1.5.1: +opener@^1.5.1, opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== @@ -17196,7 +19896,7 @@ ora@5.3.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" -ora@5.4.1, ora@^5.4.1: +ora@5.4.1, ora@^5.1.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -17241,6 +19941,11 @@ outpipe@^1.1.0: dependencies: shell-quote "^1.4.2" +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + p-each-series@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-3.0.0.tgz#d1aed5e96ef29864c897367a7d2a628fdc960806" @@ -17270,7 +19975,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -17298,6 +20003,13 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -17439,11 +20151,19 @@ pako@^2.1.0: resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== -pako@~1.0.5: +pako@~1.0.2, pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -17566,7 +20286,7 @@ parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^7.0.0: +parse5@^7.0.0, parse5@^7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== @@ -17578,6 +20298,14 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + path-browserify@^1.0.0, path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -17810,6 +20538,13 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -17817,6 +20552,15 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" +plist@^3.0.4, plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + pluralize@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" @@ -17843,6 +20587,11 @@ portfinder@^1.0.28: debug "^3.2.7" mkdirp "^0.5.6" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-calc@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" @@ -17986,6 +20735,11 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + postcss-modules-local-by-default@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" @@ -17995,6 +20749,15 @@ postcss-modules-local-by-default@^4.0.3: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + postcss-modules-scope@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" @@ -18002,6 +20765,13 @@ postcss-modules-scope@^3.0.0: dependencies: postcss-selector-parser "^6.0.4" +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== + dependencies: + postcss-selector-parser "^6.0.4" + postcss-modules-values@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" @@ -18146,6 +20916,15 @@ postcss@8.4.31, postcss@^8.4.14, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4. picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.33: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" @@ -18195,6 +20974,18 @@ postgres-range@^1.1.1: resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.3.tgz#9ccd7b01ca2789eb3c2e0888b3184225fa859f76" integrity sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g== +preact-render-to-string@5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz#23d17376182af720b1060d5a4099843c7fe92fe4" + integrity sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA== + dependencies: + pretty-format "^3.8.0" + +preact@10.11.3: + version "10.11.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" + integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== + prebuild-install@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" @@ -18254,6 +21045,11 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" +prettier@*, prettier@^3.0.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.0.tgz#d173ea0524a691d4c0b1181752f2b46724328cdf" + integrity sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g== + prettier@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" @@ -18269,6 +21065,14 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + pretty-format@29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" @@ -18287,24 +21091,29 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7" - integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw== +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== +pretty-format@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7" + integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw== dependencies: "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" + integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== + pretty-quick@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-4.0.0.tgz#ea5cce85a5804bfbec7327b0e064509155d03f39" @@ -18381,6 +21190,14 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + promzard@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" @@ -18587,6 +21404,11 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + quick-lru@^6.1.1: version "6.1.2" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-6.1.2.tgz#e9a90524108629be35287d0b864e7ad6ceb3659e" @@ -18715,13 +21537,15 @@ react-hook-form@^7.42.1: resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.46.0.tgz#dba3491e4bc0968346e5615d9d669af780b47cd4" integrity sha512-sc22pXwuKgbWBR5/EYWOVoFw4i/w893tDRUgQY2/Xb7wlpajJBrqAMFhb4z1CDhZ0TSFFfX62+iKx3gCXnCHHw== -react-i18next@^13.3.1: - version "13.3.1" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.3.1.tgz#9b072bf4dd4cafb028e92315a8a1415f8034bdca" - integrity sha512-JAtYREK879JXaN9GdzfBI4yJeo/XyLeXWUsRABvYXiFUakhZJ40l+kaTo+i+A/3cKIED41kS/HAbZ5BzFtq/Og== - dependencies: - "@babel/runtime" "^7.22.5" - html-parse-stringify "^3.0.1" +react-icons@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.2.0.tgz#790c92d5f1888ef2dbbd3468c553fd4bb5c8bf7e" + integrity sha512-n52Y7Eb4MgQZHsSZOhSXv1zs2668/hBYKfSRIvKh42yExjyhZu0d1IK2CLLZ3BZB1oo13lDfwx2vOh2z9FTV6Q== + +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" @@ -18779,6 +21603,11 @@ react-redux@^7.2.0: prop-types "^15.7.2" react-is "^17.0.2" +react-refresh@^0.14.0: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + react-remove-scroll-bar@^2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" @@ -18809,6 +21638,29 @@ react-remove-scroll@2.5.5: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-router-dom@^6.16.0: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" + integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== + dependencies: + "@remix-run/router" "1.16.1" + react-router "6.23.1" + +react-router@6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.1.tgz#d08cbdbd9d6aedc13eea6e94bc6d9b29cb1c4be9" + integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== + dependencies: + "@remix-run/router" "1.16.1" + +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + react-style-singleton@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" @@ -18818,6 +21670,15 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" +react-test-renderer@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.3.1.tgz#e693608a1f96283400d4a3afead6893f958b80b4" + integrity sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA== + dependencies: + react-is "^18.3.1" + react-shallow-renderer "^16.15.0" + scheduler "^0.23.2" + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -18825,6 +21686,13 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" +read-binary-file-arch@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz#959c4637daa932280a9b911b1a6766a7e44288fc" + integrity sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg== + dependencies: + debug "^4.3.4" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -18837,6 +21705,18 @@ read-cmd-shim@4.0.0, read-cmd-shim@^4.0.0: resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== +read-config-file@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" + integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== + dependencies: + config-file-ts "^0.2.4" + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + read-only-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" @@ -18982,6 +21862,13 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + recoil@^0.7.7: version "0.7.7" resolved "https://registry.yarnpkg.com/recoil/-/recoil-0.7.7.tgz#c5f2c843224384c9c09e4a62c060fb4c1454dc8e" @@ -19066,6 +21953,16 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0: define-properties "^1.2.0" functions-have-names "^1.2.3" +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -19092,6 +21989,27 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -19133,6 +22051,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -19210,6 +22133,22 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -19257,6 +22196,13 @@ rimraf@^4.4.1: dependencies: glob "^9.2.0" +rimraf@^5.0.1: + version "5.0.7" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" + integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== + dependencies: + glob "^10.3.7" + rimraf@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" @@ -19279,6 +22225,18 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + rollup@2.78.0: version "2.78.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.0.tgz#00995deae70c0f712ea79ad904d5f6b033209d9e" @@ -19298,6 +22256,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +runtime-required@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/runtime-required/-/runtime-required-1.1.0.tgz#a000a50c2748dba123f4dac5105e66d4599519c4" + integrity sha512-yX97f5E0WfNpcQnfVjap6vzQcvErkYYCx6eTK4siqGEdC8lglwypUFgZVTX7ShvIlgfkC4XGFl9O1KTYcff0pw== + rxjs@7.8.1, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.8.0, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" @@ -19320,8 +22283,18 @@ safe-array-concat@^1.0.1: resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -19354,12 +22327,21 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-filename@^1.6.1: +sanitize-filename@^1.6.1, sanitize-filename@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== @@ -19374,6 +22356,13 @@ sass-loader@^12.2.0: klona "^2.0.4" neo-async "^2.6.2" +sass-loader@^13.3.2: + version "13.3.3" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133" + integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA== + dependencies: + neo-async "^2.6.2" + sass@^1.42.1: version "1.66.1" resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" @@ -19383,11 +22372,27 @@ sass@^1.42.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sass@^1.67.0: + version "1.77.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.4.tgz#92059c7bfc56b827c56eb116778d157ec017a5cd" + integrity sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -19395,6 +22400,22 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +schema-utils@^2.0.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" @@ -19404,7 +22425,7 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0, schema-utils@^4.0.1: +schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== @@ -19508,7 +22529,7 @@ semver-regex@^4.0.5: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-4.0.5.tgz#fbfa36c7ba70461311f5debcb3928821eb4f9180" integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw== -"semver@2 || 3 || 4 || 5", semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -19548,11 +22569,16 @@ semver@7.5.4, semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.2.1: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + semver@^7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" @@ -19579,6 +22605,13 @@ send@0.18.0, send@latest: range-parser "~1.2.1" statuses "2.0.1" +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + serialize-error@^8.0.1: version "8.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" @@ -19621,6 +22654,18 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" @@ -19630,6 +22675,11 @@ set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -19783,6 +22833,27 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simple-update-notifier@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + skin-tone@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" @@ -19886,7 +22957,7 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -smart-buffer@^4.2.0: +smart-buffer@^4.0.2, smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -19970,6 +23041,11 @@ sort-keys@^4.0.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + source-map-loader@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.2.tgz#af23192f9b344daa729f6772933194cc5fa54fee" @@ -19995,7 +23071,7 @@ source-map-support@0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@0.5.21, source-map-support@^0.5.21, source-map-support@~0.5.20: +source-map-support@0.5.21, source-map-support@^0.5.19, source-map-support@^0.5.21, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -20003,7 +23079,7 @@ source-map-support@0.5.21, source-map-support@^0.5.21, source-map-support@~0.5.2 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.7.4, source-map@^0.7.3: +source-map@0.7.4, source-map@^0.7.3, source-map@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== @@ -20115,7 +23191,7 @@ split@^1.0.0, split@^1.0.1: dependencies: through "2" -sprintf-js@^1.1.3: +sprintf-js@^1.1.2, sprintf-js@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== @@ -20154,7 +23230,7 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -ssri@^9.0.1: +ssri@^9.0.0, ssri@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== @@ -20180,6 +23256,11 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + static-eval@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" @@ -20370,6 +23451,16 @@ string.prototype.trim@^1.2.7: define-properties "^1.1.4" es-abstract "^1.20.4" +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" @@ -20379,6 +23470,15 @@ string.prototype.trimend@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string.prototype.trimstart@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" @@ -20388,6 +23488,15 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -20483,6 +23592,11 @@ style-loader@^3.3.0: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== +style-loader@^3.3.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" @@ -20537,6 +23651,13 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -20598,6 +23719,19 @@ svgo@^3.0.2: csso "^5.0.5" picocolors "^1.0.0" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" @@ -20643,7 +23777,12 @@ tailwindcss@^3.1.8: resolve "^1.22.2" sucrase "^3.32.0" -tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: +tapable@^0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + integrity sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -20711,7 +23850,7 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -tar@^6.2.0: +tar@^6.0.5, tar@^6.1.12, tar@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== @@ -20745,6 +23884,14 @@ temp-dir@^3.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + tempfile@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" @@ -20782,6 +23929,17 @@ tempy@^3.0.0: type-fest "^2.12.2" unique-string "^3.0.0" +terser-webpack-plugin@*, terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.9: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: version "5.3.9" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" @@ -20793,6 +23951,16 @@ terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" +terser@^5.10.0, terser@^5.26.0: + version "5.31.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" + integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + terser@^5.16.8: version "5.19.3" resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" @@ -20898,11 +24066,23 @@ tiny-relative-date@^1.3.0: resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== +tiny-typed-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5" + integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA== + tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -20910,6 +24090,11 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + tmp@^0.2.1, tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -20944,6 +24129,21 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tough-cookie@^4.1.2: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + tough-cookie@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" @@ -20954,6 +24154,13 @@ tough-cookie@^4.1.3: universalify "^0.2.0" url-parse "^1.5.3" +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -21003,6 +24210,20 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-jest@^29.1.1: + version "29.1.4" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.4.tgz#26f8a55ce31e4d2ef7a1fd47dc7fa127e92793ef" + integrity sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + ts-loader@^9.3.1: version "9.4.4" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" @@ -21013,6 +24234,17 @@ ts-loader@^9.3.1: micromatch "^4.0.0" semver "^7.3.4" +ts-loader@^9.4.4: + version "9.5.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" + integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + source-map "^0.7.4" + ts-morph@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-18.0.0.tgz#b9e7a898ea115064585a8a775d86da6edc9c5b4e" @@ -21040,7 +24272,7 @@ ts-node@10.9.1, ts-node@^10.8.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-node@^10.9.2: +ts-node@^10.9.1, ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -21068,6 +24300,15 @@ tsconfig-paths-webpack-plugin@4.0.0: enhanced-resolve "^5.7.0" tsconfig-paths "^4.0.0" +tsconfig-paths-webpack-plugin@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz#3c6892c5e7319c146eee1e7302ed9e6f2be4f763" + integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.1.2" + tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -21158,6 +24399,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" @@ -21203,7 +24449,7 @@ type-fest@^1.0.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^2.12.2: +type-fest@^2.12.2, type-fest@^2.17.0: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== @@ -21250,6 +24496,15 @@ typed-array-buffer@^1.0.0: get-intrinsic "^1.2.1" is-typed-array "^1.1.10" +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + typed-array-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" @@ -21260,6 +24515,17 @@ typed-array-byte-length@^1.0.0: has-proto "^1.0.1" is-typed-array "^1.1.10" +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + typed-array-byte-offset@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" @@ -21271,6 +24537,18 @@ typed-array-byte-offset@^1.0.0: has-proto "^1.0.1" is-typed-array "^1.1.10" +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -21280,6 +24558,18 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + typed-assert@^1.0.8: version "1.0.9" resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" @@ -21312,6 +24602,11 @@ typescript@^4.9.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.3.3: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + uglify-js@^3.1.4: version "3.17.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" @@ -21411,6 +24706,13 @@ unique-filename@^1.1.1: dependencies: unique-slug "^2.0.0" +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -21425,6 +24727,13 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + unique-slug@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" @@ -21451,6 +24760,11 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -21466,6 +24780,13 @@ unix-crypt-td-js@^1.1.4: resolved "https://registry.yarnpkg.com/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz#4912dfad1c8aeb7d20fa0a39e4c31918c1d5d5dd" integrity sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw== +unixify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== + dependencies: + normalize-path "^2.1.1" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -21476,6 +24797,15 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +unzip-crx-3@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz#d5324147b104a8aed9ae8639c95521f6f7cda292" + integrity sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ== + dependencies: + jszip "^3.1.0" + mkdirp "^0.5.1" + yaku "^0.16.6" + upath@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" @@ -21606,6 +24936,11 @@ util@~0.12.0: is-typed-array "^1.1.3" which-typed-array "^1.1.2" +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -21700,11 +25035,6 @@ vm-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - vscode-languageserver-textdocument@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" @@ -21728,6 +25058,13 @@ vue-eslint-parser@^9.1.0: lodash "^4.17.21" semver "^7.3.6" +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + walk-up-path@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" @@ -21747,6 +25084,16 @@ warning@^4.0.2: dependencies: loose-envify "^1.0.0" +watchboy@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/watchboy/-/watchboy-0.4.3.tgz#4b766e7923d8122e5811a6b9736a8e3e5943838c" + integrity sha512-GHs1HxwvxSMBsqd/WfTOZhj5gBdMqf5HQpfgtKxDfZRxrlYPDdVLRB61LCeRzJaWANmvSIMlfmRVDwVmJFgAKA== + dependencies: + lodash.difference "^4.5.0" + micromatch "^4.0.2" + pify "^4.0.1" + unixify "^1.0.0" + watchify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/watchify/-/watchify-4.0.0.tgz#53b002d51e7b0eb640b851bb4de517a689973392" @@ -21760,7 +25107,7 @@ watchify@^4.0.0: through2 "^4.0.2" xtend "^4.0.2" -watchpack@2.4.0, watchpack@^2.4.0: +watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -21768,6 +25115,14 @@ watchpack@2.4.0, watchpack@^2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" @@ -21787,7 +25142,49 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webpack-dev-middleware@^5.3.1: +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +webpack-bundle-analyzer@^4.9.1: + version "4.10.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + html-escaper "^2.0.2" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + +webpack-cli@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" + colorette "^2.0.14" + commander "^10.0.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1, webpack-dev-middleware@^5.3.4: version "5.3.4" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== @@ -21798,6 +25195,42 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" +webpack-dev-server@^4.15.1: + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.4" + ws "^8.13.0" + webpack-dev-server@^4.9.3: version "4.15.1" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" @@ -21834,6 +25267,15 @@ webpack-dev-server@^4.9.3: webpack-dev-middleware "^5.3.1" ws "^8.13.0" +webpack-merge@^5.7.3, webpack-merge@^5.9.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + webpack-merge@^5.8.0: version "5.9.0" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" @@ -21859,6 +25301,36 @@ webpack-subresource-integrity@^5.1.0: dependencies: typed-assert "^1.0.8" +webpack@^5, webpack@^5.88.2: + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.16.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + webpack@^5.80.0: version "5.88.2" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" @@ -21915,6 +25387,19 @@ whatwg-fetch@2.0.4: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -21973,6 +25458,17 @@ which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2, gopd "^1.0.1" has-tostringtag "^1.0.0" +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -22123,11 +25619,16 @@ write-pkg@4.0.0, write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@^7.0.0: +ws@^7.0.0, ws@^7.3.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.11.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + ws@^8.13.0: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" @@ -22138,11 +25639,21 @@ xdg-basedir@^5.0.1: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== -xmlbuilder@^15.1.1: +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: version "15.1.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xmldoc@^1.1.2: version "1.3.0" resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.3.0.tgz#7823225b096c74036347c9ec5924d06b6a3cebab" @@ -22165,6 +25676,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yaku@^0.16.6: + version "0.16.7" + resolved "https://registry.yarnpkg.com/yaku/-/yaku-0.16.7.tgz#1d195c78aa9b5bf8479c895b9504fd4f0847984e" + integrity sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -22190,7 +25706,7 @@ yaml@^2.1.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== -yargs-parser@21.1.1, yargs-parser@>=21.1.1, yargs-parser@^21.0.0, yargs-parser@^21.1.1: +yargs-parser@21.1.1, yargs-parser@>=21.1.1, yargs-parser@^21.0.0, yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== @@ -22210,7 +25726,7 @@ yargs-unparser@^2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@17.7.2, yargs@^17.0.0, yargs@^17.1.0, yargs@^17.5.0, yargs@^17.5.1, yargs@^17.6.2, yargs@^17.7.2: +yargs@17.7.2, yargs@^17.0.0, yargs@^17.0.1, yargs@^17.1.0, yargs@^17.3.1, yargs@^17.5.0, yargs@^17.5.1, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==