diff --git a/.github/workflows/copy-build-to-d2-ci.yml b/.github/workflows/copy-build-to-d2-ci.yml new file mode 100644 index 000000000..0681e7e91 --- /dev/null +++ b/.github/workflows/copy-build-to-d2-ci.yml @@ -0,0 +1,45 @@ +name: Copy build to d2-ci + +on: + push: + branches-ignore: + - master + - next + - next-major + - alpha + - beta + - '[0-9]+.x' + - '[0-9]+.x.x' + - '[0-9]+.[0-9]+.x' + +env: + GH_TOKEN: ${{secrets.DHIS2_BOT_GITHUB_TOKEN}} + +jobs: + copy-to-d2-ci: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + token: ${{env.GH_TOKEN}} + + - name: Set up Node.js + uses: actions/setup-node@v1 + with: + node-version: '16.x' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build package + run: yarn build + + - name: Pack and unpack the build to a directory named 'package' + run: yarn pack --filename output.tgz && tar -xzf output.tgz + + - name: Copy package to d2-ci + uses: dhis2/deploy-build@master + with: + build-dir: package + github-token: ${{env.GH_TOKEN}} diff --git a/.github/workflows/node-publish.yml b/.github/workflows/node-publish.yml index 5e04dd7ec..76aaddfaf 100644 --- a/.github/workflows/node-publish.yml +++ b/.github/workflows/node-publish.yml @@ -32,7 +32,7 @@ jobs: token: ${{env.GH_TOKEN}} - uses: actions/setup-node@v1 with: - node-version: 12.x + node-version: 16.x - name: Install run: yarn install --frozen-lockfile diff --git a/.github/workflows/node-test.yml b/.github/workflows/node-test.yml index 27930a8f7..efa5999b7 100644 --- a/.github/workflows/node-test.yml +++ b/.github/workflows/node-test.yml @@ -10,7 +10,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: 12.x + node-version: 16.x - name: Install run: yarn install --frozen-lockfile diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html new file mode 100644 index 000000000..965f8201c --- /dev/null +++ b/.storybook/preview-head.html @@ -0,0 +1,6 @@ + + + diff --git a/.tx/config b/.tx/config index 5b3223f33..9cff8d175 100644 --- a/.tx/config +++ b/.tx/config @@ -1,6 +1,6 @@ [main] host = https://www.transifex.com -lang_map = fa_AF: prs, uz@Cyrl: uz, uz@Latn: uz_Latn +lang_map = fa_AF: prs, uz@Cyrl: uz_UZ_Cyrl, uz@Latn: uz_UZ_Latn [o:hisp-uio:p:app-analytics:r:en-pot] file_filter = i18n/.po diff --git a/CHANGELOG.md b/CHANGELOG.md index cd3877d79..12c72ef7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,942 @@ +## [26.9.1](https://github.com/dhis2/analytics/compare/v26.9.0...v26.9.1) (2024-10-27) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([9a507a2](https://github.com/dhis2/analytics/commit/9a507a2236567597f0cda20e4a0fff9fc1d082f3)) + +# [26.9.0](https://github.com/dhis2/analytics/compare/v26.8.8...v26.9.0) (2024-10-22) + + +### Features + +* implement Single Value as a Highcharts.Chart instance and add offline exporting module ([#1698](https://github.com/dhis2/analytics/issues/1698)) ([40fdfba](https://github.com/dhis2/analytics/commit/40fdfba1c3041cb7cf57845aa101c8a64f0cd919)) + +## [26.8.8](https://github.com/dhis2/analytics/compare/v26.8.7...v26.8.8) (2024-10-20) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([f187092](https://github.com/dhis2/analytics/commit/f1870928b37733395d7f911f48ea7268fed97be1)) + +## [26.8.7](https://github.com/dhis2/analytics/compare/v26.8.6...v26.8.7) (2024-10-18) + + +### Bug Fixes + +* compute totals and cumulative values for numeric/boolean types respecting totalAggregationType (DHIS2-9155) ([#1700](https://github.com/dhis2/analytics/issues/1700)) ([a2bfd20](https://github.com/dhis2/analytics/commit/a2bfd203cb53f174106d8b570cea52cbfc6136f7)) + +## [26.8.6](https://github.com/dhis2/analytics/compare/v26.8.5...v26.8.6) (2024-10-06) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([60f505e](https://github.com/dhis2/analytics/commit/60f505e792cceafba9ba8275031fad82641d9411)) + +## [26.8.5](https://github.com/dhis2/analytics/compare/v26.8.4...v26.8.5) (2024-09-22) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([6285f9a](https://github.com/dhis2/analytics/commit/6285f9a43d7adf2b61bbe8bfbaae865380fb8b8a)) + +## [26.8.4](https://github.com/dhis2/analytics/compare/v26.8.3...v26.8.4) (2024-09-12) + + +### Bug Fixes + +* add translucent prop to CachedDataQueryProvider (DHIS2-18029) ([#1699](https://github.com/dhis2/analytics/issues/1699)) ([ae4dbe6](https://github.com/dhis2/analytics/commit/ae4dbe63add659b4a2d0c8aab543721b0a85ab60)) + +## [26.8.3](https://github.com/dhis2/analytics/compare/v26.8.2...v26.8.3) (2024-08-27) + + +### Bug Fixes + +* compute subtotals/totals for boolean types (DHIS2-9155) ([#1696](https://github.com/dhis2/analytics/issues/1696)) ([3392d78](https://github.com/dhis2/analytics/commit/3392d783b51dd8715beb09b673e567580005a0a2)) + +## [26.8.2](https://github.com/dhis2/analytics/compare/v26.8.1...v26.8.2) (2024-08-27) + + +### Bug Fixes + +* add AO TYPE for event chart and event report ([#1697](https://github.com/dhis2/analytics/issues/1697)) ([efff1c8](https://github.com/dhis2/analytics/commit/efff1c81845a974fe8c60b593e6bbe42c19682d7)) + +## [26.8.1](https://github.com/dhis2/analytics/compare/v26.8.0...v26.8.1) (2024-08-08) + + +### Bug Fixes + +* sort analytics request params and items for cache hit optimization (DHIS2-17861) ([#1695](https://github.com/dhis2/analytics/issues/1695)) ([80c9306](https://github.com/dhis2/analytics/commit/80c93068991aee21556f12960567cca7b594a324)) + +# [26.8.0](https://github.com/dhis2/analytics/compare/v26.7.9...v26.8.0) (2024-08-01) + + +### Features + +* pivot table as default vis type in DV ([#1694](https://github.com/dhis2/analytics/issues/1694)) ([ef6f6ab](https://github.com/dhis2/analytics/commit/ef6f6ab9a94b427af71c36af9f004c95660d8221)) + +## [26.7.9](https://github.com/dhis2/analytics/compare/v26.7.8...v26.7.9) (2024-07-24) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([9bc81ab](https://github.com/dhis2/analytics/commit/9bc81ab1bec16886ad48540f3a3828a97f841ce3)) + +## [26.7.8](https://github.com/dhis2/analytics/compare/v26.7.7...v26.7.8) (2024-07-12) + + +### Bug Fixes + +* do not call period generator with non-4-digit year (DHIS2-17707) ([#1690](https://github.com/dhis2/analytics/issues/1690)) ([f2f516d](https://github.com/dhis2/analytics/commit/f2f516de181f6413061a1bfce5606d7575e5e1f5)) + +## [26.7.7](https://github.com/dhis2/analytics/compare/v26.7.6...v26.7.7) (2024-07-08) + + +### Bug Fixes + +* remove duplicate @dhis2/multi-calendar-dates dependency ([#1689](https://github.com/dhis2/analytics/issues/1689)) ([3e5ece9](https://github.com/dhis2/analytics/commit/3e5ece9b59f45c5902a882dedc40fd1c28322e8a)) + +## [26.7.6](https://github.com/dhis2/analytics/compare/v26.7.5...v26.7.6) (2024-06-26) + + +### Bug Fixes + +* apply legend to all numeric and boolean types (DHIS2-17611) ([#1683](https://github.com/dhis2/analytics/issues/1683)) ([e93b106](https://github.com/dhis2/analytics/commit/e93b106f7e0b3ab9ebae8a21a07d5cebee3d48d3)) + +## [26.7.5](https://github.com/dhis2/analytics/compare/v26.7.4...v26.7.5) (2024-06-25) + + +### Bug Fixes + +* update multicalendar dep for translations (DHIS2-16904) ([#1685](https://github.com/dhis2/analytics/issues/1685)) ([b3a48ba](https://github.com/dhis2/analytics/commit/b3a48ba8cff9956468a2670c0dda16549247bd18)) + +## [26.7.4](https://github.com/dhis2/analytics/compare/v26.7.3...v26.7.4) (2024-06-20) + + +### Bug Fixes + +* **pivot-table:** use a scoped base selector and global sub selectors ([#1681](https://github.com/dhis2/analytics/issues/1681)) ([44b753a](https://github.com/dhis2/analytics/commit/44b753a5dc618d20e92a056691819ea5cee351b3)) + +## [26.7.3](https://github.com/dhis2/analytics/compare/v26.7.2...v26.7.3) (2024-06-16) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([4160138](https://github.com/dhis2/analytics/commit/41601383b5b918914757841791cd62c1a87ec135)) + +## [26.7.2](https://github.com/dhis2/analytics/compare/v26.7.1...v26.7.2) (2024-06-12) + + +### Bug Fixes + +* separator for hundreds, thousands and millions is missing in the Pie charts (DHIS2-16172) ([#1677](https://github.com/dhis2/analytics/issues/1677)) ([ad8c799](https://github.com/dhis2/analytics/commit/ad8c799187a8f143eb16a3f554e5e02afa4a4256)) + +## [26.7.1](https://github.com/dhis2/analytics/compare/v26.7.0...v26.7.1) (2024-06-09) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([5afb945](https://github.com/dhis2/analytics/commit/5afb945ce6a9efa4e748475ef51710272cd0f417)) + +# [26.7.0](https://github.com/dhis2/analytics/compare/v26.6.14...v26.7.0) (2024-06-06) + + +### Features + +* rich text and user mention components (DHIS2-15522) ([#1525](https://github.com/dhis2/analytics/issues/1525)) ([5681126](https://github.com/dhis2/analytics/commit/5681126100d7a8ad06a81cf3c0cd2db4841a1ae4)) + +## [26.6.14](https://github.com/dhis2/analytics/compare/v26.6.13...v26.6.14) (2024-06-03) + + +### Bug Fixes + +* numbers are misaligned in pivot table (DHIS2-16900) ([#1668](https://github.com/dhis2/analytics/issues/1668)) ([454f9a1](https://github.com/dhis2/analytics/commit/454f9a13cbd2ccabce70ffa2dd5fef2a4d8ea686)) + +## [26.6.13](https://github.com/dhis2/analytics/compare/v26.6.12...v26.6.13) (2024-05-31) + + +### Bug Fixes + +* generate correct link for line listing app in FileMenu (DHIS2-16018) ([#1669](https://github.com/dhis2/analytics/issues/1669)) ([c5c9135](https://github.com/dhis2/analytics/commit/c5c9135857343ddecf3c741904bdb2b86e6b000b)) + +## [26.6.12](https://github.com/dhis2/analytics/compare/v26.6.11...v26.6.12) (2024-05-26) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([2e7d587](https://github.com/dhis2/analytics/commit/2e7d5878f21c637ce8f277a01f122147d3163337)) + +## [26.6.11](https://github.com/dhis2/analytics/compare/v26.6.10...v26.6.11) (2024-05-19) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([cb31357](https://github.com/dhis2/analytics/commit/cb313574c4ece7a38823910bfc2d5653c7375ae7)) + +## [26.6.10](https://github.com/dhis2/analytics/compare/v26.6.9...v26.6.10) (2024-05-14) + + +### Bug Fixes + +* dimension list design (DHIS2-16270) ([#1530](https://github.com/dhis2/analytics/issues/1530)) ([e3931e6](https://github.com/dhis2/analytics/commit/e3931e68a1694b81640d0584a585746132ee74de)) + +## [26.6.9](https://github.com/dhis2/analytics/compare/v26.6.8...v26.6.9) (2024-05-08) + + +### Bug Fixes + +* system / user setting for display name not respected in Org Unit tree (DHIS2-15000) ([#1664](https://github.com/dhis2/analytics/issues/1664)) ([899358d](https://github.com/dhis2/analytics/commit/899358d5ea5a486f299ab54ded7b3184608e4bf7)) + +## [26.6.8](https://github.com/dhis2/analytics/compare/v26.6.7...v26.6.8) (2024-05-06) + + +### Bug Fixes + +* fix a crash when row totals is enabled (DHIS2-17297) ([#1660](https://github.com/dhis2/analytics/issues/1660)) ([be6ea56](https://github.com/dhis2/analytics/commit/be6ea56d1c733aba497d669184668f96e8ae344b)) + +## [26.6.7](https://github.com/dhis2/analytics/compare/v26.6.6...v26.6.7) (2024-05-05) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([cfc3e55](https://github.com/dhis2/analytics/commit/cfc3e55231fd84d0bd5b4eff8c8b9e5bc3e05480)) + +## [26.6.6](https://github.com/dhis2/analytics/compare/v26.6.5...v26.6.6) (2024-04-28) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([746dbb9](https://github.com/dhis2/analytics/commit/746dbb97a1bd58b7a921d3a470b113d20b19d2ac)) + +## [26.6.5](https://github.com/dhis2/analytics/compare/v26.6.4...v26.6.5) (2024-04-22) + + +### Bug Fixes + +* **interpretations:** plugin flashes when interacting with Interpretations modal ([#1608](https://github.com/dhis2/analytics/issues/1608)) ([e65e917](https://github.com/dhis2/analytics/commit/e65e917e32fcb28759a913ddc55d98478f6c4d27)) + +## [26.6.4](https://github.com/dhis2/analytics/compare/v26.6.3...v26.6.4) (2024-04-21) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([4b35e69](https://github.com/dhis2/analytics/commit/4b35e6910db17ddbd96b4030ee528b82f045b7e4)) + +## [26.6.3](https://github.com/dhis2/analytics/compare/v26.6.2...v26.6.3) (2024-04-19) + + +### Bug Fixes + +* **aboutAOUnit:** newlines missing in AO description ([#1655](https://github.com/dhis2/analytics/issues/1655)) ([98580ae](https://github.com/dhis2/analytics/commit/98580ae8c9a7b0cb723a4712bf2da953b2e6b613)) + +## [26.6.2](https://github.com/dhis2/analytics/compare/v26.6.1...v26.6.2) (2024-04-14) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([e1eae74](https://github.com/dhis2/analytics/commit/e1eae74a18eabd228c58a91fa19413d4e338c4cc)) + +## [26.6.1](https://github.com/dhis2/analytics/compare/v26.6.0...v26.6.1) (2024-03-24) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([6362f7e](https://github.com/dhis2/analytics/commit/6362f7ec35219997971531345fdde81021493129)) + +# [26.6.0](https://github.com/dhis2/analytics/compare/v26.5.0...v26.6.0) (2024-03-13) + + +### Features + +* add support for trackedEntities analytics requests (DHIS2-16023) ([#1594](https://github.com/dhis2/analytics/issues/1594)) ([885af10](https://github.com/dhis2/analytics/commit/885af10022a022b1204fa9be0efa868c70b210a7)) + +# [26.5.0](https://github.com/dhis2/analytics/compare/v26.4.1...v26.5.0) (2024-03-13) + + +### Features + +* add support for Outliers table vis type in DV (DHIS2-13858) ([#1598](https://github.com/dhis2/analytics/issues/1598)) ([d9b1ccd](https://github.com/dhis2/analytics/commit/d9b1ccd7529adccb8dd1579e881721d685e7cb1d)) + +## [26.4.1](https://github.com/dhis2/analytics/compare/v26.4.0...v26.4.1) (2024-03-05) + + +### Bug Fixes + +* interpretations panel renders with flashing when liking or unliking an interpretation ([#1600](https://github.com/dhis2/analytics/issues/1600)) ([bb32565](https://github.com/dhis2/analytics/commit/bb32565960a5f813aaac594b61edc2f9e53d6a4d)) +* use translated title and subtitle when available (DHIS2-16216) ([#1597](https://github.com/dhis2/analytics/issues/1597)) ([5a91391](https://github.com/dhis2/analytics/commit/5a91391272022aab14081ba65e0b103693e01daa)) + +# [26.4.0](https://github.com/dhis2/analytics/compare/v26.3.1...v26.4.0) (2024-03-04) + + +### Features + +* update interpretations component so it can be used in dashboard items ([#1510](https://github.com/dhis2/analytics/issues/1510)) ([163abf6](https://github.com/dhis2/analytics/commit/163abf60326a97248daa019c65b4658c78701780)) + +## [26.3.1](https://github.com/dhis2/analytics/compare/v26.3.0...v26.3.1) (2024-02-28) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([1f30bb2](https://github.com/dhis2/analytics/commit/1f30bb2db5d16c1cff95437006db64e6060ae3d2)) + +# [26.3.0](https://github.com/dhis2/analytics/compare/v26.2.4...v26.3.0) (2024-01-25) + + +### Features + +* add classname prop to hover-menu-dropdown ([57eb703](https://github.com/dhis2/analytics/commit/57eb703a4227e6496d021fdb17d6d4fd0e935eb9)) + +## [26.2.4](https://github.com/dhis2/analytics/compare/v26.2.3...v26.2.4) (2024-01-21) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([41aa57f](https://github.com/dhis2/analytics/commit/41aa57ff24e790b8db2e21d916b22fb03d6878b2)) + +## [26.2.3](https://github.com/dhis2/analytics/compare/v26.2.2...v26.2.3) (2024-01-19) + + +### Bug Fixes + +* adjust width of interpretation reply input when in focus [DHIS2-16429] ([#1607](https://github.com/dhis2/analytics/issues/1607)) ([14fbfb5](https://github.com/dhis2/analytics/commit/14fbfb5bbfbbaa430631d39b8ca77c68817f10a4)) + +## [26.2.2](https://github.com/dhis2/analytics/compare/v26.2.1...v26.2.2) (2024-01-02) + + +### Bug Fixes + +* add white-space css to preserve paragraphs in interpretations ([#1599](https://github.com/dhis2/analytics/issues/1599)) ([52ae98d](https://github.com/dhis2/analytics/commit/52ae98d3cadd975c2079055b00adba58f0982ef4)) + +## [26.2.1](https://github.com/dhis2/analytics/compare/v26.2.0...v26.2.1) (2023-12-24) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([bac4cc9](https://github.com/dhis2/analytics/commit/bac4cc94572b2e8367fb3d1f061eb7ed122f372f)) + +# [26.2.0](https://github.com/dhis2/analytics/compare/v26.1.8...v26.2.0) (2023-12-14) + + +### Features + +* implement cumulative values in PT engine (DHIS2-5497) ([#1567](https://github.com/dhis2/analytics/issues/1567)) ([2b404b4](https://github.com/dhis2/analytics/commit/2b404b423cfb49347bdf57125870bb7b55338322)) + +## [26.1.8](https://github.com/dhis2/analytics/compare/v26.1.7...v26.1.8) (2023-11-26) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([43a607b](https://github.com/dhis2/analytics/commit/43a607ba0310b19edd07d866f15337e736567b2f)) + +## [26.1.7](https://github.com/dhis2/analytics/compare/v26.1.6...v26.1.7) (2023-11-19) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([cb4a052](https://github.com/dhis2/analytics/commit/cb4a052a19ebdced3ea7b6ffb7d1c40064abac38)) + +## [26.1.6](https://github.com/dhis2/analytics/compare/v26.1.5...v26.1.6) (2023-11-07) + + +### Bug Fixes + +* use json+patch for PATCH requests ([#1593](https://github.com/dhis2/analytics/issues/1593)) ([bdb0b9c](https://github.com/dhis2/analytics/commit/bdb0b9ceaa5ef102ef9768038c763b70a3d5e7d1)) + +## [26.1.5](https://github.com/dhis2/analytics/compare/v26.1.4...v26.1.5) (2023-11-03) + + +### Bug Fixes + +* use correct colors in "basic" color set ([#1592](https://github.com/dhis2/analytics/issues/1592)) ([6356250](https://github.com/dhis2/analytics/commit/63562501bd8b020742bb7ee8b17621975790c3c6)) + +## [26.1.4](https://github.com/dhis2/analytics/compare/v26.1.3...v26.1.4) (2023-10-29) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([435e077](https://github.com/dhis2/analytics/commit/435e07717c586365dfa67ad9ffb8acd5167e9ea2)) + +## [26.1.3](https://github.com/dhis2/analytics/compare/v26.1.2...v26.1.3) (2023-10-22) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([0a250af](https://github.com/dhis2/analytics/commit/0a250af64b9df6bfd7334f6cf2ecc5d150003e2d)) + +## [26.1.2](https://github.com/dhis2/analytics/compare/v26.1.1...v26.1.2) (2023-10-18) + + +### Bug Fixes + +* handle both Set and array for currentUser.authorities when checking interpretations access (DHIS2-15964) ([d3d45ab](https://github.com/dhis2/analytics/commit/d3d45abd352a6b9609d732c24a718fef83b076c7)) +* interpretation panel display date and timestamps according to client time zone (DHIS2-15825) ([8e60f26](https://github.com/dhis2/analytics/commit/8e60f266bd55f8dee9745ad1930f6525e3ca96f3)) +* interpretations modal height (DHIS2-15558) ([014d43e](https://github.com/dhis2/analytics/commit/014d43e241d59e841f72d203f8b8f657516aa147)) +* show warning text below RichTextEditor when unable to show snapshot (DHIS2-15781) ([f27bc38](https://github.com/dhis2/analytics/commit/f27bc38e5cf47840971eb685f0ee705f174eadc0)) + +## [26.1.1](https://github.com/dhis2/analytics/compare/v26.1.0...v26.1.1) (2023-10-05) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([dd9c23f](https://github.com/dhis2/analytics/commit/dd9c23f34a0489cae89f5f5c10ab1dc17e2c13ef)) + +# [26.1.0](https://github.com/dhis2/analytics/compare/v26.0.21...v26.1.0) (2023-10-03) + + +### Features + +* **pivot-table:** truncate title and show full in tooltip ([#1579](https://github.com/dhis2/analytics/issues/1579)) ([c37ba2d](https://github.com/dhis2/analytics/commit/c37ba2d1a187963b3b5aeee5b951bcf9c129dcd2)) + +## [26.0.21](https://github.com/dhis2/analytics/compare/v26.0.20...v26.0.21) (2023-09-28) + + +### Bug Fixes + +* avoid crash in DV with some chart types DHIS2-15882 ([#1582](https://github.com/dhis2/analytics/issues/1582)) ([f6c89e1](https://github.com/dhis2/analytics/commit/f6c89e1481dbbc2ea2cfe80a3c9ed7f81a63c83c)) + +## [26.0.20](https://github.com/dhis2/analytics/compare/v26.0.19...v26.0.20) (2023-09-25) + + +### Bug Fixes + +* export function for preparing payload for copy DHIS2-15722 ([#1573](https://github.com/dhis2/analytics/issues/1573)) ([a1f8d69](https://github.com/dhis2/analytics/commit/a1f8d694121d62d001f7b4567d84d49ecec377fd)) + +## [26.0.19](https://github.com/dhis2/analytics/compare/v26.0.18...v26.0.19) (2023-09-15) + + +### Bug Fixes + +* use translated dimension labels in PT DHIS2-15750 ([#1572](https://github.com/dhis2/analytics/issues/1572)) ([492975e](https://github.com/dhis2/analytics/commit/492975e46d1570e7856ef217a9a28c3ede5c7fa5)) + +## [26.0.18](https://github.com/dhis2/analytics/compare/v26.0.17...v26.0.18) (2023-09-13) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([e4f95e9](https://github.com/dhis2/analytics/commit/e4f95e9147a337f9a675ffebff641ea5bd9a0430)) + +## [26.0.17](https://github.com/dhis2/analytics/compare/v26.0.16...v26.0.17) (2023-08-28) + + +### Bug Fixes + +* use correct aggregation type if numberType undefined DHIS2-15698 ([#1564](https://github.com/dhis2/analytics/issues/1564)) ([c740e32](https://github.com/dhis2/analytics/commit/c740e320be568cce4430afaab688dd52ced83fa3)) + +## [26.0.16](https://github.com/dhis2/analytics/compare/v26.0.15...v26.0.16) (2023-08-18) + + +### Bug Fixes + +* avoid undefined in totals DHIS2-14511 ([#1552](https://github.com/dhis2/analytics/issues/1552)) ([d93bc3e](https://github.com/dhis2/analytics/commit/d93bc3e35c560aac7e64b3db8196032201686d3a)) + +## [26.0.15](https://github.com/dhis2/analytics/compare/v26.0.14...v26.0.15) (2023-07-27) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([1ab2bca](https://github.com/dhis2/analytics/commit/1ab2bcad7a0bf77f92d7ca838e759921b63dd3cc)) + +## [26.0.14](https://github.com/dhis2/analytics/compare/v26.0.13...v26.0.14) (2023-07-13) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([46de5ca](https://github.com/dhis2/analytics/commit/46de5ca48bafe36c858fbd1eda6032c8dfb2a5bd)) + +## [26.0.13](https://github.com/dhis2/analytics/compare/v26.0.12...v26.0.13) (2023-07-08) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([8e50465](https://github.com/dhis2/analytics/commit/8e5046501726bd6077f6b1c509471c9f99396bb1)) + +## [26.0.12](https://github.com/dhis2/analytics/compare/v26.0.11...v26.0.12) (2023-07-07) + + +### Bug Fixes + +* use correct access checks for showing interpretation reply, edit and delete buttons ([#1531](https://github.com/dhis2/analytics/issues/1531)) ([bf70361](https://github.com/dhis2/analytics/commit/bf703619cb773354e5665543fda36513f7edc6ce)) + +## [26.0.11](https://github.com/dhis2/analytics/compare/v26.0.10...v26.0.11) (2023-07-06) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([7a15f93](https://github.com/dhis2/analytics/commit/7a15f939180edd69b849bd0ab661024d924bc038)) + +## [26.0.10](https://github.com/dhis2/analytics/compare/v26.0.9...v26.0.10) (2023-07-04) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([96947a6](https://github.com/dhis2/analytics/commit/96947a62ed74433111d2eb4ddf2f3eafa734be6a)) + +## [26.0.9](https://github.com/dhis2/analytics/compare/v26.0.8...v26.0.9) (2023-07-03) + + +### Bug Fixes + +* use visual feedback on action buttons ([#1532](https://github.com/dhis2/analytics/issues/1532)) ([d6287c8](https://github.com/dhis2/analytics/commit/d6287c8cdb1162336f52259dab727724e8baed4b)) +* **translations:** sync translations from transifex (master) ([5dd498c](https://github.com/dhis2/analytics/commit/5dd498c846d6d4bedc0cf81b43cc3949339103bd)) + +## [26.0.8](https://github.com/dhis2/analytics/compare/v26.0.7...v26.0.8) (2023-06-29) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([f3b1c8f](https://github.com/dhis2/analytics/commit/f3b1c8f6d293e104ec9848ac5128857af4dccc70)) + +## [26.0.7](https://github.com/dhis2/analytics/compare/v26.0.6...v26.0.7) (2023-06-28) + + +### Bug Fixes + +* decrease padding left/right to 12px for dense hover menu list item ([#1523](https://github.com/dhis2/analytics/issues/1523)) ([c9b7beb](https://github.com/dhis2/analytics/commit/c9b7bebb4e380ae974c2c35c6736290b5ff7ae44)) + +## [26.0.6](https://github.com/dhis2/analytics/compare/v26.0.5...v26.0.6) (2023-06-27) + + +### Bug Fixes + +* various issues related to the new toolbar ([#1522](https://github.com/dhis2/analytics/issues/1522)) ([d4a96e9](https://github.com/dhis2/analytics/commit/d4a96e943e688718f391e2bae9c6240bbe198eaf)) + +## [26.0.5](https://github.com/dhis2/analytics/compare/v26.0.4...v26.0.5) (2023-06-27) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([17853e0](https://github.com/dhis2/analytics/commit/17853e02b6357e4d409ce2c124bc9640fa9bcf7b)) + +## [26.0.4](https://github.com/dhis2/analytics/compare/v26.0.3...v26.0.4) (2023-06-24) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([7d12e06](https://github.com/dhis2/analytics/commit/7d12e06767ba234bb3a6203ca08e2ef4cef6ebff)) + +## [26.0.3](https://github.com/dhis2/analytics/compare/v26.0.2...v26.0.3) (2023-06-23) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([d8f3864](https://github.com/dhis2/analytics/commit/d8f3864261cadef8f0a9609257eece49a8e9874b)) + +## [26.0.2](https://github.com/dhis2/analytics/compare/v26.0.1...v26.0.2) (2023-06-22) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([28f2996](https://github.com/dhis2/analytics/commit/28f299634a93fb422329720d6caf78e3a52955da)) + +## [26.0.1](https://github.com/dhis2/analytics/compare/v26.0.0...v26.0.1) (2023-06-21) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([3bc8f34](https://github.com/dhis2/analytics/commit/3bc8f34af26684653efc90dd2349a5c2358776a6)) + +# [26.0.0](https://github.com/dhis2/analytics/compare/v25.2.3...v26.0.0) (2023-06-20) + + +### Features + +* toolbar UI update with hoverable menu ([#1478](https://github.com/dhis2/analytics/issues/1478)) ([#1509](https://github.com/dhis2/analytics/issues/1509)) ([0a51153](https://github.com/dhis2/analytics/commit/0a5115327c0c0dbe9da22a092f2fc6002f798290)) + + +### BREAKING CHANGES + +* The `FileMenu` is now using the new `HoverMenuBar` components which makes this version of the `FileMenu` incompatible with the previous version. Apps will be need to update their toolbar and file menu before using this version of analytics. + +## [25.2.3](https://github.com/dhis2/analytics/compare/v25.2.2...v25.2.3) (2023-06-20) + + +### Bug Fixes + +* avoid DV plugin crash if no ou levels are returned ([#1442](https://github.com/dhis2/analytics/issues/1442)) ([5296bd7](https://github.com/dhis2/analytics/commit/5296bd79104dbd914daa8242deda69ce150b355e)) + +## [25.2.2](https://github.com/dhis2/analytics/compare/v25.2.1...v25.2.2) (2023-06-20) + + +### Reverts + +* Revert "feat: toolbar UI update with hoverable menu (#1478)" ([c55346c](https://github.com/dhis2/analytics/commit/c55346c3e91dee98337d129056545afc1e4e712f)), closes [#1478](https://github.com/dhis2/analytics/issues/1478) + +## [25.2.1](https://github.com/dhis2/analytics/compare/v25.2.0...v25.2.1) (2023-06-20) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([dca78c0](https://github.com/dhis2/analytics/commit/dca78c07410845f13b7b8a51d7d0dacbc462d428)) + +# [25.2.0](https://github.com/dhis2/analytics/compare/v25.1.22...v25.2.0) (2023-06-19) + + +### Features + +* toolbar UI update with hoverable menu ([#1478](https://github.com/dhis2/analytics/issues/1478)) ([5526163](https://github.com/dhis2/analytics/commit/552616368677aed228ef3f53eef30d02ec183d72)) + +## [25.1.22](https://github.com/dhis2/analytics/compare/v25.1.21...v25.1.22) (2023-06-19) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([df3fa78](https://github.com/dhis2/analytics/commit/df3fa786b9ac60ba58a018f9c33baa689761a1f7)) + +## [25.1.21](https://github.com/dhis2/analytics/compare/v25.1.20...v25.1.21) (2023-06-18) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([90ed63c](https://github.com/dhis2/analytics/commit/90ed63cb551e4b6f7d5ff8f46e62e2117458f70f)) + +## [25.1.20](https://github.com/dhis2/analytics/compare/v25.1.19...v25.1.20) (2023-06-17) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([7b62a96](https://github.com/dhis2/analytics/commit/7b62a962501d791be3bc2c4d9a71d35f43ab8eb5)) + +## [25.1.19](https://github.com/dhis2/analytics/compare/v25.1.18...v25.1.19) (2023-06-16) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([a0626ac](https://github.com/dhis2/analytics/commit/a0626acbe00ad9e9ed551cd31209267a6814dcce)) + +## [25.1.18](https://github.com/dhis2/analytics/compare/v25.1.17...v25.1.18) (2023-06-15) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([8e15164](https://github.com/dhis2/analytics/commit/8e1516498f76e95b3c10a4c79df979361fb4e7d1)) + +## [25.1.17](https://github.com/dhis2/analytics/compare/v25.1.16...v25.1.17) (2023-06-14) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([1b667dc](https://github.com/dhis2/analytics/commit/1b667dc344457c100da0dec17c0f064fc8d242c9)) + +## [25.1.16](https://github.com/dhis2/analytics/compare/v25.1.15...v25.1.16) (2023-06-13) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([f0d63a7](https://github.com/dhis2/analytics/commit/f0d63a7e8fc086d23f5c8775a9ffefacb2240657)) + +## [25.1.15](https://github.com/dhis2/analytics/compare/v25.1.14...v25.1.15) (2023-06-12) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([f98c7fc](https://github.com/dhis2/analytics/commit/f98c7fc8ce624f1ee6d1f32b93f7327b4f8358aa)) + +## [25.1.14](https://github.com/dhis2/analytics/compare/v25.1.13...v25.1.14) (2023-06-11) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([6706b1e](https://github.com/dhis2/analytics/commit/6706b1e27f243db13e05168ec467828f8f238784)) + +## [25.1.13](https://github.com/dhis2/analytics/compare/v25.1.12...v25.1.13) (2023-06-10) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([b8de3e3](https://github.com/dhis2/analytics/commit/b8de3e3e90d53214a7ffd662255918bb7e5efc4e)) + +## [25.1.12](https://github.com/dhis2/analytics/compare/v25.1.11...v25.1.12) (2023-06-09) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([53fd300](https://github.com/dhis2/analytics/commit/53fd3007f71cae4bd8dc99d84af44d5c954ebc99)) + +## [25.1.11](https://github.com/dhis2/analytics/compare/v25.1.10...v25.1.11) (2023-06-05) + + +### Bug Fixes + +* add data-test to SV icon ([#1479](https://github.com/dhis2/analytics/issues/1479)) ([df1c7ef](https://github.com/dhis2/analytics/commit/df1c7efb3136be99b5026b252a499ba0bb57ecd9)) + +## [25.1.10](https://github.com/dhis2/analytics/compare/v25.1.9...v25.1.10) (2023-05-30) + + +### Bug Fixes + +* single value size and position issues (DHIS2-15344) ([#1470](https://github.com/dhis2/analytics/issues/1470)) ([d94fe02](https://github.com/dhis2/analytics/commit/d94fe02c7cc85a6b4aca41c85ba60ed37871b645)) + +## [25.1.9](https://github.com/dhis2/analytics/compare/v25.1.8...v25.1.9) (2023-05-30) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([9466322](https://github.com/dhis2/analytics/commit/9466322c7cac471ee1d5bd1e451f911968e30a3d)) + +## [25.1.8](https://github.com/dhis2/analytics/compare/v25.1.7...v25.1.8) (2023-05-28) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([184740d](https://github.com/dhis2/analytics/commit/184740d3bdc019e8ab9eb8b05f4f473fcf960889)) + +## [25.1.7](https://github.com/dhis2/analytics/compare/v25.1.6...v25.1.7) (2023-05-27) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([83d2c2b](https://github.com/dhis2/analytics/commit/83d2c2bda1160b7c474d9d29596cfccdbeb72c81)) + +## [25.1.6](https://github.com/dhis2/analytics/compare/v25.1.5...v25.1.6) (2023-05-26) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([c901006](https://github.com/dhis2/analytics/commit/c9010067004c5c3061cfa76806ffd991394bda98)) + +## [25.1.5](https://github.com/dhis2/analytics/compare/v25.1.4...v25.1.5) (2023-05-25) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([9c3165e](https://github.com/dhis2/analytics/commit/9c3165ee58559c6c3601b0e12ee7d4796fa9b12f)) + +## [25.1.4](https://github.com/dhis2/analytics/compare/v25.1.3...v25.1.4) (2023-05-24) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([0faecef](https://github.com/dhis2/analytics/commit/0faecefb62fc285110d76bf60a9382af156b1c85)) + +## [25.1.3](https://github.com/dhis2/analytics/compare/v25.1.2...v25.1.3) (2023-05-23) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([869543f](https://github.com/dhis2/analytics/commit/869543f14a03d6bcfad8e009ab9ac4bc87d16de1)) + +## [25.1.2](https://github.com/dhis2/analytics/compare/v25.1.1...v25.1.2) (2023-05-03) + + +### Bug Fixes + +* small cosmetic fixes to SV SVG ([#1457](https://github.com/dhis2/analytics/issues/1457)) ([2785a9e](https://github.com/dhis2/analytics/commit/2785a9e3e7c656d830df78c84c4ef29de74b0614)) + +## [25.1.1](https://github.com/dhis2/analytics/compare/v25.1.0...v25.1.1) (2023-05-02) + + +### Bug Fixes + +* address various SV SVG issues after KFMT ([#1456](https://github.com/dhis2/analytics/issues/1456)) ([f0ee1f1](https://github.com/dhis2/analytics/commit/f0ee1f16450e1b6de7c879c8ecdeec7c1d7c89fb)) + +# [25.1.0](https://github.com/dhis2/analytics/compare/v25.0.0...v25.1.0) (2023-04-27) + + +### Features + +* icon in SV visualization DHIS2-10496 ([#1440](https://github.com/dhis2/analytics/issues/1440)) ([e6563ca](https://github.com/dhis2/analytics/commit/e6563cacc5e901a04d5432330b09b685936ddd70)) + +# [25.0.0](https://github.com/dhis2/analytics/compare/v24.10.1...v25.0.0) (2023-04-24) + + +### Features + +* custom calculations (DHIS2-13871) ([#1370](https://github.com/dhis2/analytics/issues/1370)) ([d174e3e](https://github.com/dhis2/analytics/commit/d174e3e8a1dd1ea756cf42eaf7748b2135151e57)) + + +### BREAKING CHANGES + +* requires metadata to be provided for the new EDI dimension type + +## [24.10.1](https://github.com/dhis2/analytics/compare/v24.10.0...v24.10.1) (2023-04-24) + + +### Bug Fixes + +* sv size when downloading is a small square (DHIS2-15178) ([245d799](https://github.com/dhis2/analytics/commit/245d799d9513e0407e4a6b6ba24c3da15754618d)) + +# [24.10.0](https://github.com/dhis2/analytics/compare/v24.9.3...v24.10.0) (2023-04-19) + + +### Features + +* single value background color change based upon legend (DHIS2-13702) part 2 ([#1453](https://github.com/dhis2/analytics/issues/1453)) ([d32c7b8](https://github.com/dhis2/analytics/commit/d32c7b8b8cce03e634caeb036e3412b8b7bcbf19)) + +## [24.9.3](https://github.com/dhis2/analytics/compare/v24.9.2...v24.9.3) (2023-03-15) + + +### Bug Fixes + +* ensure the base passed to URL is absolute ([#1452](https://github.com/dhis2/analytics/issues/1452)) ([4d45abb](https://github.com/dhis2/analytics/commit/4d45abb72b9b6c3e2d82e54a3a05abe0fd8b87b7)) + +## [24.9.2](https://github.com/dhis2/analytics/compare/v24.9.1...v24.9.2) (2023-03-14) + + +### Bug Fixes + +* deduplicate yarn.lock ([#1450](https://github.com/dhis2/analytics/issues/1450)) ([85781ef](https://github.com/dhis2/analytics/commit/85781efeb3f347eabb70ff0db327f888dfcb3da3)) +* prevent wrong URL with duplicated path parts DHIS2-14789 ([#1449](https://github.com/dhis2/analytics/issues/1449)) ([7c5c2a6](https://github.com/dhis2/analytics/commit/7c5c2a6870f14f9a18c155ee7f7817a3055b6205)) +* use connection status to handle local offline conditions ([#1443](https://github.com/dhis2/analytics/issues/1443)) ([df4bb97](https://github.com/dhis2/analytics/commit/df4bb97f52d9bc03555621beadfe929721500e31)) + +## [24.9.1](https://github.com/dhis2/analytics/compare/v24.9.0...v24.9.1) (2023-03-10) + + +### Bug Fixes + +* spacing in Rename and SaveAs dialogs ([#1447](https://github.com/dhis2/analytics/issues/1447)) ([35e1872](https://github.com/dhis2/analytics/commit/35e18724ff88a09d13deedb54e897ad2506c4f08)) + +# [24.9.0](https://github.com/dhis2/analytics/compare/v24.8.0...v24.9.0) (2023-02-24) + + +### Features + +* merge multi-calendar support from alpha to master ([#1434](https://github.com/dhis2/analytics/issues/1434)) ([3cdac8f](https://github.com/dhis2/analytics/commit/3cdac8fdefc7a15a3fef0940183ca92f03b0f57c)) + +# [24.9.0-alpha.1](https://github.com/dhis2/analytics/compare/v24.8.0...v24.9.0-alpha.1) (2023-02-23) + + +### Bug Fixes + +* bump multi-calendar-dates to avoid jest config change ([3e5892a](https://github.com/dhis2/analytics/commit/3e5892aa88a087dde3405a518625f4c6e637d17e)) +* ensure date falls back to year if no eraYear present ([2a197d5](https://github.com/dhis2/analytics/commit/2a197d57be8ac2af6dbe331dd8f11ab9069afa5d)) + + +### Features + +* localise fixed periods according to user settings ([c640c90](https://github.com/dhis2/analytics/commit/c640c90ce2d1944a14706507284af43c7480fa2a)) +* use multi-calendar-dates library to generate fixed periods ([acc3801](https://github.com/dhis2/analytics/commit/acc380156092f888cfa55f70b4bade1c6516d034)) + +# [24.5.0-alpha.3](https://github.com/dhis2/analytics/compare/v24.5.0-alpha.2...v24.5.0-alpha.3) (2023-02-23) + + +### Features + +* localise fixed periods according to user settings ([c640c90](https://github.com/dhis2/analytics/commit/c640c90ce2d1944a14706507284af43c7480fa2a)) + +# [24.5.0-alpha.2](https://github.com/dhis2/analytics/compare/v24.5.0-alpha.1...v24.5.0-alpha.2) (2023-02-14) + + +### Bug Fixes + +* bump multi-calendar-dates to avoid jest config change ([3e5892a](https://github.com/dhis2/analytics/commit/3e5892aa88a087dde3405a518625f4c6e637d17e)) + +# [24.5.0-alpha.1](https://github.com/dhis2/analytics/compare/v24.4.2...v24.5.0-alpha.1) (2023-02-07) + + +### Bug Fixes + +* ensure date falls back to year if no eraYear present ([2a197d5](https://github.com/dhis2/analytics/commit/2a197d57be8ac2af6dbe331dd8f11ab9069afa5d)) + +# [24.8.0](https://github.com/dhis2/analytics/compare/v24.7.0...v24.8.0) (2023-02-16) + + +* add prop for controlling user org unit selector DHIS2-14744 ([#1430](https://github.com/dhis2/analytics/issues/1430)) ([02d3057](https://github.com/dhis2/analytics/commit/02d3057c7c090e293ba7c3057720f491e71457ec)) + +# [24.7.0](https://github.com/dhis2/analytics/compare/v24.6.0...v24.7.0) (2023-02-15) + + +### Features + +* new props for customising OrgUnitDimension DHIS2-14744 ([#1427](https://github.com/dhis2/analytics/issues/1427)) ([ae2f886](https://github.com/dhis2/analytics/commit/ae2f886167a487271bf42c2f4c694e45ea4b25b3)) + +# [24.6.0](https://github.com/dhis2/analytics/compare/v24.5.0...v24.6.0) (2023-02-13) + + +### Features + +* single value background color change based upon legend (DHIS2-13702) ([#1402](https://github.com/dhis2/analytics/issues/1402)) ([ad437c6](https://github.com/dhis2/analytics/commit/ad437c6a1fcbcb71cee7b6945c6bc83ed2bc3bb3)) + +# [24.5.0](https://github.com/dhis2/analytics/compare/v24.4.2...v24.5.0) (2023-02-06) + + +### Features + +* [reverted] use multi-calendar-dates library to generate fixed periods ([acc3801](https://github.com/dhis2/analytics/commit/acc380156092f888cfa55f70b4bade1c6516d034)). This work was added to "next" release channel, but was reverted afterwards because of the restrictions "next" channel puts on what can be released from master afterwards. It will be added to "alpha" channel instead until it's ready for the main channel. + +## [24.4.2](https://github.com/dhis2/analytics/compare/v24.4.1...v24.4.2) (2023-01-25) + + +### Bug Fixes + +* use page number from response ([#1413](https://github.com/dhis2/analytics/issues/1413)) ([b5523bf](https://github.com/dhis2/analytics/commit/b5523bf9701198645a7029ea48e568ab7d4859c5)) + +## [24.4.1](https://github.com/dhis2/analytics/compare/v24.4.0...v24.4.1) (2023-01-13) + + +### Bug Fixes + +* make icon prop not required ([#1410](https://github.com/dhis2/analytics/issues/1410)) ([169976c](https://github.com/dhis2/analytics/commit/169976cdde28880785ff836f2e0acba263e7bb53)) + +# [24.4.0](https://github.com/dhis2/analytics/compare/v24.3.14...v24.4.0) (2023-01-03) + + +### Features + +* enable legends for stacked column/bar ([#1388](https://github.com/dhis2/analytics/issues/1388)) ([667db6a](https://github.com/dhis2/analytics/commit/667db6a04072911f8c3923dbfc33b7baecb955e2)) + +## [24.3.14](https://github.com/dhis2/analytics/compare/v24.3.13...v24.3.14) (2023-01-02) + + +### Bug Fixes + +* remove required prop from save as dialog ([#1406](https://github.com/dhis2/analytics/issues/1406)) ([f7972b5](https://github.com/dhis2/analytics/commit/f7972b5b3f56fd02a5baa3f32070b4938b81d0cc)) + +## [24.3.13](https://github.com/dhis2/analytics/compare/v24.3.12...v24.3.13) (2022-12-29) + + +### Bug Fixes + +* prevent escaping old name on save as ([#1405](https://github.com/dhis2/analytics/issues/1405)) ([639dc45](https://github.com/dhis2/analytics/commit/639dc45001d0d8b9a0784ffefc96bdbc45271ae3)) + +## [24.3.12](https://github.com/dhis2/analytics/compare/v24.3.11...v24.3.12) (2022-12-22) + + +### Bug Fixes + +* typo in dataTest ([#1404](https://github.com/dhis2/analytics/issues/1404)) ([55a94ca](https://github.com/dhis2/analytics/commit/55a94cabbb11e5ed91f59c55ebee3053f83e7fa7)) + +## [24.3.11](https://github.com/dhis2/analytics/compare/v24.3.10...v24.3.11) (2022-12-21) + + +### Bug Fixes + +* do not pass translation object when value is empty ([#1401](https://github.com/dhis2/analytics/issues/1401)) ([03c6a2e](https://github.com/dhis2/analytics/commit/03c6a2ee98b437fed2a44233e4a750d17bd3c5af)) + +## [24.3.10](https://github.com/dhis2/analytics/compare/v24.3.9...v24.3.10) (2022-12-02) + + +### Bug Fixes + +* items in sidebar not clickable full width (DHIS2-6626) ([#1390](https://github.com/dhis2/analytics/issues/1390)) ([4b7cff4](https://github.com/dhis2/analytics/commit/4b7cff4a182ae3f44fada600337ba477a2656ed5)) + +## [24.3.9](https://github.com/dhis2/analytics/compare/v24.3.8...v24.3.9) (2022-12-01) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([a6d4648](https://github.com/dhis2/analytics/commit/a6d4648267a7ca69a7b4702c0fa07cf9f7ff8c2a)) + +## [24.3.8](https://github.com/dhis2/analytics/compare/v24.3.7...v24.3.8) (2022-11-29) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([ade41a1](https://github.com/dhis2/analytics/commit/ade41a150e728f9ac80b74d90123a5dfed29b088)) + +## [24.3.7](https://github.com/dhis2/analytics/compare/v24.3.6...v24.3.7) (2022-11-24) + + +### Bug Fixes + +* **translations:** sync translations from transifex (master) ([4838a17](https://github.com/dhis2/analytics/commit/4838a1714a33a7fd06d12681b578701d6a735fd3)) + +## [24.3.6](https://github.com/dhis2/analytics/compare/v24.3.5...v24.3.6) (2022-11-22) + + +### Bug Fixes + +* **OpenFileDialog:** use case insensitive sorting on displayName (DHIS2-13554) ([#1384](https://github.com/dhis2/analytics/issues/1384)) ([e8348f7](https://github.com/dhis2/analytics/commit/e8348f7fe4b9a9d6349eddf9c86b11b5939564a2)) + ## [24.3.5](https://github.com/dhis2/analytics/compare/v24.3.4...v24.3.5) (2022-11-17) diff --git a/README.md b/README.md index 765527a1a..e39d92a55 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,8 @@ **master** [![Test](https://github.com/dhis2/analytics/actions/workflows/node-test.yml/badge.svg)](https://github.com/dhis2/analytics/actions/workflows/node-test.yml) [![DHIS2: Release](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml/badge.svg)](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml) -**21.x** -[![Test](https://github.com/dhis2/analytics/actions/workflows/node-test.yml/badge.svg?branch=21.x)](https://github.com/dhis2/analytics/actions/workflows/node-test.yml) [![DHIS2: Release](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml/badge.svg?branch=21.x)](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml) - -**20.x** -[![Test](https://github.com/dhis2/analytics/actions/workflows/node-test.yml/badge.svg?branch=20.x)](https://github.com/dhis2/analytics/actions/workflows/node-test.yml) [![DHIS2: Release](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml/badge.svg?branch=20.x)](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml) - -**16.x** -[![Test](https://github.com/dhis2/analytics/actions/workflows/node-test.yml/badge.svg?branch=16.x)](https://github.com/dhis2/analytics/actions/workflows/node-test.yml) [![DHIS2: Release](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml/badge.svg?branch=16.x)](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml) - -**11.0.x** -[![Test](https://github.com/dhis2/analytics/actions/workflows/node-test.yml/badge.svg?branch=11.0.x)](https://github.com/dhis2/analytics/actions/workflows/node-test.yml) [![DHIS2: Release](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml/badge.svg?branch=11.0.x)](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml) - -**4.x** -[![Test](https://github.com/dhis2/analytics/actions/workflows/node-test.yml/badge.svg?branch=4.x)](https://github.com/dhis2/analytics/actions/workflows/node-test.yml) [![DHIS2: Release](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml/badge.svg?branch=4.x)](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml) - -**2.4.x** -[![Test](https://github.com/dhis2/analytics/actions/workflows/node-test.yml/badge.svg?branch=2.4.x)](https://github.com/dhis2/analytics/actions/workflows/node-test.yml) [![DHIS2: Release](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml/badge.svg?branch=2.4.x)](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml) +**24.x** +[![Test](https://github.com/dhis2/analytics/actions/workflows/node-test.yml/badge.svg?branch=24.x)](https://github.com/dhis2/analytics/actions/workflows/node-test.yml) [![DHIS2: Release](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml/badge.svg?branch=24.x)](https://github.com/dhis2/analytics/actions/workflows/node-publish.yml) ## Overview @@ -28,6 +13,7 @@ The analytics library contains components and modules that are used in DHIS 2 an - [dhis2/dashboards-app](https://github.com/dhis2/dashboards-app) - [dhis2/data-visualizer-app](https://github.com/dhis2/data-visualizer-app) - [dhis2/maps-app](https://github.com/dhis2/maps-app) +- [dhis2/line-listing-app](https://github.com/dhis2/line-listing-app) [Module layout documentation](./docs/module-layout.md) @@ -35,7 +21,7 @@ The analytics library contains components and modules that are used in DHIS 2 an The analytics package is published to npm as @dhis2/analytics. -To publish, simply mark the commit using [semantic release terminology](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines) (see notes below for branch-specific restrictions). Once committed, github actions will take care of publishing the new version to npm. +To publish, mark the commit using [semantic release terminology](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines) (see notes below for branch-specific restrictions). Once committed, github actions will take care of publishing the new version to npm. ### master branch @@ -43,7 +29,31 @@ The master branch follows semantic versioning according to spec. ### .x branches -Commits to .x branches (e.g. 16.x) cannot trigger a major version bump, even if it is technically a breaking change. This is because the next version has already been published. Additionally, branches that use .x for the patch version (e.g. 11.0.x, 2.4.x), cannot trigger a minor version bump. In the unlikely case that you need to commit a change that would trigger a version bump that's not possible, you will have to mark it to only trigger a patch or minor bump respectively, then make sure to update the apps that are locked to the .x version of analytics +Commits to .x branches (e.g. 24.x) cannot trigger a major version bump, even if it is technically a breaking change. This is because the next version has already been published. Additionally, branches that use .x for the patch version (e.g. 11.0.x, 2.4.x), cannot trigger a minor version bump. In the unlikely case that you need to commit a change that would trigger a version bump that's not possible, you will have to mark it to only trigger a patch or minor bump respectively, then make sure to update the apps that are locked to the .x version of analytics + +## Publishing pre-release versions during app development + +Builds for all non-production branches are automatically copied to [d2-ci/analytics](https://github.com/d2-ci/analytics) for use during development and testing, prior to production release. + +To test changes in a development branch, change the analytics dependency of package.json of the app you are testing with. There are a few options: + +1. point to a specific commit: + +``` +"dependencies": { + "@dhis2/analytics": "git+https://github.com/d2-ci/analytics.git#70249ebe8be39051fa10142f850de449e1ec488c", + ... +} +``` + +2. point to a branch: + +``` +"dependencies": { + "@dhis2/analytics": "git+https://github.com/d2-ci/analytics.git#chore/some-chore", + ... +} +``` ## Report an issue diff --git a/config/setupTestingLibrary.js b/config/setupTestingLibrary.js new file mode 100644 index 000000000..446c378d5 --- /dev/null +++ b/config/setupTestingLibrary.js @@ -0,0 +1,5 @@ +import { configure } from '@testing-library/dom' + +configure({ + testIdAttribute: 'data-test', +}) diff --git a/i18n/ar.po b/i18n/ar.po index a57ec26f3..7d24566ae 100644 --- a/i18n/ar.po +++ b/i18n/ar.po @@ -1,16 +1,16 @@ # # Translators: # Viktor Varland , 2022 -# phil_dhis2, 2022 -# Hamza Assada <7amza.it@gmail.com>, 2022 +# phil_dhis2, 2023 +# Hamza Assada <7amza.it@gmail.com>, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2023-07-06T08:30:33.216Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Hamza Assada <7amza.it@gmail.com>, 2022\n" -"Language-Team: Arabic (https://www.transifex.com/hisp-uio/teams/100509/ar/)\n" +"Last-Translator: Hamza Assada <7amza.it@gmail.com>, 2023\n" +"Language-Team: Arabic (https://app.transifex.com/hisp-uio/teams/100509/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -86,11 +86,46 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" -msgstr "نوع البيانات" +msgid "Data / Edit calculation" +msgstr "" -msgid "All types" -msgstr "جميع الأنواع" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "إلغاء" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" msgid "Totals only" msgstr "" @@ -98,15 +133,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "جار التحميل" + +msgid "Data elements" +msgstr "عناصر البيانات" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "نوع البيانات" + +msgid "All types" +msgstr "جميع الأنواع" + msgid "Disaggregation" msgstr "تصنيف" msgid "No data" msgstr "لا توجد بيانات" -msgid "Loading" -msgstr "جار التحميل" - msgid "Search by data item name" msgstr "" @@ -119,9 +180,6 @@ msgstr "العناصر المحددة" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -134,9 +192,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -149,6 +204,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -215,9 +273,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "إلغاء" - msgid "Delete" msgstr "حذف" @@ -269,7 +324,7 @@ msgstr "الوصف" msgid "Rename" msgstr "إعادة التسمية" -msgid "{{objectName}} (copy)" +msgid "{{- objectName}} (copy)" msgstr "" msgid "Save {{fileType}} as" @@ -296,6 +351,9 @@ msgstr "كتابة رد" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "فشل الحذف" + msgid "Could not update comment" msgstr "" @@ -328,15 +386,27 @@ msgstr "" msgid "Interpretations" msgstr "التفسيرات" +msgid "Reply" +msgstr "رد" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} رد" +msgstr[1] "{{count}} رد" +msgstr[2] "{{count}} رد" +msgstr[3] "{{count}} رد" +msgstr[4] "{{count}} رد" +msgstr[5] "{{count}} رد" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "إلغاء الإعجاب" msgid "Like" msgstr "إعجاب" -msgid "Reply" -msgstr "رد" - msgid "Share" msgstr "مشاركة" @@ -599,48 +669,6 @@ msgstr "الفترات المحددة" msgid "No periods selected" msgstr "لم يتم تحديد أية فترات زمنية" -msgid "January" -msgstr "يناير" - -msgid "February" -msgstr "فبراير" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "ابريل" - -msgid "May" -msgstr "مايو" - -msgid "June" -msgstr "يونيو" - -msgid "July" -msgstr "يوليو" - -msgid "August" -msgstr "اغسطس" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "اكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgid "Week {{weekNumber}}" -msgstr "الإسبوع {{weekNumber}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "ثنائي الإسبوع {{biWeekNumber}}" - msgid "Daily" msgstr "يومي" @@ -845,6 +873,9 @@ msgstr "السنوات المالية" msgid "Years" msgstr "السنوات" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -929,9 +960,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "عناصر البيانات" - msgid "Data element group" msgstr "مجموعة عناصر البيانات" @@ -977,6 +1005,33 @@ msgstr "مؤشرات البرنامج" msgid "Program indicator" msgstr "مؤشرات البرنامج" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "العدد" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "صغير جدا" diff --git a/i18n/cs.po b/i18n/cs.po index 7a5439c60..ac460b093 100644 --- a/i18n/cs.po +++ b/i18n/cs.po @@ -1,14 +1,15 @@ # # Translators: -# trendspotter , 2022 +# Philip Larsen Donnelly, 2024 +# Jiří Podhorecký, 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2024-01-25T12:05:03.360Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: trendspotter , 2022\n" -"Language-Team: Czech (https://www.transifex.com/hisp-uio/teams/100509/cs/)\n" +"Last-Translator: Jiří Podhorecký, 2024\n" +"Language-Team: Czech (https://app.transifex.com/hisp-uio/teams/100509/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -83,11 +84,47 @@ msgstr "Tato aplikace nemohla načíst požadovaná data." msgid "Network error" msgstr "Chyba sítě" -msgid "Data Type" -msgstr "Typ dat" +msgid "Data / Edit calculation" +msgstr "Data / Upravit výpočet" -msgid "All types" -msgstr "Všechny typy" +msgid "Data / New calculation" +msgstr "Data / Nový výpočet" + +msgid "Remove item" +msgstr "Odebrat položku" + +msgid "Check formula" +msgstr "Zkontrolujte vzorec" + +msgid "Calculation name" +msgstr "Název výpočtu" + +msgid "Shown in table headers and chart axes/legends" +msgstr "Zobrazeno v záhlaví tabulky a osy/legendy grafu" + +msgid "Delete calculation" +msgstr "Smazat výpočet" + +msgid "Cancel" +msgstr "Zrušit" + +msgid "The calculation can only be saved with a valid formula" +msgstr "Výpočet lze uložit pouze s platným vzorcem" + +msgid "Add a name to save this calculation" +msgstr "Přidejte název pro uložení tohoto výpočtu" + +msgid "Save calculation" +msgstr "Uložit výpočet" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" +"Opravdu chcete tento výpočet smazat? Může být použit jinými vizualizacemi." + +msgid "Yes, delete" +msgstr "Ano, smazat" msgid "Totals only" msgstr "Pouze součty" @@ -95,15 +132,46 @@ msgstr "Pouze součty" msgid "Details only" msgstr "Pouze podrobnosti" +msgid "Loading" +msgstr "Načítání" + +msgid "Data elements" +msgstr "Datové prvky" + +msgid "Search by data element name" +msgstr "Vyhledávání podle názvu datového prvku" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "Nebyly nalezeny žádné datové prvky pro „{{- searchTerm}}“" + +msgid "No data elements found" +msgstr "Nebyly nalezeny žádné datové prvky" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" +"Přetáhněte položky sem nebo dvakrát klikněte na seznam a začněte vytvářet " +"vzorec výpočtu" + +msgid "Math operators" +msgstr "Matematické operátory" + +msgid "Data Type" +msgstr "Typ dat" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "" + +msgid "All types" +msgstr "Všechny typy" + msgid "Disaggregation" msgstr "Rozčlenění" msgid "No data" msgstr "Nejsou data" -msgid "Loading" -msgstr "Načítání" - msgid "Search by data item name" msgstr "Hledání podle názvu datové položky" @@ -116,9 +184,6 @@ msgstr "Vybrané položky" msgid "No indicators found" msgstr "Nebyly nalezeny žádné indikátory" -msgid "No data elements found" -msgstr "Nebyly nalezeny žádné datové prvky" - msgid "No data sets found" msgstr "Nebyly nalezeny žádné datové soubory" @@ -128,12 +193,12 @@ msgstr "Nebyly nalezeny žádné datové položky události" msgid "No program indicators found" msgstr "Nebyly nalezeny žádné programové indikátory" +msgid "No calculations found" +msgstr "Nenalezeny žádné výpočty" + msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "Nebyly nalezeny žádné indikátory pro „{{- searchTerm}}“" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "Nebyly nalezeny žádné datové prvky pro „{{- searchTerm}}“" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "Nebyly nalezeny žádné soubory dat pro „{{- searchTerm}}“" @@ -143,9 +208,15 @@ msgstr "Pro „{{- searchTerm}}“ nebyly nalezeny žádné datové položky ud msgid "No program indicators found for \"{{- searchTerm}}\"" msgstr "Nebyly nalezeny žádné programové indikátory pro „{{- searchTerm}}“" +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "" + msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "Pro dotaz „{{- searchTerm}}“ nebylo nic nalezeno" +msgid "Calculation" +msgstr "Výpočet" + msgid "Metric type" msgstr "Metrický typ" @@ -215,9 +286,6 @@ msgid "" msgstr "" "Tento {{fileType}} a související interpretace budou smazány. Pokračovat?" -msgid "Cancel" -msgstr "Zrušit" - msgid "Delete" msgstr "Smazat" @@ -269,8 +337,8 @@ msgstr "Popis" msgid "Rename" msgstr "Přejmenovat" -msgid "{{objectName}} (copy)" -msgstr "{{objectName}} (kopie)" +msgid "{{- objectName}} (copy)" +msgstr "{{- objectName}} (kopie)" msgid "Save {{fileType}} as" msgstr "Uložit {{fileType}} jako" @@ -296,6 +364,9 @@ msgstr "Napsat odpověď" msgid "Post reply" msgstr "Odpovědět" +msgid "Delete failed" +msgstr "Smazání se nezdařilo" + msgid "Could not update comment" msgstr "Komentář se nepodařilo aktualizovat" @@ -324,27 +395,44 @@ msgstr "Skrýt interpretaci" msgid "Write an interpretation" msgstr "Napsat interpretaci" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "Vložit interpretaci" msgid "Interpretations" msgstr "Interpretace" +msgid "Reply" +msgstr "Odpovědět" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} odpověď" +msgstr[1] " {{count}} odpovědi" +msgstr[2] "{{count}} odpovědí" +msgstr[3] "{{count}} odpovědi" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "Na rozdíl od" msgid "Like" msgstr "Jako" -msgid "Reply" -msgstr "Odpovědět" +msgid "See interpretation" +msgstr "Zobrazit interpretaci" + +msgid "Open in app" +msgstr "" msgid "Share" msgstr "Sdílet" -msgid "See interpretation" -msgstr "Zobrazit interpretaci" - msgid "Manage sharing" msgstr "Spravovat sdílení" @@ -567,7 +655,7 @@ msgstr[2] "{{count}} skupin" msgstr[3] "{{count}} skupin" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "Vybráno: {{commaSeparatedListOfOfOrganisationUnits}}" +msgstr "Vybráno: {{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" msgstr "Není vybráno nic" @@ -602,60 +690,18 @@ msgstr "Vybrat rok" msgid "Period" msgstr "Období" +msgid "Selected Periods" +msgstr "Vybraná období" + msgid "Relative periods" msgstr "Relativní období" msgid "Fixed periods" msgstr "Pevné období" -msgid "Selected Periods" -msgstr "Vybraná období" - msgid "No periods selected" msgstr "Nejsou vybrána žádná období" -msgid "January" -msgstr "Leden" - -msgid "February" -msgstr "únor" - -msgid "March" -msgstr "březen" - -msgid "April" -msgstr "Duben" - -msgid "May" -msgstr "Květen" - -msgid "June" -msgstr "červen" - -msgid "July" -msgstr "červenec" - -msgid "August" -msgstr "Srpen" - -msgid "September" -msgstr "Září" - -msgid "October" -msgstr "říjen" - -msgid "November" -msgstr "Listopad" - -msgid "December" -msgstr "prosinec" - -msgid "Week {{weekNumber}}" -msgstr "Týden {{weekNumber}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "dva týdny {{biWeekNumber}}" - msgid "Daily" msgstr "Denně" @@ -860,6 +906,9 @@ msgstr "Finanční roky" msgid "Years" msgstr "Let" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "Překlad do" @@ -944,9 +993,6 @@ msgstr "Nebyly nalezeny žádné skupiny indikátorů" msgid "Loading indicator groups" msgstr "Načítání skupin indikátorů" -msgid "Data elements" -msgstr "Datové prvky" - msgid "Data element group" msgstr "Skupina datových prvků" @@ -992,6 +1038,33 @@ msgstr "Indikátory programu" msgid "Program indicator" msgstr "Indikátor programu" +msgid "Calculations" +msgstr "Výpočty" + +msgid "Number" +msgstr "Číslo" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "Vzorec je prázdný. Přidejte položky do vzorce ze seznamů vlevo." + +msgid "Consecutive math operators" +msgstr "Po sobě jdoucí matematické operátory" + +msgid "Consecutive data elements" +msgstr "Po sobě jdoucí datové prvky" + +msgid "Starts or ends with a math operator" +msgstr "Začíná nebo končí matematickým operátorem" + +msgid "Empty parentheses" +msgstr "Prázdné závorky" + +msgid "Missing right parenthesis )" +msgstr "Chybí pravá závorka )" + +msgid "Missing left parenthesis (" +msgstr "Chybí levá závorka (" + msgid "Extra Small" msgstr "Velmi malý" @@ -1127,6 +1200,9 @@ msgstr "Rozptyl" msgid "Single value" msgstr "Jedna hodnota" +msgid "Outlier table" +msgstr "" + msgid "All charts" msgstr "Všechny grafy" diff --git a/i18n/da.po b/i18n/da.po index c3671c1f2..7ad165ade 100644 --- a/i18n/da.po +++ b/i18n/da.po @@ -1,14 +1,14 @@ # # Translators: -# phil_dhis2, 2022 +# phil_dhis2, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-04-18T08:41:27.838Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: phil_dhis2, 2022\n" -"Language-Team: Danish (https://www.transifex.com/hisp-uio/teams/100509/da/)\n" +"Last-Translator: phil_dhis2, 2023\n" +"Language-Team: Danish (https://app.transifex.com/hisp-uio/teams/100509/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -80,10 +80,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Cancel" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -92,13 +127,39 @@ msgstr "" msgid "Details only" msgstr "" -msgid "Disaggregation" +msgid "Loading" msgstr "" -msgid "No data" +msgid "Data elements" +msgstr "Data elements" + +msgid "Search by data element name" msgstr "" -msgid "Loading" +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + +msgid "Disaggregation" +msgstr "" + +msgid "No data" msgstr "" msgid "Search by data item name" @@ -113,9 +174,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -128,9 +186,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -143,6 +198,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -209,9 +267,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Cancel" - msgid "Delete" msgstr "Delete" @@ -263,6 +318,9 @@ msgstr "Description" msgid "Rename" msgstr "" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -376,6 +434,9 @@ msgstr "" msgid "No results found" msgstr "No results found" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "Created by" @@ -575,48 +636,6 @@ msgstr "" msgid "No periods selected" msgstr "" -msgid "January" -msgstr "January" - -msgid "February" -msgstr "February" - -msgid "March" -msgstr "March" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "June" - -msgid "July" -msgstr "July" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "October" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "Daily" @@ -839,6 +858,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -902,9 +924,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Data elements" - msgid "Data element group" msgstr "Data element group" @@ -950,6 +969,33 @@ msgstr "" msgid "Program indicator" msgstr "" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Number" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/en.pot b/i18n/en.pot index 5212a4374..8f0bb1884 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" -"PO-Revision-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2024-10-11T12:49:26.846Z\n" +"PO-Revision-Date: 2024-10-11T12:49:26.847Z\n" msgid "view only" msgstr "view only" @@ -67,17 +67,60 @@ msgstr "About this line list" msgid "About this visualization" msgstr "About this visualization" +msgid "About this event chart" +msgstr "About this event chart" + +msgid "About this event report" +msgstr "About this event report" + msgid "This app could not retrieve required data." msgstr "This app could not retrieve required data." msgid "Network error" msgstr "Network error" -msgid "Data Type" -msgstr "Data Type" +msgid "Data / Edit calculation" +msgstr "Data / Edit calculation" -msgid "All types" -msgstr "All types" +msgid "Data / New calculation" +msgstr "Data / New calculation" + +msgid "Remove item" +msgstr "Remove item" + +msgid "Check formula" +msgstr "Check formula" + +msgid "Calculation name" +msgstr "Calculation name" + +msgid "Shown in table headers and chart axes/legends" +msgstr "Shown in table headers and chart axes/legends" + +msgid "Delete calculation" +msgstr "Delete calculation" + +msgid "Cancel" +msgstr "Cancel" + +msgid "The calculation can only be saved with a valid formula" +msgstr "The calculation can only be saved with a valid formula" + +msgid "Add a name to save this calculation" +msgstr "Add a name to save this calculation" + +msgid "Save calculation" +msgstr "Save calculation" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." + +msgid "Yes, delete" +msgstr "Yes, delete" msgid "Totals only" msgstr "Totals only" @@ -85,15 +128,46 @@ msgstr "Totals only" msgid "Details only" msgstr "Details only" +msgid "Loading" +msgstr "Loading" + +msgid "Data elements" +msgstr "Data elements" + +msgid "Search by data element name" +msgstr "Search by data element name" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "No data elements found for \"{{- searchTerm}}\"" + +msgid "No data elements found" +msgstr "No data elements found" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" + +msgid "Math operators" +msgstr "Math operators" + +msgid "Data Type" +msgstr "Data Type" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "Only {{dataType}} can be used in {{visType}}" + +msgid "All types" +msgstr "All types" + msgid "Disaggregation" msgstr "Disaggregation" msgid "No data" msgstr "No data" -msgid "Loading" -msgstr "Loading" - msgid "Search by data item name" msgstr "Search by data item name" @@ -106,9 +180,6 @@ msgstr "Selected Items" msgid "No indicators found" msgstr "No indicators found" -msgid "No data elements found" -msgstr "No data elements found" - msgid "No data sets found" msgstr "No data sets found" @@ -118,12 +189,12 @@ msgstr "No event data items found" msgid "No program indicators found" msgstr "No program indicators found" +msgid "No calculations found" +msgstr "No calculations found" + msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "No indicators found for \"{{- searchTerm}}\"" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "No data elements found for \"{{- searchTerm}}\"" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "No data sets found for \"{{- searchTerm}}\"" @@ -133,9 +204,15 @@ msgstr "No event data items found for \"{{- searchTerm}}\"" msgid "No program indicators found for \"{{- searchTerm}}\"" msgstr "No program indicators found for \"{{- searchTerm}}\"" +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "No calculations found for \"{{- searchTerm}}\"" + msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "Nothing found for \"{{- searchTerm}}\"" +msgid "Calculation" +msgstr "Calculation" + msgid "Metric type" msgstr "Metric type" @@ -203,9 +280,6 @@ msgstr "Delete {{fileType}}" msgid "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "This {{fileType}} and related interpretations will be deleted. Continue?" -msgid "Cancel" -msgstr "Cancel" - msgid "Delete" msgstr "Delete" @@ -257,8 +331,8 @@ msgstr "Description" msgid "Rename" msgstr "Rename" -msgid "{{objectName}} (copy)" -msgstr "{{objectName}} (copy)" +msgid "{{- objectName}} (copy)" +msgstr "{{- objectName}} (copy)" msgid "Save {{fileType}} as" msgstr "Save {{fileType}} as" @@ -284,6 +358,9 @@ msgstr "Write a reply" msgid "Post reply" msgstr "Post reply" +msgid "Delete failed" +msgstr "Delete failed" + msgid "Could not update comment" msgstr "Could not update comment" @@ -312,27 +389,41 @@ msgstr "Hide interpretation" msgid "Write an interpretation" msgstr "Write an interpretation" +msgid "Other people viewing this interpretation in the future may see more data." +msgstr "Other people viewing this interpretation in the future may see more data." + msgid "Post interpretation" msgstr "Post interpretation" msgid "Interpretations" msgstr "Interpretations" +msgid "Reply" +msgstr "Reply" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} reply" +msgstr[1] "{{count}} replies" + +msgid "View replies" +msgstr "View replies" + msgid "Unlike" msgstr "Unlike" msgid "Like" msgstr "Like" -msgid "Reply" -msgstr "Reply" +msgid "See interpretation" +msgstr "See interpretation" + +msgid "Open in app" +msgstr "Open in app" msgid "Share" msgstr "Share" -msgid "See interpretation" -msgstr "See interpretation" - msgid "Manage sharing" msgstr "Manage sharing" @@ -342,39 +433,6 @@ msgstr "Could not update interpretation" msgid "Enter interpretation text" msgstr "Enter interpretation text" -msgid "Bold text" -msgstr "Bold text" - -msgid "Italic text" -msgstr "Italic text" - -msgid "Link to a URL" -msgstr "Link to a URL" - -msgid "Mention a user" -msgstr "Mention a user" - -msgid "Add emoji" -msgstr "Add emoji" - -msgid "Preview" -msgstr "Preview" - -msgid "Back to write mode" -msgstr "Back to write mode" - -msgid "Too many results. Try refining the search." -msgstr "Too many results. Try refining the search." - -msgid "Search for a user" -msgstr "Search for a user" - -msgid "Searching for \"{{- searchText}}\"" -msgstr "Searching for \"{{- searchText}}\"" - -msgid "No results found" -msgstr "No results found" - msgid "Not available offline" msgstr "Not available offline" @@ -581,60 +639,18 @@ msgstr "Select year" msgid "Period" msgstr "Period" +msgid "Selected Periods" +msgstr "Selected Periods" + msgid "Relative periods" msgstr "Relative periods" msgid "Fixed periods" msgstr "Fixed periods" -msgid "Selected Periods" -msgstr "Selected Periods" - msgid "No periods selected" msgstr "No periods selected" -msgid "January" -msgstr "January" - -msgid "February" -msgstr "February" - -msgid "March" -msgstr "March" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "June" - -msgid "July" -msgstr "July" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "October" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgid "Week {{weekNumber}}" -msgstr "Week {{weekNumber}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "Bi-Week {{biWeekNumber}}" - msgid "Daily" msgstr "Daily" @@ -839,6 +855,33 @@ msgstr "Financial Years" msgid "Years" msgstr "Years" +msgid "Value: {{value}}" +msgstr "Value: {{value}}" + +msgid "Bold text" +msgstr "Bold text" + +msgid "Italic text" +msgstr "Italic text" + +msgid "Link to a URL" +msgstr "Link to a URL" + +msgid "Mention a user" +msgstr "Mention a user" + +msgid "Add emoji" +msgstr "Add emoji" + +msgid "Preview" +msgstr "Preview" + +msgid "Back to write mode" +msgstr "Back to write mode" + +msgid "Interpretations and details" +msgstr "Interpretations and details" + msgid "Translating to" msgstr "Translating to" @@ -866,6 +909,18 @@ msgstr "Could not load translations" msgid "Retry" msgstr "Retry" +msgid "Too many results. Try refining the search." +msgstr "Too many results. Try refining the search." + +msgid "Search for a user" +msgstr "Search for a user" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "Searching for \"{{- searchText}}\"" + +msgid "No results found" +msgstr "No results found" + msgid "Series" msgstr "Series" @@ -923,9 +978,6 @@ msgstr "No indicator groups found" msgid "Loading indicator groups" msgstr "Loading indicator groups" -msgid "Data elements" -msgstr "Data elements" - msgid "Data element group" msgstr "Data element group" @@ -971,6 +1023,33 @@ msgstr "Program indicators" msgid "Program indicator" msgstr "Program indicator" +msgid "Calculations" +msgstr "Calculations" + +msgid "Number" +msgstr "Number" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "Formula is empty. Add items to the formula from the lists on the left." + +msgid "Consecutive math operators" +msgstr "Consecutive math operators" + +msgid "Consecutive data elements" +msgstr "Consecutive data elements" + +msgid "Starts or ends with a math operator" +msgstr "Starts or ends with a math operator" + +msgid "Empty parentheses" +msgstr "Empty parentheses" + +msgid "Missing right parenthesis )" +msgstr "Missing right parenthesis )" + +msgid "Missing left parenthesis (" +msgstr "Missing left parenthesis (" + msgid "Extra Small" msgstr "Extra Small" @@ -1049,6 +1128,9 @@ msgstr "{{thresholdFactor}} × Z-score low" msgid "{{thresholdFactor}} × Z-score high" msgstr "{{thresholdFactor}} × Z-score high" +msgid "Not applicable" +msgstr "Not applicable" + msgid "Data" msgstr "Data" @@ -1106,6 +1188,9 @@ msgstr "Scatter" msgid "Single value" msgstr "Single value" +msgid "Outlier table" +msgstr "Outlier table" + msgid "All charts" msgstr "All charts" diff --git a/i18n/es.po b/i18n/es.po index 01f9fad0d..df5f2b426 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,22 +1,23 @@ # # Translators: # ericbp , 2020 -# Marta Vila , 2021 -# Alison Andrade , 2021 # Juan M Alcantara Acosta , 2021 # Prabhjot Singh, 2021 -# Janeth Cruz, 2022 # Gabriela Rodriguez , 2022 -# phil_dhis2, 2022 # Viktor Varland , 2022 +# Marta Vila , 2023 +# Janeth Cruz, 2023 +# Sergio Valenzuela , 2023 +# Philip Larsen Donnelly, 2024 +# Enzo Nicolas Rossi , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2024-08-27T11:29:09.031Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Viktor Varland , 2022\n" -"Language-Team: Spanish (https://www.transifex.com/hisp-uio/teams/100509/es/)\n" +"Last-Translator: Enzo Nicolas Rossi , 2024\n" +"Language-Team: Spanish (https://app.transifex.com/hisp-uio/teams/100509/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -24,82 +25,163 @@ msgstr "" "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" msgid "view only" -msgstr "" +msgstr "Solo lectura" msgid "view and edit" -msgstr "" +msgstr "Ver y editar" msgid "all users ({{accessLevel}})" -msgstr "" +msgstr "todos los usuarios ({{accessLevel}})" msgid "{{userOrGroup}} ({{accessLevel}})" -msgstr "" +msgstr "{{userOrGroup}} ({{accessLevel}})" msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" -msgstr "" +msgstr "Compartido con {{commaSeparatedListOfUsersAndGroups}}" msgid "Not shared with any users or groups" -msgstr "" +msgstr "No compartido con ningún usuario o grupo." msgid "No description" msgstr "Sin descripción" msgid "Last updated {{time}}" -msgstr "" +msgstr "Última actualización {{time}}" msgid "Created {{time}} by {{author}}" -msgstr "" +msgstr "Creado {{time}} por {{author}}" msgid "Created {{time}}" -msgstr "" +msgstr "Creado {{time}}" msgid "Viewed {{count}} times" msgid_plural "Viewed {{count}} times" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Visto 1 vez" +msgstr[1] "Visto {{count}} veces" +msgstr[2] "Visto {{count}} veces" msgid "Notifications" -msgstr "" +msgstr "Notificaciones" msgid "You're subscribed and getting updates about new interpretations." msgstr "" +"Está suscrito y recibiendo actualizaciones sobre nuevas interpretaciones." msgid "Unsubscribe" -msgstr "" +msgstr "Cancelar la suscripción" msgid "Subscribe to get updates about new interpretations." msgstr "" +"Suscríbase para recibir actualizaciones sobre nuevas interpretaciones." msgid "Subscribe" -msgstr "" +msgstr "Suscribirse" msgid "About this map" -msgstr "" +msgstr "Acerca de este mapa" msgid "About this line list" -msgstr "" +msgstr "Acerca de este listado" msgid "About this visualization" -msgstr "" +msgstr "Acerca de esta visualización" + +msgid "About this event chart" +msgstr "Acerca de este gráfico de eventos" + +msgid "About this event report" +msgstr "Acerca de este informe" msgid "This app could not retrieve required data." -msgstr "" +msgstr "Esta aplicación no pudo recuperar los datos requeridos." msgid "Network error" +msgstr "Error de red" + +msgid "Data / Edit calculation" +msgstr "Datos / Editar cálculo" + +msgid "Data / New calculation" +msgstr "Datos / Nuevo cálculo" + +msgid "Remove item" +msgstr "Quitar elemento" + +msgid "Check formula" +msgstr "Comprobar fórmula" + +msgid "Calculation name" +msgstr "Nombre del cálculo" + +msgid "Shown in table headers and chart axes/legends" msgstr "" +"Se muestra en los encabezados de las tablas y en los ejes/leyendas de los " +"gráficos" -msgid "Data Type" -msgstr "Tipo de datos" +msgid "Delete calculation" +msgstr "Eliminar cálculo" -msgid "All types" -msgstr "Todos los tipos" +msgid "Cancel" +msgstr "Cancelar" -msgid "Totals only" +msgid "The calculation can only be saved with a valid formula" +msgstr "El cálculo solo puede guardarse con una fórmula válida" + +msgid "Add a name to save this calculation" +msgstr "Añadir un nombre para guardar este cálculo" + +msgid "Save calculation" +msgstr "Guardar cálculo" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." msgstr "" +"¿Está seguro de que desea eliminar este cálculo? Puede ser utilizado por " +"otras visualizaciones." + +msgid "Yes, delete" +msgstr "si, eliminar" + +msgid "Totals only" +msgstr "Solo totales" msgid "Details only" +msgstr "Solo detalles" + +msgid "Loading" +msgstr "Cargando" + +msgid "Data elements" +msgstr "Elementos de datos" + +msgid "Search by data element name" +msgstr "Búsqueda por nombre de elemento de datos" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "No se han encontrado elementos de datos para \"{{- searchTerm}}\"" + +msgid "No data elements found" +msgstr "No se han encontrado elementos de datos" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" msgstr "" +"Arrastre elementos aquí, o haga doble clic en la lista, para comenzar a " +"crear una fórmula de cálculo" + +msgid "Math operators" +msgstr "Operadores matemáticos" + +msgid "Data Type" +msgstr "Tipo de datos" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "Sólo {{dataType}} se puede utilizar en {{visType}}" + +msgid "All types" +msgstr "Todos los tipos" msgid "Disaggregation" msgstr "Desagregación" @@ -107,119 +189,121 @@ msgstr "Desagregación" msgid "No data" msgstr "No hay datos" -msgid "Loading" -msgstr "Cargando" - msgid "Search by data item name" -msgstr "" +msgstr "Búsqueda por nombre de item de datos" msgid "No items selected" -msgstr "" +msgstr "No hay elementos seleccionados" msgid "Selected Items" -msgstr "" +msgstr "Elementos seleccionados" msgid "No indicators found" -msgstr "" - -msgid "No data elements found" -msgstr "" +msgstr "No se han encontrado indicadores" msgid "No data sets found" -msgstr "" +msgstr "No se han encontrado sets de datos" msgid "No event data items found" -msgstr "" +msgstr "No se encontraron elementos para datos de eventos" msgid "No program indicators found" -msgstr "" +msgstr "No se han encontrado indicadores de programa" -msgid "No indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgid "No calculations found" +msgstr "No se encontraron cálculos" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr "No se han encontrado indicadores para \"{{- searchTerm}}\"" msgid "No data sets found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "No se han encontrado sets de datos para \"{{- searchTerm}}\"" msgid "No event data items found for \"{{- searchTerm}}\"" msgstr "" +"No se encontraron elementos para datos de eventos para \"{{- searchTerm}}\"" msgid "No program indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "No se han encontrado indicadores de programa para \"{{- searchTerm}}\"" + +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "No se encontraron cálculos para \"{{- searchTerm}}\"" msgid "Nothing found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "No se encontró nada para \"{{- searchTerm}}\"" + +msgid "Calculation" +msgstr "Cálculo" msgid "Metric type" -msgstr "" +msgstr "Tipo de métrica" msgid "All metrics" msgstr "Todas las métricas" msgid "Move to {{axisName}}" -msgstr "Mover a {{Nombredeleje}}" +msgstr "Mover a {{axisName}}" msgid "Add to {{axisName}}" -msgstr "Añadir a {{Nombredeleje}}" +msgstr "Añadir a {{axisName}}" msgid "Not available for {{visualizationType}}" -msgstr "" +msgstr "No disponible para {{visualizationType}}" msgid "Remove Assigned Categories" -msgstr "" +msgstr "Eliminar categorías asignadas" msgid "Add Assigned Categories" -msgstr "" +msgstr "Añadir categorías asignadas" msgid "Remove" msgstr "Eliminar" msgid "Filter dimensions" -msgstr "" +msgstr "Dimensiones del filtro" msgid "Main dimensions" -msgstr "" +msgstr "Dimensiones principales" msgid "Your dimensions" -msgstr "" +msgstr "Dimensiones propias" msgid "Dimension recommended with selected data" -msgstr "" +msgstr "Dimensión recomendada con datos seleccionados" msgid "All items" -msgstr "" +msgstr "Todos los elementos" msgid "Automatically include all items" -msgstr "" +msgstr "Incluir automáticamente todos los elementos" msgid "" "Select all {{- dimensionTitle}} items. With this option, new items added in " "the future will be automatically included." msgstr "" +"Seleccionar todos los elementos {{- dimensionTitle}}. Con esta opción, los " +"nuevos elementos que se añadan en el futuro se incluirán automáticamente." msgid "Manually select items..." -msgstr "" +msgstr "Seleccionar manualmente los elementos..." msgid "Nothing found in {{- dimensionTitle}}" -msgstr "" +msgstr "No se encontró nada en {{- dimensionTitle}}" msgid "Search" msgstr "Buscar" msgid "Nothing found for {{- searchTerm}}" -msgstr "" +msgstr "No se encontró nada para {{- searchTerm}}" msgid "Delete {{fileType}}" -msgstr "" +msgstr "Eliminar {{fileType}}" msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" - -msgid "Cancel" -msgstr "Cancelar" +"Este {{fileType}} y las interpretaciones relacionadas se eliminarán. " +"¿Continuar?" msgid "Delete" msgstr "Eliminar" @@ -231,28 +315,28 @@ msgid "New" msgstr "Nuevo" msgid "Open…" -msgstr "" +msgstr "Abrir…" msgid "Save" msgstr "Guardar" msgid "Save…" -msgstr "" +msgstr "Guardar…" msgid "Save as…" -msgstr "" +msgstr "Guardar como…" msgid "Rename…" -msgstr "" +msgstr "Renombrar…" msgid "Translate…" -msgstr "" +msgstr "Traducir…" msgid "Share…" -msgstr "" +msgstr "Compartir…" msgid "Get link…" -msgstr "" +msgstr "Obtener enlace…" msgid "Open in this app" msgstr "Abierto en esta aplicación" @@ -261,7 +345,7 @@ msgid "Close" msgstr "Cerrar" msgid "Rename {{fileType}}" -msgstr "" +msgstr "Renombrar {{fileType}}" msgid "Name" msgstr "Nombre" @@ -272,20 +356,23 @@ msgstr "Descripción" msgid "Rename" msgstr "Renombrar" +msgid "{{- objectName}} (copy)" +msgstr "{{- objectName}} (copia)" + msgid "Save {{fileType}} as" -msgstr "" +msgstr "Guardar {{fileType}} como" msgid "event report" msgstr "informe de evento" msgid "line list" -msgstr "" +msgstr "listados" msgid "map" msgstr "mapa" msgid "visualization" -msgstr "" +msgstr "visualización" msgid "Edit" msgstr "Editar" @@ -294,111 +381,104 @@ msgid "Write a reply" msgstr "Escribe una respuesta" msgid "Post reply" -msgstr "" +msgstr "Publicar respuesta" + +msgid "Delete failed" +msgstr "Fallado el proceso de eliminar" msgid "Could not update comment" -msgstr "" +msgstr "No se pudo actualizar el comentario" msgid "Enter comment text" -msgstr "" +msgstr "Introducir el texto del comentario" msgid "Update" msgstr "Actualizar" msgid "Viewing interpretation: {{- visualisationName}}" -msgstr "" +msgstr "Visualización de la interpretación: {{- visualisationName}}" msgid "Could not load interpretation" -msgstr "" +msgstr "No se pudo cargar la interpretación" msgid "" "The interpretation couldn’t be displayed. Try again or contact your system " "administrator." msgstr "" +"No se ha podido mostrar la interpretación. Vuelva a intentarlo o póngase en " +"contacto con el administrador del sistema." msgid "Hide interpretation" -msgstr "" +msgstr "Ocultar interpretación" msgid "Write an interpretation" msgstr "Escribir una interpretación" -msgid "Post interpretation" +msgid "" +"Other people viewing this interpretation in the future may see more data." msgstr "" +"Otras personas que vean esta interpretación en el futuro podrían ver más " +"datos." + +msgid "Post interpretation" +msgstr "Interpretación posterior" msgid "Interpretations" msgstr "Interpretaciones" +msgid "Reply" +msgstr "Responder" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{contar}} respuesta" +msgstr[1] "{{contar}} respuestas" +msgstr[2] "{{count}} respuestas" + +msgid "View replies" +msgstr "Ver respuestas" + msgid "Unlike" msgstr "diferente a" msgid "Like" msgstr "como" -msgid "Reply" -msgstr "Responder" +msgid "See interpretation" +msgstr "Ver interpretación" + +msgid "Open in app" +msgstr "Abrir en la aplicación" msgid "Share" msgstr "Compartir" -msgid "See interpretation" -msgstr "" - msgid "Manage sharing" msgstr "Administrar compartir" msgid "Could not update interpretation" -msgstr "" +msgstr "No se pudo actualizar la interpretación" msgid "Enter interpretation text" -msgstr "" - -msgid "Bold text" -msgstr "" - -msgid "Italic text" -msgstr "" - -msgid "Link to a URL" -msgstr "" - -msgid "Mention a user" -msgstr "" - -msgid "Add emoji" -msgstr "" - -msgid "Preview" -msgstr "" - -msgid "Back to write mode" -msgstr "" - -msgid "Too many results. Try refining the search." -msgstr "" - -msgid "Search for a user" -msgstr "" +msgstr "Introducir el texto de la interpretación" -msgid "Searching for \"{{- searchText}}\"" -msgstr "" - -msgid "No results found" -msgstr "No results found" +msgid "Not available offline" +msgstr "No disponible sin conexión a internet" msgid "Created by" msgstr "Creado por" msgid "Anyone" -msgstr "Alguien" +msgstr "Todos" msgid "Only you" -msgstr "" +msgstr "Solo tú" msgid "Others" msgstr "Otros" msgid "Not supported by this app yet" -msgstr "" +msgstr "Todavía no es soportado por esta aplicación" msgid "Filter by name" msgstr "Filtrar por nombre" @@ -416,104 +496,122 @@ msgid "Clear filters" msgstr "Limpiar filtros" msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" -msgstr "" +msgstr "{{firstItemIndex}}-{{lastItemIndex}} de {{totalNumberOfItems}}" msgid "Open" msgstr "Abierto" msgid "Couldn't load items" -msgstr "" +msgstr "No se pudieron cargar los elementos" msgid "" "There was a problem loading items. Try again or contact your system " "administrator." msgstr "" +"Hubo un problema al cargar los elementos. Vuelva a intentarlo o póngase en " +"contacto con el administrador del sistema." msgid "No items found. Create a new to get started." -msgstr "" +msgstr "No se han encontrado elementos. Cree uno nuevo para comenzar." msgid "" "No items found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"No se han encontrado elementos. Intente ajustar las opciones de búsqueda o " +"filtro para encontrar lo que está buscando." msgid "Create new" msgstr "Crear nuevo" msgid "Open a visualization" -msgstr "" +msgstr "Abrir una visualización" msgid "Loading visualizations" -msgstr "" +msgstr "Cargando visualizaciones" msgid "Couldn't load visualizations" -msgstr "" +msgstr "No se pudieron cargar las visualizaciones" msgid "" "There was a problem loading visualizations. Try again or contact your system" " administrator." msgstr "" +"Hubo un problema al cargar las visualizaciones. Vuelva a intentarlo o " +"póngase en contacto con el administrador del sistema." msgid "No visualizations found. Click New visualization to get started." msgstr "" +"No se han encontrado visualizaciones. Haga clic en Nueva visualización para " +"comenzar." msgid "" "No visualizations found. Try adjusting your search or filter options to find" " what you're looking for." msgstr "" +"No se han encontrado visualizaciones. Intente ajustar las opciones de " +"búsqueda o filtro para encontrar lo que está buscando." msgid "New visualization" -msgstr "" +msgstr "Nueva visualización" msgid "Open a map" -msgstr "" +msgstr "Abrir un mapa" msgid "Loading maps" -msgstr "" +msgstr "Cargando mapas" msgid "Couldn't load maps" -msgstr "" +msgstr "No se pudieron cargar los mapas" msgid "" "There was a problem loading maps. Try again or contact your system " "administrator." msgstr "" +"Hubo un problema al cargar los mapas. Vuelva a intentarlo o póngase en " +"contacto con el administrador del sistema." msgid "No maps found. Click New map to get started." -msgstr "" +msgstr "No se han encontrado mapas. Haga clic en Nuevo mapa para comenzar." msgid "" "No maps found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"No se han encontrado mapas. Intente ajustar las opciones de búsqueda o " +"filtro para encontrar lo que está buscando." msgid "New map" -msgstr "" +msgstr "Nuevo mapa" msgid "Open a line list" -msgstr "" +msgstr "Abrir un listado" msgid "Loading line lists" -msgstr "" +msgstr "Cargar listados" msgid "Couldn't load line lists" -msgstr "" +msgstr "No se pudieron cargar los listados" msgid "" "There was a problem loading line lists. Try again or contact your system " "administrator." msgstr "" +"Hubo un problema al cargar las listas. Vuelva a intentarlo o póngase en " +"contacto con el administrador del sistema." msgid "No line lists found. Click New line list to get started." -msgstr "" +msgstr "No se encontraron listas. Haga clic en Nueva lista para comenzar." msgid "" "No line lists found. Try adjusting your search or filter options to find " "what you're looking for." msgstr "" +"No se encontraron listas. Intente ajustar sus opciones de búsqueda o filtro " +"para encontrar lo que está buscando." msgid "New line list" -msgstr "" +msgstr "Nuevo listado" msgid "Options" msgstr "Opciones" @@ -523,30 +621,30 @@ msgstr "Ocultar" msgid "{{count}} org units" msgid_plural "{{count}} org units" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} unidad organizativa" +msgstr[1] "{{count}} unidades de organización" +msgstr[2] "{{count}} unidades organizativas" msgid "{{count}} levels" msgid_plural "{{count}} levels" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} nivel" +msgstr[1] "{{count}} niveles" +msgstr[2] "{{count}} niveles" msgid "{{count}} groups" msgid_plural "{{count}} groups" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} grupo" +msgstr[1] "{{count}} grupos" +msgstr[2] "{{count}} grupos" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "" +msgstr "Seleccionado: {{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" -msgstr "" +msgstr "Nada seleccionado" msgid "User organisation unit" -msgstr "Usuario de unidad organizativa" +msgstr "Unidad organizativa del usuario" msgid "User sub-units" msgstr "Subunidades de usuario" @@ -575,60 +673,18 @@ msgstr "Seleccionar año" msgid "Period" msgstr "Periodo" +msgid "Selected Periods" +msgstr "Periodos seleccionados" + msgid "Relative periods" msgstr "Periodos relativos" msgid "Fixed periods" msgstr "Periodos fijos" -msgid "Selected Periods" -msgstr "" - msgid "No periods selected" msgstr "No se ha seleccionado ningún periodo" -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "Diario" @@ -636,16 +692,16 @@ msgid "Weekly" msgstr "Semanal" msgid "Weekly (Start Wednesday)" -msgstr "" +msgstr "Semanal (Inicio miércoles)" msgid "Weekly (Start Thursday)" -msgstr "" +msgstr "Semanal (Inicio jueves)" msgid "Weekly (Start Saturday)" -msgstr "" +msgstr "Semanal (Inicio sábado)" msgid "Weekly (Start Sunday)" -msgstr "" +msgstr "Semanal (Inicio domingo)" msgid "Bi-weekly" msgstr "Quincenal" @@ -669,16 +725,16 @@ msgid "Yearly" msgstr "Anual" msgid "Financial year (Start November)" -msgstr "" +msgstr "Año fiscal (Inicio noviembre)" msgid "Financial year (Start October)" -msgstr "Año fiscal - Octubre" +msgstr "Año fiscal (inicio octubre)" msgid "Financial year (Start July)" -msgstr "Año fiscal - Julio" +msgstr "Año fiscal (inicio Julio)" msgid "Financial year (Start April)" -msgstr "Año fiscal - Abril" +msgstr "Año fiscal (inicio Abril)" msgid "Today" msgstr "Hoy" @@ -699,13 +755,13 @@ msgid "Last 30 days" msgstr "Últimos 30 días" msgid "Last 60 days" -msgstr "" +msgstr "Últimos 60 días" msgid "Last 90 days" -msgstr "" +msgstr "Últimos 90 días" msgid "Last 180 days" -msgstr "" +msgstr "Últimos 180 días" msgid "This week" msgstr "Esta semana" @@ -783,7 +839,7 @@ msgid "Last six-month" msgstr "Último semestre" msgid "Last 2 six-month" -msgstr "" +msgstr "Últimos 2 semestres" msgid "This financial year" msgstr "Este año fiscal" @@ -804,7 +860,7 @@ msgid "Last 5 years" msgstr "Últimos 5 años" msgid "Last 10 years" -msgstr "" +msgstr "Últimos 10 años" msgid "Days" msgstr "Días" @@ -833,32 +889,71 @@ msgstr "Años fiscales" msgid "Years" msgstr "Años" +msgid "Bold text" +msgstr "Texto en negrita" + +msgid "Italic text" +msgstr "Texto en cursiva" + +msgid "Link to a URL" +msgstr "Enlace a una URL" + +msgid "Mention a user" +msgstr "Mencionar a un usuario" + +msgid "Add emoji" +msgstr "Añadir emoji" + +msgid "Preview" +msgstr "Vista previa" + +msgid "Back to write mode" +msgstr "Volver al modo de escritura" + +msgid "Interpretations and details" +msgstr "Interpretaciones y detalles" + msgid "Translating to" -msgstr "" +msgstr "Traducir a" msgid "Choose a locale" -msgstr "" +msgstr "Elegir un idioma" msgid "Base locale reference" -msgstr "" +msgstr "Referencia de configuración regional base" msgid "Choose a locale to translate from the menu above" -msgstr "" +msgstr "Elegir un idioma para traducir desde el menú de arriba" msgid "Translate: {{objectName}}" -msgstr "" +msgstr "Traducir: {{objectName}}" msgid "Save translations" -msgstr "" +msgstr "Guardar traducciones" + +msgid "Cannot save while offline" +msgstr "No se puede guardar sin conexión a internet" msgid "Could not load translations" -msgstr "" +msgstr "No se pudieron cargar las traducciones" msgid "Retry" -msgstr "" +msgstr "Reintentar" + +msgid "Too many results. Try refining the search." +msgstr "Demasiados resultados. Intenta refinar la búsqueda." + +msgid "Search for a user" +msgstr "Buscar un usuario" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "Buscando \"{{- searchText}}\"" + +msgid "No results found" +msgstr "No results found" msgid "Series" -msgstr "" +msgstr "Series" msgid "Category" msgstr "Categoría" @@ -867,34 +962,34 @@ msgid "Filter" msgstr "filtro" msgid "Columns" -msgstr "" +msgstr "Columnas" msgid "Rows" -msgstr "" +msgstr "Filas" msgid "Points" -msgstr "" +msgstr "Puntos" msgid "Reporting rate" -msgstr "" +msgstr "Tasa de informes" msgid "Reporting rate on time" -msgstr "" +msgstr "Tasa de informes a tiempo" msgid "Actual reports" -msgstr "" +msgstr "Informes reales" msgid "Actual reports on time" -msgstr "" +msgstr "Informes reales a tiempo" msgid "Expected reports" -msgstr "" +msgstr "Informes esperados" msgid "Program" msgstr "Programa" msgid "Select a program" -msgstr "" +msgstr "Seleccionar un programa" msgid "Indicators" msgstr "Indicadores" @@ -903,19 +998,16 @@ msgid "Indicator group" msgstr "Grupo de indicadores" msgid "All groups" -msgstr "" +msgstr "Todos los grupos" msgid "Indicator" msgstr "Indicadores" msgid "No indicator groups found" -msgstr "" +msgstr "No se han encontrado grupos de indicadores" msgid "Loading indicator groups" -msgstr "" - -msgid "Data elements" -msgstr "Elementos de datos" +msgstr "Cargando grupos de indicadores" msgid "Data element group" msgstr "Grupo de elemento de datos" @@ -924,10 +1016,10 @@ msgid "Data element" msgstr "Elemento de datos" msgid "No data element groups found" -msgstr "" +msgstr "No se han encontrado grupos de elementos de datos" msgid "Loading data element groups" -msgstr "" +msgstr "Cargando grupos de elementos de datos" msgid "Data sets" msgstr "Sets de datos" @@ -936,34 +1028,63 @@ msgid "Data set" msgstr "Set de Datos\\:" msgid "All data sets" -msgstr "" +msgstr "Todos los sets de datos" msgid "Loading data sets" -msgstr "" +msgstr "Cargando sets de datos" msgid "Event data items" msgstr "Datos de eventos" msgid "All programs" -msgstr "" +msgstr "Todos los programas" msgid "Event data item" msgstr "Event data item" msgid "No programs found" -msgstr "" +msgstr "No se han encontrado programas" msgid "Loading programs" -msgstr "" +msgstr "Cargando programas" msgid "Program indicators" msgstr "Indicadores de programa" msgid "Program indicator" +msgstr "Indicador de Programa" + +msgid "Calculations" +msgstr "Cálculos" + +msgid "Number" +msgstr "Número" + +msgid "Formula is empty. Add items to the formula from the lists on the left." msgstr "" +"La fórmula está vacía. Añada elementos a la fórmula desde las listas de la " +"izquierda." + +msgid "Consecutive math operators" +msgstr "Operadores matemáticos consecutivos" + +msgid "Consecutive data elements" +msgstr "Elementos de datos consecutivos" + +msgid "Starts or ends with a math operator" +msgstr "Comienza o termina con un operador matemático" + +msgid "Empty parentheses" +msgstr "Paréntesis vacíos" + +msgid "Missing right parenthesis )" +msgstr "Falta el paréntesis derecho )" + +msgid "Missing left parenthesis (" +msgstr "Falta el paréntesis izquierdo (" msgid "Extra Small" -msgstr "" +msgstr "Extra pequeño" msgid "Small" msgstr "Pequeña" @@ -975,13 +1096,13 @@ msgid "Large" msgstr "Grande" msgid "Extra Large" -msgstr "" +msgstr "Extra grande" msgid "Left" msgstr "Izquierdo" msgid "Center" -msgstr "" +msgstr "Centrar" msgid "Right" msgstr "Derecha" @@ -990,10 +1111,10 @@ msgid "Start" msgstr "Comienzo" msgid "Middle" -msgstr "" +msgstr "Medio" msgid "End" -msgstr "" +msgstr "Fin" msgid "Top" msgstr "Arriba" @@ -1002,43 +1123,43 @@ msgid "Bottom" msgstr "Abajo" msgid "{{dynamicOuNames}} and {{lastOuName}}" -msgstr "" +msgstr "{{dynamicOuNames}} y {{lastOuName}}" msgid "{{allDynamicOuNames}} levels" -msgstr "" +msgstr "{{allDynamicOuNames}} niveles" msgid "{{allDynamicOuNames}} groups" -msgstr "" +msgstr "{{allDynamicOuNames}} grupos" msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" -msgstr "" +msgstr "{{allDynamicOuNames}} niveles en {{staticOuNames}}" msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" -msgstr "" +msgstr "{{allDynamicOuNames}} grupos en {{staticOuNames}}" msgid "{{percentage}}% of total x values" -msgstr "" +msgstr "{{percentage}}% del total de valores x" msgid "{{percentage}}% of total y values" -msgstr "" +msgstr "{{percentage}}% del total de valores y" msgid "{{thresholdFactor}} × IQR Q1" -msgstr "" +msgstr "{{thresholdFactor}} × IQR Q1" msgid "{{thresholdFactor}} × IQR Q3" -msgstr "" +msgstr "{{thresholdFactor}} × IQR Q3" msgid "{{thresholdFactor}} × Modified Z-score low" -msgstr "" +msgstr "{{thresholdFactor}} × Z-score modificado bajo" msgid "{{thresholdFactor}} × Modified Z-score high" -msgstr "" +msgstr "{{thresholdFactor}} × Z-score modificado alto" msgid "{{thresholdFactor}} × Z-score low" -msgstr "" +msgstr "{{thresholdFactor}} × Z-score bajo" msgid "{{thresholdFactor}} × Z-score high" -msgstr "" +msgstr "{{thresholdFactor}} × Z-score alto" msgid "Data" msgstr "Datos" @@ -1047,7 +1168,7 @@ msgid "Organisation unit" msgstr "Unidad organizativa" msgid "Assigned Categories" -msgstr "" +msgstr "Categorías asignadas" msgid "Pivot table" msgstr "Tabla dinámica" @@ -1056,7 +1177,7 @@ msgid "Area" msgstr "Área" msgid "Stacked area" -msgstr "" +msgstr "Área apilada" msgid "Bar" msgstr "Barra" @@ -1080,7 +1201,7 @@ msgid "Line" msgstr "Línea" msgid "Line list" -msgstr "" +msgstr "Listados" msgid "Year over year (line)" msgstr "Año tras año (línea)" @@ -1092,43 +1213,46 @@ msgid "Radar" msgstr "Radar" msgid "Scatter" -msgstr "" +msgstr "Dispersión" msgid "Single value" msgstr "Valor único" +msgid "Outlier table" +msgstr "tabla de valores atípicos" + msgid "All charts" -msgstr "" +msgstr "Todos los gráficos" msgid "{{seriesName}} (trend)" -msgstr "" +msgstr "{{seriesName}} (tendencia)" msgid "Trend" msgstr "Tendencia" msgid "No legend for this series" -msgstr "" +msgstr "Ninguna leyenda para esta serie" msgid "and {{amount}} more..." -msgstr "" +msgstr "y {{amount}} más..." msgid "Linear Regression" -msgstr "" +msgstr "Regresión lineal" msgid "Target" msgstr "Objetivo" msgid "Base" -msgstr "" +msgstr "Base" msgid "Axis {{axisId}}" -msgstr "" +msgstr "Eje {{axisId}}" msgid "{{count}} items" msgid_plural "{{count}} items" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} elemento" +msgstr[1] "{{count}} artículos" +msgstr[2] "{{count}} artículos" msgid "Reset zoom" -msgstr "" +msgstr "Restablecer zoom" diff --git a/i18n/es_419.po b/i18n/es_419.po index 70265363d..9ea8454a5 100644 --- a/i18n/es_419.po +++ b/i18n/es_419.po @@ -1,14 +1,15 @@ # # Translators: # Jaime Bosque , 2022 +# Enzo Nicolas Rossi , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2024-06-26T14:09:30.876Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Jaime Bosque , 2022\n" -"Language-Team: Spanish (Latin America) (https://www.transifex.com/hisp-uio/teams/100509/es_419/)\n" +"Last-Translator: Enzo Nicolas Rossi , 2024\n" +"Language-Team: Spanish (Latin America) (https://app.transifex.com/hisp-uio/teams/100509/es_419/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -16,616 +17,661 @@ msgstr "" "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" msgid "view only" -msgstr "" +msgstr "ver sólo" msgid "view and edit" -msgstr "" +msgstr "ver y editar" msgid "all users ({{accessLevel}})" -msgstr "" +msgstr "todos los usuarios ({{accessLevel}})" msgid "{{userOrGroup}} ({{accessLevel}})" -msgstr "" +msgstr "{{userOrGroup}} ({{accessLevel}})" msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" -msgstr "" +msgstr "Compartido con {{commaSeparatedListOfUsersAndGroups}}" msgid "Not shared with any users or groups" -msgstr "" +msgstr "No se comparte con ningún usuario o grupo" msgid "No description" -msgstr "" +msgstr "Sin descripción" msgid "Last updated {{time}}" -msgstr "" +msgstr "Última actualización {{time}}" msgid "Created {{time}} by {{author}}" -msgstr "" +msgstr "Creado {{time}} por {{author}}" msgid "Created {{time}}" -msgstr "" +msgstr "Creado {{time}}" msgid "Viewed {{count}} times" msgid_plural "Viewed {{count}} times" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Visto 1 vez" +msgstr[1] "Visto {{count}} veces" +msgstr[2] "Visto {{count}} veces" msgid "Notifications" -msgstr "" +msgstr "Notificaciones" msgid "You're subscribed and getting updates about new interpretations." msgstr "" +"Estás suscrito y recibes actualizaciones sobre nuevas interpretaciones." msgid "Unsubscribe" -msgstr "" +msgstr "Cancelar suscripción" msgid "Subscribe to get updates about new interpretations." msgstr "" +"Suscríbase para recibir información actualizada sobre nuevas " +"interpretaciones." msgid "Subscribe" -msgstr "" +msgstr "Suscríbase a" msgid "About this map" -msgstr "" +msgstr "Acerca de este mapa" msgid "About this line list" -msgstr "" +msgstr "Acerca de esta lista" msgid "About this visualization" -msgstr "" +msgstr "Acerca de esta visualización" msgid "This app could not retrieve required data." -msgstr "" +msgstr "Esta aplicación no pudo recuperar los datos requeridos." msgid "Network error" -msgstr "" +msgstr "Error de red" -msgid "Data Type" +msgid "Data / Edit calculation" +msgstr "Datos / Editar cálculo" + +msgid "Data / New calculation" +msgstr "Datos / Nuevo cálculo" + +msgid "Remove item" +msgstr "Quitar elemento" + +msgid "Check formula" +msgstr "Verificar fórmula" + +msgid "Calculation name" +msgstr "Nombre del cálculo" + +msgid "Shown in table headers and chart axes/legends" msgstr "" +"Se muestra en los encabezados de las tablas y en los ejes/leyendas de los " +"gráficos" -msgid "All types" +msgid "Delete calculation" +msgstr "Borrar cálculo" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "The calculation can only be saved with a valid formula" +msgstr "El cálculo sólo puede guardarse con una fórmula válida" + +msgid "Add a name to save this calculation" +msgstr "Añada un nombre para guardar este cálculo" + +msgid "Save calculation" +msgstr "Guardar cálculo" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." msgstr "" +"¿Está seguro de que desea eliminar este cálculo? Puede ser utilizado por " +"otras visualizaciones." + +msgid "Yes, delete" +msgstr "Sí, borrar" msgid "Totals only" -msgstr "" +msgstr "Sólo totales" msgid "Details only" +msgstr "Sólo detalles" + +msgid "Loading" +msgstr "Cargando" + +msgid "Data elements" +msgstr "Elementos de datos" + +msgid "Search by data element name" +msgstr "Búsqueda por nombre de elemento de datos" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "No se han encontrado datos para \"{{- searchTerm}}\"" + +msgid "No data elements found" +msgstr "No se han encontrado datos" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" msgstr "" +"Arrastre los elementos aquí, o haga doble clic en la lista, para empezar a " +"construir una fórmula de cálculo" + +msgid "Math operators" +msgstr "Operadores matemáticos" + +msgid "Data Type" +msgstr "Tipo de datos" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "Sólo {{dataType}} puede utilizarse en {{visType}}" + +msgid "All types" +msgstr "Todos los tipos" msgid "Disaggregation" -msgstr "" +msgstr "Desagregación" msgid "No data" msgstr "No hay datos" -msgid "Loading" -msgstr "" - msgid "Search by data item name" -msgstr "" +msgstr "Búsqueda por nombre de elemento de datos" msgid "No items selected" -msgstr "" +msgstr "No hay elementos seleccionados" msgid "Selected Items" -msgstr "" +msgstr "Artículos seleccionados" msgid "No indicators found" -msgstr "" - -msgid "No data elements found" -msgstr "" +msgstr "No se han encontrado indicadores" msgid "No data sets found" -msgstr "" +msgstr "No se han encontrado conjuntos de datos" msgid "No event data items found" -msgstr "" +msgstr "No se han encontrado datos de eventos" msgid "No program indicators found" -msgstr "" +msgstr "No se han encontrado indicadores de programa" -msgid "No indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgid "No calculations found" +msgstr "No se han encontrado cálculos" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr "No se han encontrado indicadores para \"{{- searchTerm}}\"" msgid "No data sets found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "No se han encontrado conjuntos de datos para \"{{- searchTerm}}\"" msgid "No event data items found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "No se han encontrado datos de eventos para \"{{- searchTerm}}\"" msgid "No program indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "No se han encontrado indicadores de programa para \"{{- searchTerm}}\"" + +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "No se han encontrado cálculos para \"{{- searchTerm}}\"" msgid "Nothing found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "No se ha encontrado nada para \"{{- searchTerm}}\"" + +msgid "Calculation" +msgstr "Cálculo" msgid "Metric type" -msgstr "" +msgstr "Tipo de métrica" msgid "All metrics" -msgstr "" +msgstr "Todas las métricas" msgid "Move to {{axisName}}" -msgstr "" +msgstr "Mover a {{axisName}}" msgid "Add to {{axisName}}" -msgstr "" +msgstr "Añadir a {{axisName}}" msgid "Not available for {{visualizationType}}" -msgstr "" +msgstr "No disponible para {{visualizationType}}" msgid "Remove Assigned Categories" -msgstr "" +msgstr "Eliminar categorías asignadas" msgid "Add Assigned Categories" -msgstr "" +msgstr "Añadir categorías asignadas" msgid "Remove" -msgstr "" +msgstr "Eliminar" msgid "Filter dimensions" -msgstr "" +msgstr "Dimensiones del filtro" msgid "Main dimensions" -msgstr "" +msgstr "Dimensiones principales" msgid "Your dimensions" -msgstr "" +msgstr "Sus dimensiones" msgid "Dimension recommended with selected data" -msgstr "" +msgstr "Dimensión recomendada con datos seleccionados" msgid "All items" -msgstr "" +msgstr "Todos los artículos" msgid "Automatically include all items" -msgstr "" +msgstr "Incluir automáticamente todos los elementos" msgid "" "Select all {{- dimensionTitle}} items. With this option, new items added in " "the future will be automatically included." msgstr "" +"Seleccionar todos los elementos {{- dimensionTitle}}. Con esta opción, los " +"nuevos elementos que se añadan en el futuro se incluirán automáticamente." msgid "Manually select items..." -msgstr "" +msgstr "Seleccionar elementos manualmente..." msgid "Nothing found in {{- dimensionTitle}}" -msgstr "" +msgstr "No se ha encontrado nada en {{- dimensionTitle}}" msgid "Search" msgstr "Buscar" msgid "Nothing found for {{- searchTerm}}" -msgstr "" +msgstr "No se ha encontrado nada para {{- searchTerm}}" msgid "Delete {{fileType}}" -msgstr "" +msgstr "Borrar {{fileType}}" msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" - -msgid "Cancel" -msgstr "Cancelar" +"Este {{fileType}} y las interpretaciones relacionadas serán eliminados. " +"¿Continuar?" msgid "Delete" msgstr "Borrar" msgid "File" -msgstr "" +msgstr "Archivo" msgid "New" -msgstr "" +msgstr "Nuevo" msgid "Open…" -msgstr "" +msgstr "Abrir..." msgid "Save" msgstr "Guardar" msgid "Save…" -msgstr "" +msgstr "Guardar..." msgid "Save as…" -msgstr "" +msgstr "Guardar como..." msgid "Rename…" -msgstr "" +msgstr "Renombrar..." msgid "Translate…" -msgstr "" +msgstr "Traducir..." msgid "Share…" -msgstr "" +msgstr "Compartir..." msgid "Get link…" -msgstr "" +msgstr "Obtener enlace..." msgid "Open in this app" -msgstr "" +msgstr "Abrir en esta aplicación" msgid "Close" msgstr "Cerrar" msgid "Rename {{fileType}}" -msgstr "" +msgstr "Cambie el nombre de {{fileType}}" msgid "Name" msgstr "Nombre" msgid "Description" -msgstr "" +msgstr "Descripción" msgid "Rename" -msgstr "" +msgstr "Cambie el nombre de" -msgid "{{objectName}} (copy)" -msgstr "" +msgid "{{- objectName}} (copy)" +msgstr "{{- objectName}} (copia)" msgid "Save {{fileType}} as" -msgstr "" +msgstr "Guardar {{fileType}} como" msgid "event report" -msgstr "" +msgstr "informe del evento" msgid "line list" -msgstr "" +msgstr "lista" msgid "map" -msgstr "" +msgstr "mapa" msgid "visualization" -msgstr "" +msgstr "visualización" msgid "Edit" -msgstr "" +msgstr "Editar" msgid "Write a reply" -msgstr "" +msgstr "Escribir una respuesta" msgid "Post reply" -msgstr "" +msgstr "Respuesta" + +msgid "Delete failed" +msgstr "Eliminación fallida" msgid "Could not update comment" -msgstr "" +msgstr "No se ha podido actualizar el comentario" msgid "Enter comment text" -msgstr "" +msgstr "Introduzca el texto del comentario" msgid "Update" msgstr "Actualizar" msgid "Viewing interpretation: {{- visualisationName}}" -msgstr "" +msgstr "Interpretación de la visualización: {{- visualisationName}}" msgid "Could not load interpretation" -msgstr "" +msgstr "No se ha podido cargar la interpretación" msgid "" "The interpretation couldn’t be displayed. Try again or contact your system " "administrator." msgstr "" +"No se ha podido mostrar la interpretación. Inténtelo de nuevo o póngase en " +"contacto con el administrador del sistema." msgid "Hide interpretation" -msgstr "" +msgstr "Ocultar interpretación" msgid "Write an interpretation" +msgstr "Escribir una interpretación" + +msgid "" +"Other people viewing this interpretation in the future may see more data." msgstr "" +"Otras personas que vean esta interpretación en el futuro podrían ver más " +"datos." msgid "Post interpretation" -msgstr "" +msgstr "Interpretación de puestos" msgid "Interpretations" -msgstr "" +msgstr "Interpretaciones" + +msgid "Reply" +msgstr "Respuesta" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} respuesta" +msgstr[1] "{{count}} responde" +msgstr[2] "{{count}} responde" + +msgid "View replies" +msgstr "Ver respuestas" msgid "Unlike" -msgstr "" +msgstr "A diferencia de" msgid "Like" -msgstr "" +msgstr "Como" -msgid "Reply" -msgstr "" +msgid "See interpretation" +msgstr "Ver interpretación" + +msgid "Open in app" +msgstr "Abrir en aplicación" msgid "Share" msgstr "Compartir" -msgid "See interpretation" -msgstr "" - msgid "Manage sharing" -msgstr "" +msgstr "Gestionar el uso compartido" msgid "Could not update interpretation" -msgstr "" +msgstr "No se ha podido actualizar la interpretación" msgid "Enter interpretation text" -msgstr "" - -msgid "Bold text" -msgstr "" - -msgid "Italic text" -msgstr "" - -msgid "Link to a URL" -msgstr "" - -msgid "Mention a user" -msgstr "" - -msgid "Add emoji" -msgstr "" - -msgid "Preview" -msgstr "" - -msgid "Back to write mode" -msgstr "" - -msgid "Too many results. Try refining the search." -msgstr "" - -msgid "Search for a user" -msgstr "" - -msgid "Searching for \"{{- searchText}}\"" -msgstr "" - -msgid "No results found" -msgstr "" +msgstr "Introducir texto de interpretación" msgid "Not available offline" -msgstr "" +msgstr "No disponible sin conexión" msgid "Created by" -msgstr "" +msgstr "Creado por" msgid "Anyone" -msgstr "" +msgstr "Quien sea" msgid "Only you" -msgstr "" +msgstr "Sólo tú" msgid "Others" -msgstr "" +msgstr "Otros" msgid "Not supported by this app yet" -msgstr "" +msgstr "Esta aplicación aún no es compatible" msgid "Filter by name" -msgstr "" +msgstr "Filtrar por nombre" msgid "Created" -msgstr "" +msgstr "Creado" msgid "Last updated" -msgstr "" +msgstr "Última actualización" msgid "Type" -msgstr "" +msgstr "Tipo" msgid "Clear filters" msgstr "Limpiar filtros" msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" -msgstr "" +msgstr "{{firstItemIndex}}-{{lastItemIndex}} de {{totalNumberOfItems}}" msgid "Open" msgstr "Abierto" msgid "Couldn't load items" -msgstr "" +msgstr "No se pueden cargar los artículos" msgid "" "There was a problem loading items. Try again or contact your system " "administrator." msgstr "" +"Se ha producido un problema al cargar los artículos. Inténtelo de nuevo o " +"póngase en contacto con el administrador del sistema." msgid "No items found. Create a new to get started." -msgstr "" +msgstr "No se han encontrado artículos. Crea uno nuevo para empezar." msgid "" "No items found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"No se han encontrado artículos. Prueba a ajustar las opciones de búsqueda o " +"filtro para encontrar lo que buscas." msgid "Create new" msgstr "Crear nuevo" msgid "Open a visualization" -msgstr "" +msgstr "Abrir una visualización" msgid "Loading visualizations" -msgstr "" +msgstr "Cargando visualizaciones" msgid "Couldn't load visualizations" -msgstr "" +msgstr "No se pueden cargar las visualizaciones" msgid "" "There was a problem loading visualizations. Try again or contact your system" " administrator." msgstr "" +"Se ha producido un problema al cargar las visualizaciones. Inténtelo de " +"nuevo o póngase en contacto con el administrador del sistema." msgid "No visualizations found. Click New visualization to get started." msgstr "" +"No se han encontrado visualizaciones. Haga clic en Nueva visualización para " +"empezar." msgid "" "No visualizations found. Try adjusting your search or filter options to find" " what you're looking for." msgstr "" +"No se han encontrado visualizaciones. Prueba a ajustar las opciones de " +"búsqueda o filtro para encontrar lo que buscas." msgid "New visualization" -msgstr "" +msgstr "Nueva visualización" msgid "Open a map" -msgstr "" +msgstr "Abrir un mapa" msgid "Loading maps" -msgstr "" +msgstr "Cargando mapas" msgid "Couldn't load maps" -msgstr "" +msgstr "No se pueden cargar los mapas" msgid "" "There was a problem loading maps. Try again or contact your system " "administrator." msgstr "" +"Se ha producido un problema al cargar los mapas. Inténtalo de nuevo o ponte " +"en contacto con el administrador del sistema." msgid "No maps found. Click New map to get started." -msgstr "" +msgstr "No se han encontrado mapas. Haga clic en Nuevo mapa para empezar." msgid "" "No maps found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"No se han encontrado mapas. Prueba a ajustar las opciones de búsqueda o " +"filtro para encontrar lo que buscas." msgid "New map" -msgstr "" +msgstr "Nuevo mapa" msgid "Open a line list" -msgstr "" +msgstr "Abrir una lista" msgid "Loading line lists" -msgstr "" +msgstr "Carga de listas de líneas" msgid "Couldn't load line lists" -msgstr "" +msgstr "No se pueden cargar las listas" msgid "" "There was a problem loading line lists. Try again or contact your system " "administrator." msgstr "" +"Se ha producido un problema al cargar las listas. Inténtelo de nuevo o " +"póngase en contacto con el administrador del sistema." msgid "No line lists found. Click New line list to get started." msgstr "" +"No se ha encontrado ninguna lista. Haga clic en Nueva lista de líneas para " +"empezar." msgid "" "No line lists found. Try adjusting your search or filter options to find " "what you're looking for." msgstr "" +"No se han encontrado listas. Prueba a ajustar las opciones de búsqueda o " +"filtro para encontrar lo que buscas." msgid "New line list" -msgstr "" +msgstr "Nueva lista" msgid "Options" -msgstr "" +msgstr "Opciones" msgid "Hide" -msgstr "" +msgstr "Ocultar" msgid "{{count}} org units" msgid_plural "{{count}} org units" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} unidad org" +msgstr[1] "{{count}} unidades org" +msgstr[2] "{{count}} unidades org" msgid "{{count}} levels" msgid_plural "{{count}} levels" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} nivel" +msgstr[1] "{{count}} niveles" +msgstr[2] "{{count}} niveles" msgid "{{count}} groups" msgid_plural "{{count}} groups" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} grupo" +msgstr[1] "{{count}} grupos" +msgstr[2] "{{count}} grupos" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "" +msgstr "Seleccionado: {{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" -msgstr "" +msgstr "Nada seleccionado" msgid "User organisation unit" -msgstr "" +msgstr "Unidad organizativa del usuario" msgid "User sub-units" -msgstr "" +msgstr "Subunidades de usuario" msgid "User sub-x2-units" -msgstr "" +msgstr "Subunidadesx2 de usuario" msgid "Select a level" -msgstr "" +msgstr "Seleccione un nivel" msgid "Select a group" -msgstr "" +msgstr "Seleccione un grupo" msgid "Deselect all" -msgstr "" +msgstr "Deseleccionar todo" msgid "Period type" -msgstr "" +msgstr "Tipo de período" msgid "Year" -msgstr "" +msgstr "Año" msgid "Select year" -msgstr "" +msgstr "Seleccione el año" msgid "Period" msgstr "Periodo" +msgid "Selected Periods" +msgstr "Períodos seleccionados" + msgid "Relative periods" -msgstr "" +msgstr "Periodos relativos" msgid "Fixed periods" -msgstr "" - -msgid "Selected Periods" -msgstr "" +msgstr "Periodos fijos" msgid "No periods selected" -msgstr "" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" +msgstr "No hay periodos seleccionados" msgid "Daily" msgstr "Diario" @@ -634,49 +680,49 @@ msgid "Weekly" msgstr "Semanal" msgid "Weekly (Start Wednesday)" -msgstr "" +msgstr "Semanal (Inicio miércoles)" msgid "Weekly (Start Thursday)" -msgstr "" +msgstr "Semanal (Inicio jueves)" msgid "Weekly (Start Saturday)" -msgstr "" +msgstr "Semanal (inicio el sábado)" msgid "Weekly (Start Sunday)" -msgstr "" +msgstr "Semanal (Inicio el domingo)" msgid "Bi-weekly" -msgstr "" +msgstr "Cada dos semanas" msgid "Monthly" msgstr "Mensual" msgid "Bi-monthly" -msgstr "" +msgstr "Bimensual" msgid "Quarterly" -msgstr "" +msgstr "Trimestral" msgid "Six-monthly" -msgstr "" +msgstr "Semestral" msgid "Six-monthly April" -msgstr "" +msgstr "Semestral Abril" msgid "Yearly" msgstr "Anual" msgid "Financial year (Start November)" -msgstr "" +msgstr "Ejercicio financiero (Inicio en noviembre)" msgid "Financial year (Start October)" -msgstr "" +msgstr "Ejercicio financiero (Inicio en octubre)" msgid "Financial year (Start July)" -msgstr "" +msgstr "Ejercicio financiero (inicio en julio)" msgid "Financial year (Start April)" -msgstr "" +msgstr "Ejercicio financiero (Inicio en abril)" msgid "Today" msgstr "Hoy" @@ -685,25 +731,25 @@ msgid "Yesterday" msgstr "Ayer" msgid "Last 3 days" -msgstr "" +msgstr "Últimos 3 días" msgid "Last 7 days" -msgstr "" +msgstr "Últimos 7 días" msgid "Last 14 days" -msgstr "" +msgstr "Últimos 14 días" msgid "Last 30 days" -msgstr "" +msgstr "Últimos 30 días" msgid "Last 60 days" -msgstr "" +msgstr "Últimos 60 días" msgid "Last 90 days" -msgstr "" +msgstr "Últimos 90 días" msgid "Last 180 days" -msgstr "" +msgstr "Últimos 180 días" msgid "This week" msgstr "Esta semana" @@ -712,25 +758,25 @@ msgid "Last week" msgstr "Última semana" msgid "Last 4 weeks" -msgstr "" +msgstr "Últimas 4 semanas" msgid "Last 12 weeks" -msgstr "" +msgstr "Últimas 12 semanas" msgid "Last 52 weeks" -msgstr "" +msgstr "Últimas 52 semanas" msgid "Weeks this year" msgstr "Semanas de este año" msgid "This bi-week" -msgstr "" +msgstr "Esta quincena" msgid "Last bi-week" -msgstr "" +msgstr "Última quincena" msgid "Last 4 bi-weeks" -msgstr "" +msgstr "Últimas 4 bisemanas" msgid "This month" msgstr "Este mes" @@ -739,28 +785,28 @@ msgid "Last month" msgstr "Mes anterior" msgid "Last 3 months" -msgstr "" +msgstr "Últimos 3 meses" msgid "Last 6 months" -msgstr "" +msgstr "Últimos 6 meses" msgid "Last 12 months" -msgstr "" +msgstr "Últimos 12 meses" msgid "Months this year" msgstr "Meses este año" msgid "This bi-month" -msgstr "" +msgstr "Este bimestre" msgid "Last bi-month" -msgstr "" +msgstr "Último bimestre" msgid "Last 6 bi-months" -msgstr "" +msgstr "Últimos 6 bimestres" msgid "Bi-months this year" -msgstr "" +msgstr "Bimensuales este año" msgid "This quarter" msgstr "Este trimestre" @@ -769,19 +815,19 @@ msgid "Last quarter" msgstr "El trimestre pasado" msgid "Last 4 quarters" -msgstr "" +msgstr "Últimos 4 trimestres" msgid "Quarters this year" msgstr "Trimestres de este año" msgid "This six-month" -msgstr "" +msgstr "Estos seis meses" msgid "Last six-month" -msgstr "" +msgstr "Últimos seis meses" msgid "Last 2 six-month" -msgstr "" +msgstr "Últimos 2 semestres" msgid "This financial year" msgstr "Este año fiscal" @@ -790,7 +836,7 @@ msgid "Last financial year" msgstr "Último ejercicio financiero" msgid "Last 5 financial years" -msgstr "" +msgstr "Últimos 5 ejercicios" msgid "This year" msgstr "Este año" @@ -799,10 +845,10 @@ msgid "Last year" msgstr "El año pasado" msgid "Last 5 years" -msgstr "" +msgstr "Últimos 5 años" msgid "Last 10 years" -msgstr "" +msgstr "Últimos 10 años" msgid "Days" msgstr "Días" @@ -811,325 +857,391 @@ msgid "Weeks" msgstr "Semanas" msgid "Bi-weeks" -msgstr "" +msgstr "Dos semanas" msgid "Months" msgstr "Meses" msgid "Bi-months" -msgstr "" +msgstr "Bimensual" msgid "Quarters" -msgstr "" +msgstr "Cuartos" msgid "Six-months" -msgstr "" +msgstr "Seis meses" msgid "Financial Years" -msgstr "" +msgstr "Ejercicios financieros" msgid "Years" msgstr "Años" +msgid "Bold text" +msgstr "Texto en negrita" + +msgid "Italic text" +msgstr "Texto en cursiva" + +msgid "Link to a URL" +msgstr "Enlace a una URL" + +msgid "Mention a user" +msgstr "Mencionar a un usuario" + +msgid "Add emoji" +msgstr "Añadir emoji" + +msgid "Preview" +msgstr "Vista previa" + +msgid "Back to write mode" +msgstr "Volver al modo de escritura" + +msgid "Interpretations and details" +msgstr "Interpretaciones y detalles" + msgid "Translating to" -msgstr "" +msgstr "Traducir a" msgid "Choose a locale" -msgstr "" +msgstr "Elija una localidad" msgid "Base locale reference" -msgstr "" +msgstr "Referencia de la configuración regional básica" msgid "Choose a locale to translate from the menu above" msgstr "" +"Elija la configuración regional que desee traducir en el menú superior" msgid "Translate: {{objectName}}" -msgstr "" +msgstr "Traduce: {{objectName}}" msgid "Save translations" -msgstr "" +msgstr "Guardar traducciones" msgid "Cannot save while offline" -msgstr "" +msgstr "No se puede guardar sin conexión" msgid "Could not load translations" -msgstr "" +msgstr "No se han podido cargar las traducciones" msgid "Retry" -msgstr "" +msgstr "Reintentar" + +msgid "Too many results. Try refining the search." +msgstr "Demasiados resultados. Intenta refinar la búsqueda." + +msgid "Search for a user" +msgstr "Buscar un usuario" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "Buscando \"{{- searchText}}\"" + +msgid "No results found" +msgstr "No se han encontrado resultados" msgid "Series" -msgstr "" +msgstr "Serie" msgid "Category" -msgstr "" +msgstr "Categoría" msgid "Filter" -msgstr "" +msgstr "Filtro" msgid "Columns" -msgstr "" +msgstr "Columnas" msgid "Rows" -msgstr "" +msgstr "Filas" msgid "Points" -msgstr "" +msgstr "Puntos" msgid "Reporting rate" -msgstr "" +msgstr "Índice de notificación" msgid "Reporting rate on time" -msgstr "" +msgstr "Tasa de notificación puntual" msgid "Actual reports" -msgstr "" +msgstr "Informes reales" msgid "Actual reports on time" -msgstr "" +msgstr "Informes reales a tiempo" msgid "Expected reports" -msgstr "" +msgstr "Informes previstos" msgid "Program" -msgstr "" +msgstr "Programa" msgid "Select a program" -msgstr "" +msgstr "Seleccione un programa" msgid "Indicators" msgstr "Indicadores" msgid "Indicator group" -msgstr "" +msgstr "Grupo de indicadores" msgid "All groups" -msgstr "" +msgstr "Todos los grupos" msgid "Indicator" -msgstr "" +msgstr "Indicador" msgid "No indicator groups found" -msgstr "" +msgstr "No se han encontrado grupos de indicadores" msgid "Loading indicator groups" -msgstr "" - -msgid "Data elements" -msgstr "" +msgstr "Grupos de indicadores de carga" msgid "Data element group" -msgstr "" +msgstr "Grupo de elementos de datos" msgid "Data element" -msgstr "" +msgstr "Elemento de datos" msgid "No data element groups found" -msgstr "" +msgstr "No se han encontrado grupos de elementos de datos" msgid "Loading data element groups" -msgstr "" +msgstr "Carga de grupos de elementos de datos" msgid "Data sets" msgstr "Sets de datos" msgid "Data set" -msgstr "" +msgstr "Conjunto de datos" msgid "All data sets" -msgstr "" +msgstr "Todos los conjuntos de datos" msgid "Loading data sets" -msgstr "" +msgstr "Carga de conjuntos de datos" msgid "Event data items" -msgstr "" +msgstr "Datos del evento" msgid "All programs" -msgstr "" +msgstr "Todos los programas" msgid "Event data item" -msgstr "" +msgstr "Datos del evento" msgid "No programs found" -msgstr "" +msgstr "No se han encontrado programas" msgid "Loading programs" -msgstr "" +msgstr "Carga de programas" msgid "Program indicators" -msgstr "" +msgstr "Indicadores del programa" msgid "Program indicator" +msgstr "Indicador de programa" + +msgid "Calculations" +msgstr "Cálculos" + +msgid "Number" +msgstr "Número" + +msgid "Formula is empty. Add items to the formula from the lists on the left." msgstr "" +"La fórmula está vacía. Añada elementos a la fórmula desde las listas de la " +"izquierda." + +msgid "Consecutive math operators" +msgstr "Operadores matemáticos consecutivos" + +msgid "Consecutive data elements" +msgstr "Elementos de datos consecutivos" + +msgid "Starts or ends with a math operator" +msgstr "Comienza o termina con un operador matemático" + +msgid "Empty parentheses" +msgstr "Paréntesis vacíos" + +msgid "Missing right parenthesis )" +msgstr "Falta el paréntesis derecho )" + +msgid "Missing left parenthesis (" +msgstr "Falta el paréntesis izquierdo (" msgid "Extra Small" -msgstr "" +msgstr "Extra pequeña" msgid "Small" -msgstr "" +msgstr "Pequeña" msgid "Regular" -msgstr "" +msgstr "Regular" msgid "Large" -msgstr "" +msgstr "Grande" msgid "Extra Large" -msgstr "" +msgstr "Extra grande" msgid "Left" -msgstr "" +msgstr "Izquierda" msgid "Center" -msgstr "" +msgstr "Centro" msgid "Right" -msgstr "" +msgstr "Derecha" msgid "Start" -msgstr "" +msgstr "Inicio" msgid "Middle" -msgstr "" +msgstr "Medio" msgid "End" -msgstr "" +msgstr "Fin" msgid "Top" -msgstr "" +msgstr "Top" msgid "Bottom" -msgstr "" +msgstr "Fondo" msgid "{{dynamicOuNames}} and {{lastOuName}}" -msgstr "" +msgstr "{{dynamicOuNames}} y {{lastOuName}}" msgid "{{allDynamicOuNames}} levels" -msgstr "" +msgstr "{{allDynamicOuNames}} niveles" msgid "{{allDynamicOuNames}} groups" -msgstr "" +msgstr "{{allDynamicOuNames}} grupos" msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" -msgstr "" +msgstr "{{allDynamicOuNames}} niveles en {{staticOuNames}}" msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" -msgstr "" +msgstr "{{allDynamicOuNames}} grupos en {{staticOuNames}}" msgid "{{percentage}}% of total x values" -msgstr "" +msgstr "{{percentage}}% del total de valores x" msgid "{{percentage}}% of total y values" -msgstr "" +msgstr "{{percentage}}% del total de valores y" msgid "{{thresholdFactor}} × IQR Q1" -msgstr "" +msgstr "{{thresholdFactor}} × IQR Q1" msgid "{{thresholdFactor}} × IQR Q3" -msgstr "" +msgstr "{{thresholdFactor}} × IQR Q3" msgid "{{thresholdFactor}} × Modified Z-score low" -msgstr "" +msgstr "{{thresholdFactor}} × Puntuación Z modificada baja" msgid "{{thresholdFactor}} × Modified Z-score high" -msgstr "" +msgstr "{{thresholdFactor}} × Puntuación Z modificada alta" msgid "{{thresholdFactor}} × Z-score low" -msgstr "" +msgstr "{{thresholdFactor}} × Puntuación Z baja" msgid "{{thresholdFactor}} × Z-score high" -msgstr "" +msgstr "{{thresholdFactor}} × Puntuación Z alta" msgid "Data" msgstr "Datos" msgid "Organisation unit" -msgstr "" +msgstr "Unidad organizativa" msgid "Assigned Categories" -msgstr "" +msgstr "Categorías asignadas" msgid "Pivot table" -msgstr "" +msgstr "Tabla dinámica" msgid "Area" -msgstr "" +msgstr "Área" msgid "Stacked area" -msgstr "" +msgstr "Área apilada" msgid "Bar" -msgstr "" +msgstr "Bar" msgid "Stacked bar" -msgstr "" +msgstr "Barra apilada" msgid "Column" -msgstr "" +msgstr "Columna" msgid "Year over year (column)" -msgstr "" +msgstr "Año sobre año (columna)" msgid "Stacked column" -msgstr "" +msgstr "Columna apilada" msgid "Gauge" -msgstr "" +msgstr "Indicador" msgid "Line" -msgstr "" +msgstr "Línea" msgid "Line list" -msgstr "" +msgstr "Lista de líneas" msgid "Year over year (line)" -msgstr "" +msgstr "Año sobre año (línea)" msgid "Pie" -msgstr "" +msgstr "Pastel" msgid "Radar" -msgstr "" +msgstr "Radar" msgid "Scatter" -msgstr "" +msgstr "Dispersión" msgid "Single value" -msgstr "" +msgstr "Valor único" + +msgid "Outlier table" +msgstr "Tabla de valores atípicos" msgid "All charts" -msgstr "" +msgstr "Todos los gráficos" msgid "{{seriesName}} (trend)" -msgstr "" +msgstr "{{seriesName}} (tendencia)" msgid "Trend" -msgstr "" +msgstr "Tendencia" msgid "No legend for this series" -msgstr "" +msgstr "No hay leyenda para esta serie" msgid "and {{amount}} more..." -msgstr "" +msgstr "y {{amount}} más..." msgid "Linear Regression" -msgstr "" +msgstr "Regresión lineal" msgid "Target" -msgstr "" +msgstr "Objetivo" msgid "Base" -msgstr "" +msgstr "Base" msgid "Axis {{axisId}}" -msgstr "" +msgstr "Eje {{axisId}}" msgid "{{count}} items" msgid_plural "{{count}} items" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} artículo" +msgstr[1] "{{count}} artículos" +msgstr[2] "{{count}} artículos" msgid "Reset zoom" -msgstr "" +msgstr "Restablecer zoom" diff --git a/i18n/fr.po b/i18n/fr.po index 7adeff62c..4cb619f4b 100644 --- a/i18n/fr.po +++ b/i18n/fr.po @@ -1,22 +1,23 @@ # # Translators: # Bram Piot , 2021 -# Yayra Gomado , 2021 # Viktor Varland , 2021 # Gabriela Rodriguez , 2021 # tx_e2f_fr r25 , 2021 # Karoline Tufte Lien , 2022 # Edem Kossi , 2022 -# Yao Selom Saka , 2022 -# phil_dhis2, 2022 +# Yao Selom SAKA (HISP WCA) , 2023 +# Yayra Gomado , 2023 +# Philip Larsen Donnelly, 2024 +# Elise Desailly, 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2024-01-25T12:05:03.360Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: phil_dhis2, 2022\n" -"Language-Team: French (https://www.transifex.com/hisp-uio/teams/100509/fr/)\n" +"Last-Translator: Elise Desailly, 2024\n" +"Language-Team: French (https://app.transifex.com/hisp-uio/teams/100509/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,13 +46,13 @@ msgid "No description" msgstr "Aucune description" msgid "Last updated {{time}}" -msgstr "" +msgstr "Dernière mise à jour à {{time}}" msgid "Created {{time}} by {{author}}" -msgstr "" +msgstr "Créé à {{time}} par {{author}} " msgid "Created {{time}}" -msgstr "" +msgstr "Créé à {{time}}" msgid "Viewed {{count}} times" msgid_plural "Viewed {{count}} times" @@ -64,6 +65,8 @@ msgstr "Notifications" msgid "You're subscribed and getting updates about new interpretations." msgstr "" +"Vous êtes abonné et recevez les mises à jour pour les nouvelles " +"interprétations." msgid "Unsubscribe" msgstr "" @@ -75,25 +78,62 @@ msgid "Subscribe" msgstr "" msgid "About this map" -msgstr "" +msgstr "À propos de cette carte" msgid "About this line list" msgstr "" msgid "About this visualization" -msgstr "" +msgstr "À propos de cette visualisation" msgid "This app could not retrieve required data." -msgstr "" +msgstr "Cette application n'a pas pu récupérer les données nécessaires." msgid "Network error" +msgstr "Erreur réseau" + +msgid "Data / Edit calculation" msgstr "" -msgid "Data Type" -msgstr "Type de données" +msgid "Data / New calculation" +msgstr "" -msgid "All types" -msgstr "Tous les types" +msgid "Remove item" +msgstr "Supprimer l'élément" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "Nom du calcul" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "Supprimer le calcul" + +msgid "Cancel" +msgstr "Annuler" + +msgid "The calculation can only be saved with a valid formula" +msgstr "Le calcul ne peut être sauvegardé qu'avec une formule correcte" + +msgid "Add a name to save this calculation" +msgstr "Ajouter un nom pour sauvegarder ce calcul" + +msgid "Save calculation" +msgstr "Sauvegarder le calcul" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" +"Êtes-vous certain de vouloir supprimer ce calcul ? Il est peut être utilisé " +"par d'autres visualisations." + +msgid "Yes, delete" +msgstr "Oui, supprimer" msgid "Totals only" msgstr "Totaux uniquement" @@ -101,15 +141,44 @@ msgstr "Totaux uniquement" msgid "Details only" msgstr "Détails seulement" +msgid "Loading" +msgstr "Chargement" + +msgid "Data elements" +msgstr "Eléments de données" + +msgid "Search by data element name" +msgstr "Rechercher par le nom d'élément de donnée" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "Aucun élément de données trouvé pour \"{{- searchTerm}}\"" + +msgid "No data elements found" +msgstr "Aucun élément de donnée trouvé" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "Opérateurs mathématiques" + +msgid "Data Type" +msgstr "Type de données" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "" + +msgid "All types" +msgstr "Tous les types" + msgid "Disaggregation" msgstr "Disaggregation" msgid "No data" msgstr "Aucune donnée" -msgid "Loading" -msgstr "Chargement" - msgid "Search by data item name" msgstr "Rechercher par le nom de la donnée" @@ -122,9 +191,6 @@ msgstr "Éléments sélectionnés" msgid "No indicators found" msgstr "Aucun indicateur trouvé" -msgid "No data elements found" -msgstr "Aucun élément de donnée trouvé" - msgid "No data sets found" msgstr "Aucun ensemble de données trouvé" @@ -134,12 +200,12 @@ msgstr "Aucun éléments de données événement trouvé" msgid "No program indicators found" msgstr "Aucun Indicateurs de programme trouvé" +msgid "No calculations found" +msgstr "Aucun calcul trouvé" + msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "Aucun indicateur trouvé pour \"{{- searchTerm}}\"" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "Aucun élément de données trouvé pour \"{{- searchTerm}}\"" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "Aucune donnée trouvée pour \"{{- searchTerm}}\"" @@ -149,9 +215,15 @@ msgstr "Aucune donnée événement retrouvée pour \"{{- searchTerm}}\"" msgid "No program indicators found for \"{{- searchTerm}}\"" msgstr "Aucun Indicateur de programme trouvé pour \"{{- searchTerm}}\"" +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "" + msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "Rien retrouvé pour \"{{- searchTerm}}\"" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "Type de métrique" @@ -159,13 +231,13 @@ msgid "All metrics" msgstr "Tous les éléments" msgid "Move to {{axisName}}" -msgstr "Déménager à {{nomdel'axe}}" +msgstr "Déménager à {{axisName}}" msgid "Add to {{axisName}}" -msgstr "Ajouter à {{nomdel'axe}} " +msgstr "Ajouter à {{axisName}} " msgid "Not available for {{visualizationType}}" -msgstr "Non disponible pour {{Typedevisualisation}}" +msgstr "Non disponible pour {{visualizationType}}" msgid "Remove Assigned Categories" msgstr "Supprimer les Catégories Attribuées" @@ -189,10 +261,10 @@ msgid "Dimension recommended with selected data" msgstr "Dimension recommandée avec les données sélectionnées" msgid "All items" -msgstr "" +msgstr "Tous les items" msgid "Automatically include all items" -msgstr "" +msgstr "Inclure tous les éléments automatiquement" msgid "" "Select all {{- dimensionTitle}} items. With this option, new items added in " @@ -218,9 +290,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Annuler" - msgid "Delete" msgstr "Supprimer" @@ -272,6 +341,9 @@ msgstr "Description" msgid "Rename" msgstr "Renommer" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "Enregistrer {{fileType}} comme" @@ -296,8 +368,11 @@ msgstr "Ecrire une réponse" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Échec de la suppression" + msgid "Could not update comment" -msgstr "" +msgstr "Échec de l'actualisation du commentaire" msgid "Enter comment text" msgstr "" @@ -309,81 +384,69 @@ msgid "Viewing interpretation: {{- visualisationName}}" msgstr "" msgid "Could not load interpretation" -msgstr "" +msgstr "Échec du chargement de l'interprétation" msgid "" "The interpretation couldn’t be displayed. Try again or contact your system " "administrator." msgstr "" +"L'interprétation n'a pas pu être affichée. Veuillez réessayer ou contacter " +"votre administrateur système." msgid "Hide interpretation" -msgstr "" +msgstr "Masquer l'interprétation" msgid "Write an interpretation" msgstr "Ecrire une interprétation" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "Interprétations" +msgid "Reply" +msgstr "Répondre" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} réponses" +msgstr[1] "{{count}} réponses" +msgstr[2] "{{count}} réponses" + +msgid "View replies" +msgstr "Voir les réponses" + msgid "Unlike" msgstr "Je n'aime plus" msgid "Like" msgstr "J'aime" -msgid "Reply" -msgstr "Répondre" +msgid "See interpretation" +msgstr "" + +msgid "Open in app" +msgstr "Ouvrir dans l'application" msgid "Share" msgstr "Partager" -msgid "See interpretation" -msgstr "" - msgid "Manage sharing" msgstr "Gérer le partage" msgid "Could not update interpretation" -msgstr "" +msgstr "Échec de l'actualisation de l'interprétation" msgid "Enter interpretation text" msgstr "" -msgid "Bold text" -msgstr "" - -msgid "Italic text" -msgstr "" - -msgid "Link to a URL" -msgstr "" - -msgid "Mention a user" -msgstr "" - -msgid "Add emoji" -msgstr "" - -msgid "Preview" -msgstr "Aperçu" - -msgid "Back to write mode" -msgstr "" - -msgid "Too many results. Try refining the search." -msgstr "" - -msgid "Search for a user" -msgstr "" - -msgid "Searching for \"{{- searchText}}\"" -msgstr "" - -msgid "No results found" -msgstr "Aucun résultat trouvé" +msgid "Not available offline" +msgstr "Non disponible hors ligne" msgid "Created by" msgstr "Créé par" @@ -466,13 +529,13 @@ msgid "New visualization" msgstr "" msgid "Open a map" -msgstr "" +msgstr "Ouvrir une carte" msgid "Loading maps" -msgstr "" +msgstr "Chargement des cartes" msgid "Couldn't load maps" -msgstr "" +msgstr "Échec du chargement des cartes" msgid "" "There was a problem loading maps. Try again or contact your system " @@ -480,7 +543,7 @@ msgid "" msgstr "" msgid "No maps found. Click New map to get started." -msgstr "" +msgstr "Aucune carte trouvée. Cliquez sur Nouvelle carte pour commencer." msgid "" "No maps found. Try adjusting your search or filter options to find what " @@ -540,10 +603,10 @@ msgstr[1] "" msgstr[2] "" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "" +msgstr "Sélectionné : {{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" -msgstr "" +msgstr "Rien n'a été sélectionné" msgid "User organisation unit" msgstr "Unités d'organisation de l'utilisateur" @@ -575,60 +638,18 @@ msgstr "Sélectionnez année" msgid "Period" msgstr "Période" +msgid "Selected Periods" +msgstr "Périodes sélectionnées" + msgid "Relative periods" msgstr "Périodes relatives" msgid "Fixed periods" msgstr "Périodes fixes" -msgid "Selected Periods" -msgstr "Périodes sélectionnées" - msgid "No periods selected" msgstr "Aucune périodes n'est sélectionnée" -msgid "January" -msgstr "Janvier" - -msgid "February" -msgstr "Février" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "Avril" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juin" - -msgid "July" -msgstr "Juillet" - -msgid "August" -msgstr "Août" - -msgid "September" -msgstr "Septembre" - -msgid "October" -msgstr "Octobre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Décembre" - -msgid "Week {{weekNumber}}" -msgstr "Semaine{{NuméroSemaine}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "Bimensuel{{biWeekNumber}}" - msgid "Daily" msgstr "Quotidien" @@ -833,6 +854,30 @@ msgstr "Années fiscales" msgid "Years" msgstr "Années" +msgid "Bold text" +msgstr "Texte en gras" + +msgid "Italic text" +msgstr "" + +msgid "Link to a URL" +msgstr "" + +msgid "Mention a user" +msgstr "" + +msgid "Add emoji" +msgstr "" + +msgid "Preview" +msgstr "Aperçu" + +msgid "Back to write mode" +msgstr "" + +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -851,12 +896,27 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" msgid "Retry" msgstr "" +msgid "Too many results. Try refining the search." +msgstr "" + +msgid "Search for a user" +msgstr "" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "" + +msgid "No results found" +msgstr "Aucun résultat trouvé" + msgid "Series" msgstr "Séries" @@ -914,9 +974,6 @@ msgstr "Aucun groupe d'indicateurs trouvé" msgid "Loading indicator groups" msgstr "Chargement des groupes d'indicateurs" -msgid "Data elements" -msgstr "Eléments de données" - msgid "Data element group" msgstr "Groupe d'éléments de données" @@ -962,6 +1019,33 @@ msgstr "Program indicators" msgid "Program indicator" msgstr "Gestion des indicateurs de programme" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Nombre" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "Super petit" @@ -1002,19 +1086,19 @@ msgid "Bottom" msgstr "Bas" msgid "{{dynamicOuNames}} and {{lastOuName}}" -msgstr "{{NomsOudynamiques}} et {{dernièreOuNom}}" +msgstr "{{dynamicOuNames}} et {{lastOuName}}" msgid "{{allDynamicOuNames}} levels" -msgstr "{{touslesnomsOudynamiques}} niveaux" +msgstr "{{allDynamicOuNames}} niveaux" msgid "{{allDynamicOuNames}} groups" -msgstr "{{touslesnomsOudynamiques}} groupes" +msgstr "{{allDynamicOuNames}} groupes" msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" -msgstr "{{touslesnomsOudynamiques}} niveaux dans {{NomsOustatiques}} " +msgstr "{{allDynamicOuNames}} niveaux dans {{staticOuNames}} " msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" -msgstr "{{touslesnomsOudynamiques}} groupes dans {{NomsOustatiques}}" +msgstr "{{allDynamicOuNames}} groupes dans {{staticOuNames}}" msgid "{{percentage}}% of total x values" msgstr "{{percentage}}% de nombre total de X valeurs" @@ -1097,6 +1181,9 @@ msgstr "Dispersion" msgid "Single value" msgstr "Valeur unique" +msgid "Outlier table" +msgstr "" + msgid "All charts" msgstr "" @@ -1122,7 +1209,7 @@ msgid "Base" msgstr "Base" msgid "Axis {{axisId}}" -msgstr "Axe {{{axisId}}" +msgstr "Axe {{axisId}}" msgid "{{count}} items" msgid_plural "{{count}} items" diff --git a/i18n/id.po b/i18n/id.po index 3534dcecc..fb1292fe5 100644 --- a/i18n/id.po +++ b/i18n/id.po @@ -1,19 +1,20 @@ # # Translators: -# phil_dhis2, 2021 -# Untoro Dwi Raharjo , 2021 # Carwoto Sa'an , 2022 # Guardian Sanjaya , 2022 # Aprisa Chrysantina , 2022 -# Viktor Varland , 2022 +# Viktor Varland , 2023 +# Yusuf Setiawan , 2023 +# Untoro Dwi Raharjo , 2023 +# Philip Larsen Donnelly, 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-09-27T14:15:13.876Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Viktor Varland , 2022\n" -"Language-Team: Indonesian (https://www.transifex.com/hisp-uio/teams/100509/id/)\n" +"Last-Translator: Philip Larsen Donnelly, 2024\n" +"Language-Team: Indonesian (https://app.transifex.com/hisp-uio/teams/100509/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -84,11 +85,46 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" -msgstr "Tipe Data" +msgid "Data / Edit calculation" +msgstr "" -msgid "All types" -msgstr "Semua jenis" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Batal" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" msgid "Totals only" msgstr "Total saja" @@ -96,15 +132,41 @@ msgstr "Total saja" msgid "Details only" msgstr "Detail saja" +msgid "Loading" +msgstr "Loading" + +msgid "Data elements" +msgstr "Data elemen" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "Tidak ada elemen data yang ditemukan untuk \"{{- searchTerm}}\"" + +msgid "No data elements found" +msgstr "Tidak ada elemen data yang ditemukan" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "Tipe Data" + +msgid "All types" +msgstr "Semua jenis" + msgid "Disaggregation" msgstr "Disagregasi" msgid "No data" msgstr "Tidak ada data" -msgid "Loading" -msgstr "Loading" - msgid "Search by data item name" msgstr "Cari berdasarkan nama item data" @@ -117,9 +179,6 @@ msgstr "Item yang Dipilih" msgid "No indicators found" msgstr "Tidak ada indikator yang ditemukan" -msgid "No data elements found" -msgstr "Tidak ada elemen data yang ditemukan" - msgid "No data sets found" msgstr "Tidak ada kumpulan data yang ditemukan" @@ -132,9 +191,6 @@ msgstr "Tidak ada indikator program yang ditemukan" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "Tidak ada indikator yang ditemukan untuk \"{{- searchTerm}}\"" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "Tidak ada elemen data yang ditemukan untuk \"{{- searchTerm}}\"" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "Tidak ada kumpulan data yang ditemukan untuk \"{{- searchTerm}}\"" @@ -147,6 +203,9 @@ msgstr "Tidak ada indikator program yang ditemukan untuk \"{{- searchTerm}}\"" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "Tidak ada yang ditemukan untuk \"{{- searchTerm}}\"" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "Jenis metrik" @@ -213,9 +272,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "{{fileType}} ini dan interpretasi terkait akan dihapus. Terus?" -msgid "Cancel" -msgstr "Batal" - msgid "Delete" msgstr "Hapus" @@ -267,6 +323,9 @@ msgstr "Deskripsi" msgid "Rename" msgstr "Ganti nama" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "Simpan {{fileType}} sebagai" @@ -291,6 +350,9 @@ msgstr "" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Hapus yang gagal" + msgid "Could not update comment" msgstr "" @@ -317,21 +379,32 @@ msgstr "" msgid "Write an interpretation" msgstr "" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "Interpretasi" +msgid "Reply" +msgstr "Balas" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "balasan {{count}} " + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "Batalkan Suka" msgid "Like" msgstr "Suka" -msgid "Reply" -msgstr "Balas" - msgid "Share" msgstr "Bagikan" @@ -380,6 +453,9 @@ msgstr "" msgid "No results found" msgstr "Tidak ada hasil ditemukan" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "Dibuat oleh" @@ -589,48 +665,6 @@ msgstr "Periode yang Dipilih" msgid "No periods selected" msgstr "Tidak ada periode yang dipilih" -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Maret" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "Agustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgid "Week {{weekNumber}}" -msgstr "Minggu {{weekNumber}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "Dua Minggu {{biWeekNumber}}" - msgid "Daily" msgstr "Harian" @@ -835,6 +869,9 @@ msgstr "Keuangan tahunan" msgid "Years" msgstr "Tahun" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -853,6 +890,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -916,9 +956,6 @@ msgstr "Tidak ada grup indikator yang ditemukan" msgid "Loading indicator groups" msgstr "Memuat grup indikator" -msgid "Data elements" -msgstr "Data elemen" - msgid "Data element group" msgstr "Grup elemen data" @@ -964,6 +1001,33 @@ msgstr "Indikator program" msgid "Program indicator" msgstr "Indikator program" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Angka" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "Ekstra kecil" @@ -1025,10 +1089,10 @@ msgid "{{percentage}}% of total y values" msgstr "{{percentage}}% dari total nilai y" msgid "{{thresholdFactor}} × IQR Q1" -msgstr "{{faktor ambang}} × IQR Q1" +msgstr "{{thresholdFactor}} × IQR Q1" msgid "{{thresholdFactor}} × IQR Q3" -msgstr "{{Faktor ambang}} × IQR Q3" +msgstr "{{thresholdFactor}} × IQR Q3" msgid "{{thresholdFactor}} × Modified Z-score low" msgstr "{{thresholdFactor}} × Modifikasi Z-score rendah" @@ -1040,7 +1104,7 @@ msgid "{{thresholdFactor}} × Z-score low" msgstr "{{thresholdFactor}} × Z-skor rendah" msgid "{{thresholdFactor}} × Z-score high" -msgstr "{{ThresholdFactor}} × Z-skor tinggi" +msgstr "{{thresholdFactor}} × Z-skor tinggi" msgid "Data" msgstr "Data" @@ -1112,7 +1176,7 @@ msgid "No legend for this series" msgstr "Tidak ada legenda untuk seri ini" msgid "and {{amount}} more..." -msgstr "dan {{jumlah}} lainnya..." +msgstr "dan {{amount}} lainnya..." msgid "Linear Regression" msgstr "Regresi linier" diff --git a/i18n/km.po b/i18n/km.po index bd4121b2e..187ebf364 100644 --- a/i18n/km.po +++ b/i18n/km.po @@ -1,15 +1,16 @@ # # Translators: -# phil_dhis2, 2022 # Viktor Varland , 2022 +# phil_dhis2, 2023 +# channara rin, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-05-24T12:55:52.925Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Viktor Varland , 2022\n" -"Language-Team: Khmer (https://www.transifex.com/hisp-uio/teams/100509/km/)\n" +"Last-Translator: channara rin, 2023\n" +"Language-Team: Khmer (https://app.transifex.com/hisp-uio/teams/100509/km/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -80,10 +81,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "បោះបង់" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -92,15 +128,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "Loading" + +msgid "Data elements" +msgstr "Data elements" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + msgid "Disaggregation" msgstr "" msgid "No data" msgstr "" -msgid "Loading" -msgstr "Loading" - msgid "Search by data item name" msgstr "" @@ -113,9 +175,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -128,9 +187,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -143,6 +199,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -209,9 +268,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "បោះបង់" - msgid "Delete" msgstr "​លុប​" @@ -263,6 +319,9 @@ msgstr "ការ​ពិពណ៌នា" msgid "Rename" msgstr "ប្ដូរ​ឈ្មោះ" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -374,6 +433,9 @@ msgid "Searching for \"{{- searchText}}\"" msgstr "" msgid "No results found" +msgstr "មិនមានលទ្ធផលបង្ហាញ" + +msgid "Not available offline" msgstr "" msgid "Created by" @@ -572,48 +634,6 @@ msgstr "" msgid "No periods selected" msgstr "" -msgid "January" -msgstr "មករា​" - -msgid "February" -msgstr "កុម្ភៈ​" - -msgid "March" -msgstr "មីនា​" - -msgid "April" -msgstr "មេសា​" - -msgid "May" -msgstr "ឧសភា​" - -msgid "June" -msgstr "មិថុនា​" - -msgid "July" -msgstr "កក្កដា​" - -msgid "August" -msgstr "សីហា​" - -msgid "September" -msgstr "កញ្ញា​" - -msgid "October" -msgstr "តុលា​" - -msgid "November" -msgstr "វិច្ឆិកា​" - -msgid "December" -msgstr "ធ្នូ​" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "រាល់​ថ្ងៃ" @@ -669,7 +689,7 @@ msgid "Today" msgstr "" msgid "Yesterday" -msgstr "" +msgstr "កាលពីម្សិលមិញ" msgid "Last 3 days" msgstr "" @@ -818,6 +838,9 @@ msgstr "" msgid "Years" msgstr "ឆ្នាំ" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -836,6 +859,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -891,7 +917,7 @@ msgid "All groups" msgstr "" msgid "Indicator" -msgstr "" +msgstr "សួចនាករ" msgid "No indicator groups found" msgstr "" @@ -899,9 +925,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Data elements" - msgid "Data element group" msgstr "" @@ -947,6 +970,33 @@ msgstr "" msgid "Program indicator" msgstr "" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "តួរលេខ" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/lo.po b/i18n/lo.po index ccb6d28a7..d77d79e5a 100644 --- a/i18n/lo.po +++ b/i18n/lo.po @@ -1,17 +1,19 @@ # # Translators: -# phil_dhis2, 2022 # Viktor Varland , 2022 # Somkhit Bouavong , 2022 -# Saysamone Sibounma, 2022 +# Philip Larsen Donnelly, 2023 +# Phouthasinh PHEUAYSITHIPHONE, 2023 +# Namwan Chanthavisouk, 2024 +# Saysamone Sibounma, 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2024-10-11T12:49:26.846Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Saysamone Sibounma, 2022\n" -"Language-Team: Lao (https://www.transifex.com/hisp-uio/teams/100509/lo/)\n" +"Last-Translator: Saysamone Sibounma, 2024\n" +"Language-Team: Lao (https://app.transifex.com/hisp-uio/teams/100509/lo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,80 +21,155 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" msgid "view only" -msgstr "" +msgstr "ເບິ່ງຢ່າງດຽວ" msgid "view and edit" -msgstr "" +msgstr "ເບິ່ງ ແລະ ແກ້ໄຂ" msgid "all users ({{accessLevel}})" -msgstr "" +msgstr "ຜູ້ໃຊ້ທັງໝົດ ( {{accessLevel}} )" msgid "{{userOrGroup}} ({{accessLevel}})" -msgstr "" +msgstr " {{userOrGroup}} ({{accessLevel}} )" msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" -msgstr "" +msgstr "ແບ່ງປັນໃຫ້ກັບ {{commaSeparatedListOfUsersAndGroups}}" msgid "Not shared with any users or groups" -msgstr "" +msgstr "ບໍ່ໃຫ້ແບ່ງປັນກັບຜູ້ໃຊ້ ແລະ ກຸ່ມອື່ນ" msgid "No description" msgstr "ບໍ່ມີລາຍລະອຽດ" msgid "Last updated {{time}}" -msgstr "" +msgstr "ແກ້ໄຂລ່າສຸດ {{time}}" msgid "Created {{time}} by {{author}}" -msgstr "" +msgstr "ສ້າງ {{time}} ໂດຍ {{author}}" msgid "Created {{time}}" -msgstr "" +msgstr "ສ້າງ {{time}}" msgid "Viewed {{count}} times" msgid_plural "Viewed {{count}} times" -msgstr[0] "" +msgstr[0] "ກວດເບິ່ງ {{count}} ຄັ້ງ" msgid "Notifications" -msgstr "" +msgstr "ການແຈ້ງເຕືອນ" msgid "You're subscribed and getting updates about new interpretations." -msgstr "" +msgstr "ທ່ານກົດປູ່ມສະໜັກ ເພື່ອຈະໄດ້ອັບເດດ ແລະ ຮັບຂໍ້ມູນໃໝ່" msgid "Unsubscribe" -msgstr "" +msgstr "ຍົກເລີກການສະໝັກ" msgid "Subscribe to get updates about new interpretations." -msgstr "" +msgstr "ສະໝັກເພື່ອທີ່ຈະຮັບຮູ້ຂໍ້ມູນໃໝ່" msgid "Subscribe" -msgstr "" +msgstr "ສະໝັກ" msgid "About this map" -msgstr "" +msgstr "ກ່ຽວກັບແຜນທີ່" msgid "About this line list" -msgstr "" +msgstr "ກ່ຽວກັບບັນຊີລາຍຊື່" msgid "About this visualization" -msgstr "" +msgstr "ກ່ຽວກັບການສ້າງພາບຂໍ້ມູນ" + +msgid "About this event chart" +msgstr "ກ່ຽວກັບເຫດການແຜນຜັງ" + +msgid "About this event report" +msgstr "ກ່ຽວກັບບົດລາຍງານເຫດການຕ່າງໆ" msgid "This app could not retrieve required data." -msgstr "" +msgstr "ແອັບນີ້ບໍ່ສາມາດດຶງຂໍ້ມູນທີ່ຕ້ອງການໄດ້" msgid "Network error" -msgstr "" +msgstr "ຂໍ້ຜິດພາດທາງເຄື່ອຂ່າຍ" -msgid "Data Type" -msgstr "" +msgid "Data / Edit calculation" +msgstr "ຂໍ້ມູນ / ແກ້ໄຂການຄິດໄລ່" -msgid "All types" +msgid "Data / New calculation" +msgstr "ຂໍ້ມູນ / ຄິດໄລ່ໃໝ່" + +msgid "Remove item" +msgstr "ເອົາລາຍການອອກ" + +msgid "Check formula" +msgstr "ກວດເບິ່ງສູດ" + +msgid "Calculation name" +msgstr "ຊື່ການຄິດໄລ່" + +msgid "Shown in table headers and chart axes/legends" +msgstr "ສະ​ແດງ​​ຢູ່​ເທິງຕາ​ຕະ​ລາງ​ ແລະ​ ແກນ​ແຜນ​ວາດ" + +msgid "Delete calculation" +msgstr "ລົບການຄິດໄລ່" + +msgid "Cancel" +msgstr "ຍົກເລີກ" + +msgid "The calculation can only be saved with a valid formula" +msgstr "ການຄິດໄລ່ແມ່ນຖືກບັນທຶກດ້ວຍສູດທີ່ຖືກຕ້ອງເທົ່ານັ້ນ" + +msgid "Add a name to save this calculation" +msgstr "ເພີ່ມຊື່ເພື່ບັນທຶກການຄິດໄລ່" + +msgid "Save calculation" +msgstr "ບັນທຶກການຄິດໄລ່" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." msgstr "" +"ເຈົ້າແນ່ໃຈບໍ່ສິລືບຂໍ້ມູນການຄິດໄລ່ນີ້? " +"ຂໍ້ມູນດັ້ງກ່າວອາດຈະຖືກນໍາໃຊ້ໃນການສ້າງພາບຂໍ້ມູນໃໝ່ກໍ່ເປັນໄດ້" + +msgid "Yes, delete" +msgstr "ຢືນຢັນ, ລົບ" msgid "Totals only" -msgstr "" +msgstr "ທັງໝົດເທົ່ານັ້ນ" msgid "Details only" -msgstr "" +msgstr "ລາຍລະອຽດເທົ່ານັ້ນ" + +msgid "Loading" +msgstr "ກໍາລັງໂຫຼດ" + +msgid "Data elements" +msgstr "ອົງປະກອບຂໍ້ມູນ" + +msgid "Search by data element name" +msgstr "ຄົ້ນຫາໂດຍຊື່ອົງປະກອບຂໍ້ມູນ" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "ບໍ່ພົບອົງປະກອບຂໍ້ມູນຂອງ \"{{- searchTerm}}\"" + +msgid "No data elements found" +msgstr "ບໍ່ພົບອົງປະກອບຂໍ໊ມູນ" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "ລາກລາຍການມາບ່ອນນີ້, ຫຼືຄລິກສອງເທື່ອໃນລາຍການເພື່ອສ້າງສູດການຄິດໄລ່" + +msgid "Math operators" +msgstr "ຕົວປະຕິບັດການຄະນິດສາດ" + +msgid "Data Type" +msgstr "ຊະນິດຂໍ້ມູນ" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "ມີພຽງ {{dataType}} ທີສາມາດໃຊ້ໃນ {{visType}}" + +msgid "All types" +msgstr "ທຸກຊະນິດ" msgid "Disaggregation" msgstr "Disaggregation" @@ -100,119 +177,118 @@ msgstr "Disaggregation" msgid "No data" msgstr "ບໍ່ມີຂໍ້ມູນ" -msgid "Loading" -msgstr "ກໍາລັງໂຫຼດ" - msgid "Search by data item name" -msgstr "" +msgstr "ຄົ້ນຫາໂດຍຊື່ລາຍການຂໍ້ມູນ" msgid "No items selected" -msgstr "" +msgstr "ບໍ່ມີລາຍການທີ່ຖືກເລືອກ" msgid "Selected Items" -msgstr "" +msgstr "ລາຍການທີ່ເລືອກ" msgid "No indicators found" -msgstr "" - -msgid "No data elements found" -msgstr "" +msgstr "ບໍ່ພົບຕົວຊີ້ວັດ" msgid "No data sets found" -msgstr "" +msgstr "ບໍ່ພົບຊຸດຂໍ້ມູນ" msgid "No event data items found" -msgstr "" +msgstr "ບໍ່ພົບຂໍ້ມູນເຫດການ" msgid "No program indicators found" -msgstr "" +msgstr "ບໍ່ພົບໂປຼແກຼມຕົວຊີ້ວັດ" -msgid "No indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgid "No calculations found" +msgstr "ບໍ່ພົບການຄິດໄລ່" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr "ບໍ່ພົບຕົວຊີ້ວັດສຳລັບ \"{{- searchTerm}}\"" msgid "No data sets found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "ບໍ່ພົບຊຸດຂໍ້ມູນສຳລັບ \"{{- searchTerm}}\"" msgid "No event data items found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "ບໍ່ພົບຂໍ້ມູນເຫດການສຳລັບ \"{{- searchTerm}}\"" msgid "No program indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "ບໍ່ພົບໂປຼແກຼມຕົວຊີ້ວັດສຳລັບ \"{{- searchTerm}}\"" + +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "ບໍ່ພົບການຄິດໄລ່ສຳລັບ \"{{- serachTerm}}\"" msgid "Nothing found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "ບໍ່ພົບຫຍັງສຳລັບ \"{{- searchTerm}}\"" + +msgid "Calculation" +msgstr "ການຄິດໄລ່" msgid "Metric type" -msgstr "" +msgstr "ຫົວໜ່ວຍວັດແທກ" msgid "All metrics" msgstr "ທຸກການປັບປຸງ" msgid "Move to {{axisName}}" -msgstr "" +msgstr "ຍ້າຍໄປ {{axisName}}" msgid "Add to {{axisName}}" -msgstr "" +msgstr "ເພີ່ມໃສ່ {{axisName}}" msgid "Not available for {{visualizationType}}" -msgstr "" +msgstr "ບໍ່ມີສໍາລັບ {{visualizationType}}" msgid "Remove Assigned Categories" -msgstr "" +msgstr "ລົບກຸ່ມທີ່ຖືກມອບໝາຍ" msgid "Add Assigned Categories" -msgstr "" +msgstr "ເພີ່ມກຸ່ມທີ່ຖືກມອບໝາຍ" msgid "Remove" msgstr "ລົບອອກ" msgid "Filter dimensions" -msgstr "" +msgstr "ຂະໜາດຕົວຕອງ" msgid "Main dimensions" -msgstr "" +msgstr "ຕົວຕອງທີ່ສຳຄັນ" msgid "Your dimensions" -msgstr "" +msgstr "ຂະໜາດຂອງທ່ານ" msgid "Dimension recommended with selected data" -msgstr "" +msgstr "ຂະໜາດທີ່ແນະນຳດ້ວຍຂໍ້ມູນທີ່ເລືອກ" msgid "All items" -msgstr "" +msgstr "ລາຍການທັງໝົດ" msgid "Automatically include all items" -msgstr "" +msgstr "ເພີ່ມລາຍການທັງໝົດໂດຍອັດຕະໂນມັດ" msgid "" "Select all {{- dimensionTitle}} items. With this option, new items added in " "the future will be automatically included." msgstr "" +"ເລືອກລາຍການທັງໝົດ {{- dimensionTitle}} ດ້ວຍຕົວເລືອກນີ້, " +"ລາຍການໃໝ່ທີ່ເພີ່ມເຂົ້າມາໃນຄັ້ງໜ້າຈະຖືກເພີ່ມຂົ້າໂດຍອັດຕະໂນມັດ." msgid "Manually select items..." -msgstr "" +msgstr "ເລືອກລາຍການດ້ວຍຕົນເອງ..." msgid "Nothing found in {{- dimensionTitle}}" -msgstr "" +msgstr "ບໍ່ຖືກຄົ້ນພົບໃນ {{- dimensionTitle}}" msgid "Search" msgstr "ຄົນຫາ" msgid "Nothing found for {{- searchTerm}}" -msgstr "" +msgstr "ບໍ່ຖືກຄົ້ນພົບສຳລັບ {{- searchTerm}}" msgid "Delete {{fileType}}" -msgstr "" +msgstr "ລົບ {{fileType}}" msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" -msgstr "" - -msgid "Cancel" -msgstr "Cancel" +msgstr "{{fileType}} ນີ້ ແລະ ການຮັບຂໍ້ມູນທີ່ກ່ຽວຂ້ອງຈະຖືກລົບ. ສືບຕໍ່ບໍ່?" msgid "Delete" msgstr "ລົບ" @@ -224,37 +300,37 @@ msgid "New" msgstr "ສ້າງໃຫມ່" msgid "Open…" -msgstr "" +msgstr "ເປີດ..." msgid "Save" msgstr "ບັນທຶກ" msgid "Save…" -msgstr "" +msgstr "ບັນທຶກ..." msgid "Save as…" -msgstr "" +msgstr "ບັນທຶກເປັນ..." msgid "Rename…" -msgstr "" +msgstr "ປ່ຽນຊື່..." msgid "Translate…" -msgstr "" +msgstr "ແປ..." msgid "Share…" -msgstr "" +msgstr "ແບ່ງປັນ..." msgid "Get link…" -msgstr "" +msgstr "ເອົາລິ້ງ..." msgid "Open in this app" -msgstr "" +msgstr "ເປີດແອ໋ບນີ້" msgid "Close" msgstr "ປິດ" msgid "Rename {{fileType}}" -msgstr "" +msgstr "ປ່ຽນຊື່ {{fileType}}" msgid "Name" msgstr "ຊື່" @@ -265,142 +341,126 @@ msgstr "ລາຍລະອຽດ" msgid "Rename" msgstr "ປ່ຽນຊື່" -msgid "{{objectName}} (copy)" -msgstr "" +msgid "{{- objectName}} (copy)" +msgstr "{{- ຊື່ອົງປະກອບ}} (copy)" msgid "Save {{fileType}} as" -msgstr "" +msgstr "ບັນທຶກ {{fileType}} ເປັນ" msgid "event report" -msgstr "" +msgstr "ລາຍງານເຫດການ" msgid "line list" -msgstr "" +msgstr "ບັນຊີລາຍຊື່" msgid "map" -msgstr "" +msgstr "ແຜນທີ່" msgid "visualization" -msgstr "" +msgstr "ການສ້າງພາບຂໍ້ມູນ" msgid "Edit" msgstr "ແກ້ໄຂ" msgid "Write a reply" -msgstr "" +msgstr "ຂຽນການຕອບກັບ" msgid "Post reply" -msgstr "" +msgstr "ຕອບກ່ອນໜ້າ" + +msgid "Delete failed" +msgstr "ການລົບລົ້ມເຫຼວ" msgid "Could not update comment" -msgstr "" +msgstr "ບໍ່ສາມາດອັບເດດຄຳເຫັນໄດ້" msgid "Enter comment text" -msgstr "" +msgstr "ປ້ອນຄຳເຫັນ" msgid "Update" msgstr "ປັບປຸງ" msgid "Viewing interpretation: {{- visualisationName}}" -msgstr "" +msgstr "ເບິ່ງຂໍ້ຄວາມ: {{- visualisationName}}" msgid "Could not load interpretation" -msgstr "" +msgstr "ບໍ່ສາມາດໂຫຼດຂໍ້ຄວາມ" msgid "" "The interpretation couldn’t be displayed. Try again or contact your system " "administrator." -msgstr "" +msgstr "ຂໍ້ຄວາມບໍ່ສາມາດສະແດງໄດ້, ລອງອີກຄັ້ງ ຫຼື ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ" msgid "Hide interpretation" -msgstr "" +msgstr "ເຊື່ອງຂໍ້ຄວາມ" msgid "Write an interpretation" -msgstr "" +msgstr "ຂຽນຂໍ້ຄວາມ" + +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "ຄົນອື່ນໆທີ່ເບິ່ງຂໍ້ຄວາມໃນຄັ້ງໜ້າອາດຈະເຫັນຂໍ້ມູນເພີ່ມ" msgid "Post interpretation" -msgstr "" +msgstr "ຮັບຂໍ້ມູນກ່ອນໜ້າ" msgid "Interpretations" msgstr "ການແປຂໍ້ມູນ" +msgid "Reply" +msgstr "ຕອບກັບ" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} ການຕອບກັບ" + +msgid "View replies" +msgstr "ເບິ່ງການຕອບກັບ" + msgid "Unlike" msgstr "ບໍ່ມັກ" msgid "Like" msgstr "ມັກ" -msgid "Reply" -msgstr "ຕອບກັບ" +msgid "See interpretation" +msgstr "ສະແດງຂໍ້ຄວາມ" + +msgid "Open in app" +msgstr "ເປີດໃນແອ໋ບ" msgid "Share" msgstr "ເຜີຍແຜ່" -msgid "See interpretation" -msgstr "" - msgid "Manage sharing" -msgstr "" +msgstr "ຈັດການການເຜີຍແຜ່" msgid "Could not update interpretation" -msgstr "" +msgstr "ບໍ່ສາມາດອັບເດດຂໍ້ຄວາມ" msgid "Enter interpretation text" -msgstr "" - -msgid "Bold text" -msgstr "" - -msgid "Italic text" -msgstr "" - -msgid "Link to a URL" -msgstr "" - -msgid "Mention a user" -msgstr "" - -msgid "Add emoji" -msgstr "" - -msgid "Preview" -msgstr "" - -msgid "Back to write mode" -msgstr "" - -msgid "Too many results. Try refining the search." -msgstr "" - -msgid "Search for a user" -msgstr "" - -msgid "Searching for \"{{- searchText}}\"" -msgstr "" - -msgid "No results found" -msgstr "" +msgstr "ປ້ອນຂໍ້ຄວາມ" msgid "Not available offline" -msgstr "" +msgstr "ບໍ່ສາມາດໃຊ້ໄດ້ອອບລາຍ" msgid "Created by" msgstr "ສ້າງໂດຍ" msgid "Anyone" -msgstr "" +msgstr "ທຸກຄົນ" msgid "Only you" -msgstr "" +msgstr "ທ່ານຄົນດຽວ" msgid "Others" -msgstr "Others" +msgstr "ອື່ນໆ" msgid "Not supported by this app yet" -msgstr "" +msgstr "ແອັບນີ້ຍັງບໍ່ສາມາດຮອງຮັບເທື່ອ" msgid "Filter by name" -msgstr "Filter by name" +msgstr "ກັ່ນຕອງຈາກຊື່" msgid "Created" msgstr "ສ້າງແລ້ວ" @@ -409,110 +469,119 @@ msgid "Last updated" msgstr "ປັບປຸງ​ຄັ້ງຫລ້າສຸດ" msgid "Type" -msgstr "Type" +msgstr "ຊະນິດ" msgid "Clear filters" msgstr "ປັບປຸງເຄື່ອງມືຄັດຈ້ອນ" msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" -msgstr "" +msgstr "{{firstItemIndex}} {{lastItemIndex}} ຂອງ {{totalNumberOfItems}}" msgid "Open" msgstr "ເປີດ" msgid "Couldn't load items" -msgstr "" +msgstr "ບໍ່ສາມາດໂຫຼດລາຍການໄດ້" msgid "" "There was a problem loading items. Try again or contact your system " "administrator." -msgstr "" +msgstr "ມີບັນຫາໃນການໂຫຼດລາຍການ. ລອງອີກຄັ້ງ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ." msgid "No items found. Create a new to get started." -msgstr "" +msgstr "ບໍ່ພົບລາຍການທີ່ຄົ້ນຫາ. ສ້າງໃໝ່ເພື່ອເລີ່ມຕົ້ນ." msgid "" "No items found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"ບໍ່ພົບລາຍການ. ລອງປັບຕົວເລືອກການຄົ້ນຫາ ຫຼື " +"ຕົວກອງເພື່ອສິ່ງທີ່ທ່ານກໍາລັງຄົ້ນຫາ." msgid "Create new" msgstr "ສ້າງໃໝ່" msgid "Open a visualization" -msgstr "" +msgstr "ເປີດພາບຂໍ້ມູນ" msgid "Loading visualizations" -msgstr "" +msgstr "ໂຫຼດພາບຂໍ້ມູນ" msgid "Couldn't load visualizations" -msgstr "" +msgstr "ບໍ່ສາມາດໂຫຼດພາບຂໍ້ມູນ" msgid "" "There was a problem loading visualizations. Try again or contact your system" " administrator." -msgstr "" +msgstr "ມີບັນຫາໃນການໂຫຼດພາບຂໍ້ມູນ. ລອງອີກຄັ້ງ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ." msgid "No visualizations found. Click New visualization to get started." -msgstr "" +msgstr "ບໍ່ພົບພາບຂໍ້ມູນ. ຄລິກ ເພີ່ມພາບຂໍ້ມູນໃໝ່ ເພື່ອເລີ່ມຕົ້ນ." msgid "" "No visualizations found. Try adjusting your search or filter options to find" " what you're looking for." msgstr "" +"ບໍ່ພົບພາບຂໍ້ມູນ. ລອງປັບຕົວເລືອກການຄົ້ນຫາ ຫຼື " +"ຕົວກອງເພື່ອສິ່ງທີ່ທ່ານກໍາລັງຄົ້ນຫາ." msgid "New visualization" -msgstr "" +msgstr "ພາບຂໍ້ມູນໃໝ່" msgid "Open a map" -msgstr "" +msgstr "ເປີດແຜນທີ່" msgid "Loading maps" -msgstr "" +msgstr "ໂຫຼດແຜນທີ່" msgid "Couldn't load maps" -msgstr "" +msgstr "ບໍ່ສາມາດໂຫຼດແຜນທີ່" msgid "" "There was a problem loading maps. Try again or contact your system " "administrator." -msgstr "" +msgstr "ພົບບັນຫາໃນການ3ຫຼດແຜນທີ່. ລອງໃໝ່ອີກຄັ້ງ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບ" msgid "No maps found. Click New map to get started." -msgstr "" +msgstr "ບໍ່ພົບແຜນທີ່. ຄລິກສ້າງແຜນທີ່ໃໝ່ເພື່ອເລີ່ມຕົ້ນ" msgid "" "No maps found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"ບໍ່ພົບແຜນທີ່. ລອງປັບຕົວເລືອກການຄົ້ນຫາ ຫຼື " +"ຕົວກອງເພື່ອສິ່ງທີ່ທ່ານກໍາລັງຄົ້ນຫາ." msgid "New map" -msgstr "" +msgstr "ແຜນທີ່ໃໝ່" msgid "Open a line list" -msgstr "" +msgstr "ເປີດບັນຊີລາຍຊື່" msgid "Loading line lists" -msgstr "" +msgstr "ໂຫຼດບັນຊີລາຍຊື່" msgid "Couldn't load line lists" -msgstr "" +msgstr "ບໍ່ສາມາດໂຫຼດບັນຊີລາຍຊື່" msgid "" "There was a problem loading line lists. Try again or contact your system " "administrator." msgstr "" +"ພົບບັນຫາໃນການໂຫຼດບັນຊີລາຍຊື່. ລອງອີກຄັ້ງ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ." msgid "No line lists found. Click New line list to get started." -msgstr "" +msgstr "ບໍ່ພົບບັນຊີລາຍຊື່. ຄລິກເພີ່ມບັນຊີລາຍຊື່ໃໝ່ເພື່ອເລີ່ມຕົ້ນ." msgid "" "No line lists found. Try adjusting your search or filter options to find " "what you're looking for." msgstr "" +"ບໍ່ພົບບັນຊີລາຍຊື່. ລອງປັບຕົວເລືອກການຄົ້ນຫາ ຫຼື " +"ຕົວກອງເພື່ອສິ່ງທີ່ທ່ານກໍາລັງຄົ້ນຫາ." msgid "New line list" -msgstr "" +msgstr "ເພີ່ມບັນຊີລາຍຊື່ໃໝ່" msgid "Options" msgstr "ຈັດການ" @@ -522,24 +591,24 @@ msgstr "ເຊື່ອງ" msgid "{{count}} org units" msgid_plural "{{count}} org units" -msgstr[0] "" +msgstr[0] "{{count}} ໜ່ວຍງານອົງການ" msgid "{{count}} levels" msgid_plural "{{count}} levels" -msgstr[0] "" +msgstr[0] "{{count}} ຂັ້ນ" msgid "{{count}} groups" msgid_plural "{{count}} groups" -msgstr[0] "" +msgstr[0] "{{count}} ກຸ່ມ" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "" +msgstr "ເລືອກ {{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" -msgstr "" +msgstr "ບໍ່ມີຫຍັງເລືອກ" msgid "User organisation unit" -msgstr "" +msgstr "ຫນ່ວຍງານການຈັດຕັ້ງຂອງຜູ້ໃຊ້" msgid "User sub-units" msgstr "ຫົວໜ່ວຍຍ່ອຍຂອງທ່ານ" @@ -548,10 +617,10 @@ msgid "User sub-x2-units" msgstr "ຫົວໜ່ວຍຍ່ອຍຂັ້ນສອງຂອງທ່ານ" msgid "Select a level" -msgstr "" +msgstr "ເລືອກຂັ້ນ" msgid "Select a group" -msgstr "" +msgstr "ເລືອກກຸ່ມ" msgid "Deselect all" msgstr "ຍົກເລີກການເລືອກທັງໝົດ" @@ -563,65 +632,23 @@ msgid "Year" msgstr "ປີ" msgid "Select year" -msgstr "" +msgstr "ເລືອກປີ" msgid "Period" msgstr "ຊ່ວງເວລາ" +msgid "Selected Periods" +msgstr "ເລືອກຊ່ວງເວລາ" + msgid "Relative periods" msgstr "​ໄລ​ຍະ​ເວ​ລາ​ໄກ້​ຄຽງ" msgid "Fixed periods" msgstr "ໄລຍະເວລາທີ່ໄດ້ກຳນົດ" -msgid "Selected Periods" -msgstr "" - msgid "No periods selected" msgstr "ບໍ່ທັນໄດ້ເລືອກໄລຍະເວລາ" -msgid "January" -msgstr "ມັງກອນ" - -msgid "February" -msgstr "ກຸມພາ" - -msgid "March" -msgstr "ມີນາ" - -msgid "April" -msgstr "ເມສາ" - -msgid "May" -msgstr "ພຶດສະພາ" - -msgid "June" -msgstr "ມີຖຸນາ" - -msgid "July" -msgstr "ກໍລະກົດ" - -msgid "August" -msgstr "ສິງຫາ" - -msgid "September" -msgstr "ກັນຍາ" - -msgid "October" -msgstr "ຕຸລາ" - -msgid "November" -msgstr "ພະຈິກ" - -msgid "December" -msgstr "ທັນວາ" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "ທຸກໆມື້" @@ -629,19 +656,19 @@ msgid "Weekly" msgstr "ເປັນອາທິດ" msgid "Weekly (Start Wednesday)" -msgstr "" +msgstr "ເປັນອາທິດ (ເລີ່ມຈາກວັນພຸດ)" msgid "Weekly (Start Thursday)" -msgstr "" +msgstr "ເປັນອາທິດ (ເລີ່ມຈາກວັນພະຫັດ)" msgid "Weekly (Start Saturday)" -msgstr "" +msgstr "ເປັນອາທິດ (ເລີ່ມຈາກວັນເສົາ)" msgid "Weekly (Start Sunday)" -msgstr "" +msgstr "ເປັນອາທິດ (ເລີ່ມຈາກວັນອາທິດ)" msgid "Bi-weekly" -msgstr "" +msgstr "ສອງອາທິດຕໍ່ຄັ້ງ" msgid "Monthly" msgstr "ລາຍເດືອນ" @@ -662,7 +689,7 @@ msgid "Yearly" msgstr "ລາຍປີ" msgid "Financial year (Start November)" -msgstr "" +msgstr "ສົກປີງົບປະມານ (ເລີ່ມແຕ່ເດືອນພະຈິກ)" msgid "Financial year (Start October)" msgstr "ສົກປີງົບປະມານ (ເລີ່ມແຕ່ເດືອນຕຸລາ)" @@ -689,16 +716,16 @@ msgid "Last 14 days" msgstr "14 ມື້ກ່ອນ" msgid "Last 30 days" -msgstr "Last 30 days" +msgstr "30 ມື້ກ່ອນ" msgid "Last 60 days" -msgstr "" +msgstr "60 ມື້ກ່ອນ" msgid "Last 90 days" -msgstr "" +msgstr "90 ມື້ກ່ອນ" msgid "Last 180 days" -msgstr "" +msgstr "180 ມື້ກ່ອນ" msgid "This week" msgstr "ທິດນີ້" @@ -719,13 +746,13 @@ msgid "Weeks this year" msgstr "ອາທິດ ຂອງປີນີ້" msgid "This bi-week" -msgstr "" +msgstr "ສອງເທື່ອຕໍ່ອາທິດນີ້" msgid "Last bi-week" -msgstr "" +msgstr "ສອງຄັ້ງລ່າສຸດຕໍ່ທິດ" msgid "Last 4 bi-weeks" -msgstr "" +msgstr "ສອງເດືອນທີ່ຜ່ານມາ" msgid "This month" msgstr "ເດືອນນີ້" @@ -758,7 +785,7 @@ msgid "Bi-months this year" msgstr "ສອງເດືອນ ຂອງປີນີ້" msgid "This quarter" -msgstr "ໄຕມານີ້" +msgstr "ໄຕມາດນີ້" msgid "Last quarter" msgstr "ໄຕມາດຜ່ານມາ" @@ -776,7 +803,7 @@ msgid "Last six-month" msgstr "6 ເດືອນຜ່ານມາ" msgid "Last 2 six-month" -msgstr "" +msgstr "ສອງ 6 ເດືອນຜ່ານມາ" msgid "This financial year" msgstr "ສົກປີງົບປະມານຂອງປິນີ້" @@ -797,7 +824,7 @@ msgid "Last 5 years" msgstr "5 ປີຍ້ອນຫຼັງ" msgid "Last 10 years" -msgstr "" +msgstr "10 ປີຍ້ອນຫຼັງ" msgid "Days" msgstr "ມື້" @@ -806,7 +833,7 @@ msgid "Weeks" msgstr "ອາທິດ" msgid "Bi-weeks" -msgstr "" +msgstr "ສອງເທື່ອຕໍ່ທິດ" msgid "Months" msgstr "ເດືອນ" @@ -821,37 +848,76 @@ msgid "Six-months" msgstr "6 ເດືອນ" msgid "Financial Years" -msgstr "" +msgstr "ສົກປີງົບປະມານ" msgid "Years" msgstr "ປີ" -msgid "Translating to" +msgid "Value: {{value}}" msgstr "" +msgid "Bold text" +msgstr "ຕົວອັກສອນເຂັ້ມ" + +msgid "Italic text" +msgstr "ຕົວອັກສອນສະຫຼ່ຽງ" + +msgid "Link to a URL" +msgstr "ເຊື່ອມຕໍ່ກັບ URL" + +msgid "Mention a user" +msgstr "ກ່າວເຖິງຜູ້ໃຊ້" + +msgid "Add emoji" +msgstr "ເພີ່ມ emoji" + +msgid "Preview" +msgstr "ເບິ່ງຕົວຢ່າງ" + +msgid "Back to write mode" +msgstr "ກັບໄປທີ່ໂໝດຂຽນ" + +msgid "Interpretations and details" +msgstr "ຂໍ້ມູນ ແລະ ລາຍລະອຽດ" + +msgid "Translating to" +msgstr "ແປເປັນ" + msgid "Choose a locale" -msgstr "" +msgstr "ເລືອກສະຖານທີ່ເກີດເຫດ" msgid "Base locale reference" -msgstr "" +msgstr "ການອ້າງອີງຈາກສະຖານທີ່ເກີດເຫດ" msgid "Choose a locale to translate from the menu above" -msgstr "" +msgstr "ເລືອກສະຖານທີ່ເກີດເຫດເພື່ອແປຈາກລາຍການຂັ້ນເທິງ" msgid "Translate: {{objectName}}" -msgstr "" +msgstr "ແປ {{objectName}}" msgid "Save translations" -msgstr "" +msgstr "ບັນທຶກການແປ" msgid "Cannot save while offline" -msgstr "" +msgstr "ບໍ່ສາມາດບັນທຶກແບບອອບລາຍ" msgid "Could not load translations" -msgstr "" +msgstr "ບໍ່ສາມາດໂຫຼດການແປ" msgid "Retry" -msgstr "" +msgstr "ລອງໃໝ່" + +msgid "Too many results. Try refining the search." +msgstr "ຜົນໄດ້ຮັບຫຼາຍເກີນໄປ. ປັບປຸງການຄົ້ນຫາ." + +msgid "Search for a user" +msgstr "ຄົ້ນຫາຜູ້ໃຊ້" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "ຄົ້ນຫາ \"{{- searchText}}\"" + +msgid "No results found" +msgstr "ບໍ່ພົບຜົນການຊອກຫາ" msgid "Series" msgstr "ແທ່ງ" @@ -860,37 +926,37 @@ msgid "Category" msgstr "ລວງນອນ" msgid "Filter" -msgstr "Filter" +msgstr "ຕົວກອງ" msgid "Columns" -msgstr "" +msgstr "ຖັນ" msgid "Rows" -msgstr "" +msgstr "ແຖວ" msgid "Points" -msgstr "" +msgstr "ຄະແນນ" msgid "Reporting rate" -msgstr "" +msgstr "ອັດຕາການລາຍງານ" msgid "Reporting rate on time" -msgstr "" +msgstr "ອັດຕາການລາຍງານຕົງເວລາ" msgid "Actual reports" -msgstr "" +msgstr "ລາຍງານຕົວຈິງ" msgid "Actual reports on time" -msgstr "" +msgstr "ລາຍງານຕົວຈິງຕົງເວລາ" msgid "Expected reports" -msgstr "" +msgstr "ລາຍງານທີ່ຄາດໄວ້" msgid "Program" -msgstr "Program" +msgstr "ໂປແກຼມ" msgid "Select a program" -msgstr "" +msgstr "ເລືອກໂປແກຼມ" msgid "Indicators" msgstr "ຕົວຊີ້ວັດ" @@ -899,85 +965,109 @@ msgid "Indicator group" msgstr "ກຸ່ມຂອງຕົວຊີ້ວັດ" msgid "All groups" -msgstr "" +msgstr "ກຸ່ມທັງໝົດ" msgid "Indicator" msgstr "ຕົວຊີ້ວັດ" msgid "No indicator groups found" -msgstr "" +msgstr "ບໍ່ພົບກຸ່ມຕົວຊີ້ວັດ" msgid "Loading indicator groups" -msgstr "" - -msgid "Data elements" -msgstr "ອົງປະກອບຂໍ້ມູນ" +msgstr "ໂຫຼດກຸ່ມຕົວຊີ້ວັດ" msgid "Data element group" -msgstr "ກຸ່ມຂອລອົງປະກອບຂໍ້ມູນ" +msgstr "ກຸ່ມຂອງອົງປະກອບຂໍ້ມູນ" msgid "Data element" -msgstr "Data Element" +msgstr "ອົງປະກອບຂໍ້ມູນ" msgid "No data element groups found" -msgstr "" +msgstr "ບໍ່ພົບກຸ່ມອົງປະກອບຂໍ້ມູນ" msgid "Loading data element groups" -msgstr "" +msgstr "ໂຫຼດກຸ່ມອົງປະກອບຂໍ້ມູນ" msgid "Data sets" msgstr "ແບບຟອມ" msgid "Data set" -msgstr "Data set\\:" +msgstr "ແບບຟອມ" msgid "All data sets" -msgstr "" +msgstr "ແບບຟອມທັງໝົດ" msgid "Loading data sets" -msgstr "" +msgstr "ໂຫຼດແບບຟອມ" msgid "Event data items" msgstr "ຂໍ້ມູນລາຍບຸກຄົນ" msgid "All programs" -msgstr "" +msgstr "ໂປແກຼມທັງໝົດ" msgid "Event data item" -msgstr "" +msgstr "ຂໍ້ມູນລາຍບຸກຄົນ" msgid "No programs found" -msgstr "" +msgstr "ບໍ່ພົບໂປແກຼມ" msgid "Loading programs" -msgstr "" +msgstr "ໂຫຼດໂປແກຼມ" msgid "Program indicators" msgstr "ຕົວຊີ້ວັດສະເພາະວຽກຂອງຂະແໜງ" msgid "Program indicator" -msgstr "Program Indicator Management" +msgstr "ໂປແກຼມຕົວຊີ້ວັດ" + +msgid "Calculations" +msgstr "ຄິດໄລ່" + +msgid "Number" +msgstr "ຈຳນວນ" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "ສູດຄຳນວນຫວ່າງເປົ່າ. ເພີ່ມລາຍການໃສ່ສູດຈາກລາຍການຂ້າງຊ້າຍ." + +msgid "Consecutive math operators" +msgstr "ຕົວປະຕິບັດການຄະນິດສາດຕາມລຳດັບ" + +msgid "Consecutive data elements" +msgstr "ອົງປະກອບຂໍ້ມູນຕາມລຳດັບ" + +msgid "Starts or ends with a math operator" +msgstr "ເລີ່ມຕົ້ນ ຫຼື ສິ້ນສຸດດ້ວຍຕົວປະຕິບັດການຄະນິດສາດ" + +msgid "Empty parentheses" +msgstr "ວົງເລັບວ່າງເປົ່າ" + +msgid "Missing right parenthesis )" +msgstr "ຂາດວົງເລັບຂວາ )" + +msgid "Missing left parenthesis (" +msgstr "ຂາດວົງເລັບຊ້າຍ (" msgid "Extra Small" -msgstr "" +msgstr "ນ້ອຍສຸດ" msgid "Small" msgstr "ນ້ອຍ" msgid "Regular" -msgstr "Regular" +msgstr "ທຳມະດາ" msgid "Large" msgstr "ໃຫຍ່" msgid "Extra Large" -msgstr "" +msgstr "ໃຫຍ່ສຸດ" msgid "Left" msgstr "ຊ້າຍ" msgid "Center" -msgstr "" +msgstr "ກາງ" msgid "Right" msgstr "ຂວາ" @@ -986,10 +1076,10 @@ msgid "Start" msgstr "Start" msgid "Middle" -msgstr "" +msgstr "ກາງ" msgid "End" -msgstr "" +msgstr "ຈົບ" msgid "Top" msgstr "ເທິງສຸດ" @@ -998,42 +1088,45 @@ msgid "Bottom" msgstr "ລຸ່ມສຸດ" msgid "{{dynamicOuNames}} and {{lastOuName}}" -msgstr "" +msgstr "{{dynamicOuNames}} ແລະ {{lastOuName}}" msgid "{{allDynamicOuNames}} levels" -msgstr "" +msgstr "{{allDynamicOuNames}} ຂັ້ນ" msgid "{{allDynamicOuNames}} groups" -msgstr "" +msgstr "{{allDynamicOuNames}} ກຸ່ມ" msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" -msgstr "" +msgstr "{{allDynamicOuNames}} ຂັ້ນໃນ {{staticOuNames}}" msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" -msgstr "" +msgstr "{{allDynamicOuNames}} ກຸ່ມໃນ {{staticOuNames}}" msgid "{{percentage}}% of total x values" -msgstr "" +msgstr "{{percentage}} % ລວມຂອງຄ່າ x" msgid "{{percentage}}% of total y values" -msgstr "" +msgstr "{{percentage}} % ລວມຂອງຄ່າ y" msgid "{{thresholdFactor}} × IQR Q1" -msgstr "" +msgstr "{{thresholdFactor}} x IQR Q1" msgid "{{thresholdFactor}} × IQR Q3" -msgstr "" +msgstr "{{thresholdFactor}} x IQR Q3" msgid "{{thresholdFactor}} × Modified Z-score low" -msgstr "" +msgstr "{{thresholdFactor}} x ແກ້ໄຂຄະແນນ z ຕ່ຳ" msgid "{{thresholdFactor}} × Modified Z-score high" -msgstr "" +msgstr "{{thresholdFactor}} x ແກ້ໄຂຄະແນນ z ສູງ" msgid "{{thresholdFactor}} × Z-score low" -msgstr "" +msgstr "{{thresholdFactor}} x ຄະແນນ z ຕ່ຳ" msgid "{{thresholdFactor}} × Z-score high" +msgstr "{{thresholdFactor}} x ຄະແນນ z ສູງ" + +msgid "Not applicable" msgstr "" msgid "Data" @@ -1043,73 +1136,76 @@ msgid "Organisation unit" msgstr "​ຫົວ​ໜ່ວຍ​ການ​ຈັດ​ຕັ້ງ" msgid "Assigned Categories" -msgstr "" +msgstr "ຈັດໝວດໝູ່" msgid "Pivot table" -msgstr "" +msgstr "ແບບຕາຕະລາງໄພວ໋ອດ" msgid "Area" -msgstr "" +msgstr "ພື້ນທີ່" msgid "Stacked area" -msgstr "" +msgstr "ພື້ນທີ່ຊ້ອນກັນ" msgid "Bar" -msgstr "" +msgstr "ແຖບ" msgid "Stacked bar" -msgstr "" +msgstr "ແຖບຊ້ອນກັນ" msgid "Column" msgstr "ຖັນ" msgid "Year over year (column)" -msgstr "" +msgstr "ປີຕໍ່ປີ (ຖັນ)" msgid "Stacked column" -msgstr "" +msgstr "ຖັນຊ້ອນກັນ" msgid "Gauge" -msgstr "" +msgstr "ເຄື່ອງວັດແທກ" msgid "Line" -msgstr "" +msgstr "ເສັ້ນ" msgid "Line list" -msgstr "" +msgstr "ລາຍການລາຍບຸກຄົນ" msgid "Year over year (line)" -msgstr "" +msgstr "ປີຕໍ່ປີ (ເສັ້ນ)" msgid "Pie" -msgstr "" +msgstr "ພາຍ" msgid "Radar" -msgstr "" +msgstr "ເຣດາ" msgid "Scatter" -msgstr "" +msgstr "ກະແຈກກະຈາຍ" msgid "Single value" -msgstr "" +msgstr "ຄ່າດຽວ" + +msgid "Outlier table" +msgstr "ຕາຕະລາງທີ່ເກີນກວ່າ" msgid "All charts" -msgstr "" +msgstr "ຕາຕະລາງທັງຫມົດ" msgid "{{seriesName}} (trend)" -msgstr "" +msgstr "{{seriesName}} (ແນວໂນ້ມ)" msgid "Trend" msgstr "ແນວໂນ້ມ" msgid "No legend for this series" -msgstr "" +msgstr "ບໍ່ມີນິຍາມສຳລັບຊຸດນີ້" msgid "and {{amount}} more..." -msgstr "" +msgstr "ແລະ {{amount}} ເພີ່ມ..." msgid "Linear Regression" -msgstr "" +msgstr "ການຖົດຖອຍແບບເສັ້ນ" msgid "Target" msgstr "ເປົ້າໝາຍ" @@ -1118,11 +1214,11 @@ msgid "Base" msgstr "ຖານ" msgid "Axis {{axisId}}" -msgstr "" +msgstr "ແກນ {{axisId}}" msgid "{{count}} items" msgid_plural "{{count}} items" -msgstr[0] "" +msgstr[0] "{{count}} ລາຍການ" msgid "Reset zoom" -msgstr "" +msgstr "ຣີເຊັດຊູມ" diff --git a/i18n/my.po b/i18n/my.po index 0d57fe7f2..f4933563d 100644 --- a/i18n/my.po +++ b/i18n/my.po @@ -2,15 +2,15 @@ # Translators: # Viktor Varland , 2021 # Wanda , 2022 -# phil_dhis2, 2022 +# phil_dhis2, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-04-18T08:41:27.838Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: phil_dhis2, 2022\n" -"Language-Team: Burmese (https://www.transifex.com/hisp-uio/teams/100509/my/)\n" +"Last-Translator: phil_dhis2, 2023\n" +"Language-Team: Burmese (https://app.transifex.com/hisp-uio/teams/100509/my/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -81,10 +81,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "ပယ်ဖျက်သည်" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -93,15 +128,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "Loading, please wait" + +msgid "Data elements" +msgstr "အချက်အလတ်အစိတ်အပိုင်းများ" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + msgid "Disaggregation" msgstr "" msgid "No data" msgstr "အချက်အလက်မရှိပါ။" -msgid "Loading" -msgstr "Loading, please wait" - msgid "Search by data item name" msgstr "" @@ -114,9 +175,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -129,9 +187,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -144,6 +199,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -210,9 +268,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "ပယ်ဖျက်သည်" - msgid "Delete" msgstr "ဖျက်ဆီးသည်" @@ -264,6 +319,9 @@ msgstr "ဖော်ပြချက်" msgid "Rename" msgstr "အမည်သစ်ပေးခြင်း" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -377,6 +435,9 @@ msgstr "" msgid "No results found" msgstr "No results found" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "Created by" @@ -573,48 +634,6 @@ msgstr "" msgid "No periods selected" msgstr "သက်ဆိုင်ရာ အချိန်ကာလကို မရွေးချယ်ထားပါ။" -msgid "January" -msgstr "ဇန်နဝါရီ" - -msgid "February" -msgstr "ဖေဖော်ဝါရီ" - -msgid "March" -msgstr "မတ်" - -msgid "April" -msgstr "ဧပြီ" - -msgid "May" -msgstr "မေ" - -msgid "June" -msgstr "ဇွန်" - -msgid "July" -msgstr "ဇူလိုင်" - -msgid "August" -msgstr "သြဂုတ်" - -msgid "September" -msgstr "စက်တင်ဘာ" - -msgid "October" -msgstr "အောက်တိုဘာ" - -msgid "November" -msgstr "နိုဝင်ဘာ" - -msgid "December" -msgstr "ဒီဇင်ဘာ" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "နေ့စဉ်" @@ -837,6 +856,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -900,9 +922,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "အချက်အလတ်အစိတ်အပိုင်းများ" - msgid "Data element group" msgstr "data element အုပ်စု" @@ -948,6 +967,33 @@ msgstr "" msgid "Program indicator" msgstr "" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "ဂဏန်း" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/nb.po b/i18n/nb.po index a02bfa73b..9031e2d2c 100644 --- a/i18n/nb.po +++ b/i18n/nb.po @@ -1,15 +1,17 @@ # # Translators: -# Caroline Hesthagen Holen , 2022 -# Karoline Tufte Lien , 2022 +# Caroline Hesthagen Holen , 2023 +# Jen Jones Arnesen , 2023 +# Karoline Tufte Lien , 2023 +# Martin , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2024-01-25T12:05:03.360Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Karoline Tufte Lien , 2022\n" -"Language-Team: Norwegian Bokmål (https://www.transifex.com/hisp-uio/teams/100509/nb/)\n" +"Last-Translator: Martin , 2024\n" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/hisp-uio/teams/100509/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -81,11 +83,46 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" -msgstr "Datatype" +msgid "Data / Edit calculation" +msgstr "" -msgid "All types" -msgstr "Alle typer" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Avbryt" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" msgid "Totals only" msgstr "Kun totaler" @@ -93,15 +130,44 @@ msgstr "Kun totaler" msgid "Details only" msgstr "Kun detaljer" +msgid "Loading" +msgstr "Laster" + +msgid "Data elements" +msgstr "Dataelementer" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "Ingen dataelementer funnet for \"{{- searchTerm}}\"" + +msgid "No data elements found" +msgstr "Ingen dataelementer funnet" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "Datatype" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "" + +msgid "All types" +msgstr "Alle typer" + msgid "Disaggregation" msgstr "Disaggregering" msgid "No data" msgstr "Ingen data" -msgid "Loading" -msgstr "Laster" - msgid "Search by data item name" msgstr "Søk etter datapunktnavn" @@ -114,9 +180,6 @@ msgstr "Valgte elementer" msgid "No indicators found" msgstr "Ingen indikatorer funnet" -msgid "No data elements found" -msgstr "Ingen dataelementer funnet" - msgid "No data sets found" msgstr "Ingen datasett funnet" @@ -126,12 +189,12 @@ msgstr "Ingen hendelsesdataelementer funnet" msgid "No program indicators found" msgstr "Ingen programindikatorer funnet" +msgid "No calculations found" +msgstr "" + msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "Ingen indikatorer funnet for \"{{- searchTerm}}\"" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "Ingen dataelementer funnet for \"{{- searchTerm}}\"" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "Ingen datasett funnet for \"{{- searchTerm}}\"" @@ -141,9 +204,15 @@ msgstr "Ingen hendelsesdataelementer funnet for \"{{- searchTerm}}\"" msgid "No program indicators found for \"{{- searchTerm}}\"" msgstr "Ingen programindikatorer funnet for \"{{- searchTerm}}\"" +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "" + msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "Ingenting funnet for \"{{- searchTerm}}\"" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "Metrisk type" @@ -213,9 +282,6 @@ msgid "" msgstr "" "Denne {{fileType}} og relaterte tolkninger vil bli slettet. Fortsette?" -msgid "Cancel" -msgstr "Avbryt" - msgid "Delete" msgstr "Slett" @@ -267,6 +333,9 @@ msgstr "Beskrivelse" msgid "Rename" msgstr "Gi nytt navn" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "Lagre {{fileType}} som" @@ -280,7 +349,7 @@ msgid "map" msgstr "kart" msgid "visualization" -msgstr "" +msgstr "visualisering" msgid "Edit" msgstr "Rediger" @@ -291,6 +360,9 @@ msgstr "Skriv et svar" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Kunne ikke slette" + msgid "Could not update comment" msgstr "" @@ -317,27 +389,42 @@ msgstr "" msgid "Write an interpretation" msgstr "Skriv en tolkning" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "Tolkninger" +msgid "Reply" +msgstr "Svar" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} svar" +msgstr[1] "{{count}} svar" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "Fjern like" msgid "Like" msgstr "Like" -msgid "Reply" -msgstr "Svar" +msgid "See interpretation" +msgstr "" + +msgid "Open in app" +msgstr "" msgid "Share" msgstr "Del" -msgid "See interpretation" -msgstr "" - msgid "Manage sharing" msgstr "Administrer deling" @@ -380,6 +467,9 @@ msgstr "" msgid "No results found" msgstr "Ingen resultater funnet" +msgid "Not available offline" +msgstr "Ikke tilgjengelig i frakoblet modus" + msgid "Created by" msgstr "Opprettet av" @@ -569,60 +659,18 @@ msgstr "Velg år" msgid "Period" msgstr "Periode" +msgid "Selected Periods" +msgstr "Valgte perioder" + msgid "Relative periods" msgstr "Relative perioder" msgid "Fixed periods" msgstr "Faste perioder" -msgid "Selected Periods" -msgstr "Valgte perioder" - msgid "No periods selected" msgstr "Ingen perioder er valgt" -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgid "Week {{weekNumber}}" -msgstr "Uke {{weekNumber}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "Touke {{biWeekNumber}}" - msgid "Daily" msgstr "Daglig" @@ -827,6 +875,9 @@ msgstr "Regnskapsår" msgid "Years" msgstr "År" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -845,6 +896,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -908,9 +962,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Dataelementer" - msgid "Data element group" msgstr "Dataelementgruppe" @@ -945,7 +996,7 @@ msgid "Event data item" msgstr "Hendelsesdatapunkt" msgid "No programs found" -msgstr "" +msgstr "Ingen programmer funnet" msgid "Loading programs" msgstr "" @@ -956,6 +1007,33 @@ msgstr "Programindikatorer" msgid "Program indicator" msgstr "Programindikator" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Nummer" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "Ekstra liten" @@ -1091,6 +1169,9 @@ msgstr " Spredning" msgid "Single value" msgstr "Enkeltverdi" +msgid "Outlier table" +msgstr "" + msgid "All charts" msgstr "Alle diagrammer" diff --git a/i18n/ne.po b/i18n/ne.po new file mode 100644 index 000000000..f3d1d4695 --- /dev/null +++ b/i18n/ne.po @@ -0,0 +1,1201 @@ +# +# Translators: +# Saroj Dhakal , 2024 +# Prabesh Guragain, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: i18next-conv\n" +"POT-Creation-Date: 2024-01-25T12:05:03.360Z\n" +"PO-Revision-Date: 2020-04-28 22:05+0000\n" +"Last-Translator: Prabesh Guragain, 2024\n" +"Language-Team: Nepali (https://app.transifex.com/hisp-uio/teams/100509/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "view only" +msgstr "" + +msgid "view and edit" +msgstr "" + +msgid "all users ({{accessLevel}})" +msgstr "" + +msgid "{{userOrGroup}} ({{accessLevel}})" +msgstr "" + +msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" +msgstr "" + +msgid "Not shared with any users or groups" +msgstr "" + +msgid "No description" +msgstr "" + +msgid "Last updated {{time}}" +msgstr "" + +msgid "Created {{time}} by {{author}}" +msgstr "" + +msgid "Created {{time}}" +msgstr "" + +msgid "Viewed {{count}} times" +msgid_plural "Viewed {{count}} times" +msgstr[0] "" +msgstr[1] "" + +msgid "Notifications" +msgstr "" + +msgid "You're subscribed and getting updates about new interpretations." +msgstr "" + +msgid "Unsubscribe" +msgstr "" + +msgid "Subscribe to get updates about new interpretations." +msgstr "" + +msgid "Subscribe" +msgstr "" + +msgid "About this map" +msgstr "" + +msgid "About this line list" +msgstr "" + +msgid "About this visualization" +msgstr "" + +msgid "This app could not retrieve required data." +msgstr "" + +msgid "Network error" +msgstr "" + +msgid "Data / Edit calculation" +msgstr "" + +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "रद्द गर्नुहोस्" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" + +msgid "Totals only" +msgstr "" + +msgid "Details only" +msgstr "" + +msgid "Loading" +msgstr "" + +msgid "Data elements" +msgstr "" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "" + +msgid "All types" +msgstr "" + +msgid "Disaggregation" +msgstr "" + +msgid "No data" +msgstr "" + +msgid "Search by data item name" +msgstr "" + +msgid "No items selected" +msgstr "" + +msgid "Selected Items" +msgstr "" + +msgid "No indicators found" +msgstr "" + +msgid "No data sets found" +msgstr "" + +msgid "No event data items found" +msgstr "" + +msgid "No program indicators found" +msgstr "" + +msgid "No calculations found" +msgstr "" + +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data sets found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No event data items found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No program indicators found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "Nothing found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "Calculation" +msgstr "" + +msgid "Metric type" +msgstr "" + +msgid "All metrics" +msgstr "" + +msgid "Move to {{axisName}}" +msgstr "" + +msgid "Add to {{axisName}}" +msgstr "" + +msgid "Not available for {{visualizationType}}" +msgstr "" + +msgid "Remove Assigned Categories" +msgstr "" + +msgid "Add Assigned Categories" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "Filter dimensions" +msgstr "" + +msgid "Main dimensions" +msgstr "" + +msgid "Your dimensions" +msgstr "" + +msgid "Dimension recommended with selected data" +msgstr "" + +msgid "All items" +msgstr "" + +msgid "Automatically include all items" +msgstr "" + +msgid "" +"Select all {{- dimensionTitle}} items. With this option, new items added in " +"the future will be automatically included." +msgstr "" + +msgid "Manually select items..." +msgstr "" + +msgid "Nothing found in {{- dimensionTitle}}" +msgstr "" + +msgid "Search" +msgstr "खोज" + +msgid "Nothing found for {{- searchTerm}}" +msgstr "" + +msgid "Delete {{fileType}}" +msgstr "" + +msgid "" +"This {{fileType}} and related interpretations will be deleted. Continue?" +msgstr "" + +msgid "Delete" +msgstr "" + +msgid "File" +msgstr "" + +msgid "New" +msgstr "" + +msgid "Open…" +msgstr "" + +msgid "Save" +msgstr "" + +msgid "Save…" +msgstr "" + +msgid "Save as…" +msgstr "" + +msgid "Rename…" +msgstr "" + +msgid "Translate…" +msgstr "" + +msgid "Share…" +msgstr "" + +msgid "Get link…" +msgstr "" + +msgid "Open in this app" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "Rename {{fileType}}" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "{{- objectName}} (copy)" +msgstr "" + +msgid "Save {{fileType}} as" +msgstr "" + +msgid "event report" +msgstr "" + +msgid "line list" +msgstr "" + +msgid "map" +msgstr "" + +msgid "visualization" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Write a reply" +msgstr "" + +msgid "Post reply" +msgstr "" + +msgid "Delete failed" +msgstr "" + +msgid "Could not update comment" +msgstr "" + +msgid "Enter comment text" +msgstr "" + +msgid "Update" +msgstr "" + +msgid "Viewing interpretation: {{- visualisationName}}" +msgstr "" + +msgid "Could not load interpretation" +msgstr "" + +msgid "" +"The interpretation couldn’t be displayed. Try again or contact your system " +"administrator." +msgstr "" + +msgid "Hide interpretation" +msgstr "" + +msgid "Write an interpretation" +msgstr "" + +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + +msgid "Post interpretation" +msgstr "" + +msgid "Interpretations" +msgstr "" + +msgid "Reply" +msgstr "जवाफ" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "" +msgstr[1] "" + +msgid "View replies" +msgstr "" + +msgid "Unlike" +msgstr "" + +msgid "Like" +msgstr "" + +msgid "See interpretation" +msgstr "" + +msgid "Open in app" +msgstr "" + +msgid "Share" +msgstr "" + +msgid "Manage sharing" +msgstr "" + +msgid "Could not update interpretation" +msgstr "" + +msgid "Enter interpretation text" +msgstr "" + +msgid "Not available offline" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Anyone" +msgstr "" + +msgid "Only you" +msgstr "" + +msgid "Others" +msgstr "" + +msgid "Not supported by this app yet" +msgstr "" + +msgid "Filter by name" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Clear filters" +msgstr "" + +msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" +msgstr "" + +msgid "Open" +msgstr "खोल्नुहोस्" + +msgid "Couldn't load items" +msgstr "" + +msgid "" +"There was a problem loading items. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No items found. Create a new to get started." +msgstr "" + +msgid "" +"No items found. Try adjusting your search or filter options to find what " +"you're looking for." +msgstr "" + +msgid "Create new" +msgstr "" + +msgid "Open a visualization" +msgstr "" + +msgid "Loading visualizations" +msgstr "" + +msgid "Couldn't load visualizations" +msgstr "" + +msgid "" +"There was a problem loading visualizations. Try again or contact your system" +" administrator." +msgstr "" + +msgid "No visualizations found. Click New visualization to get started." +msgstr "" + +msgid "" +"No visualizations found. Try adjusting your search or filter options to find" +" what you're looking for." +msgstr "" + +msgid "New visualization" +msgstr "" + +msgid "Open a map" +msgstr "" + +msgid "Loading maps" +msgstr "" + +msgid "Couldn't load maps" +msgstr "" + +msgid "" +"There was a problem loading maps. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No maps found. Click New map to get started." +msgstr "" + +msgid "" +"No maps found. Try adjusting your search or filter options to find what " +"you're looking for." +msgstr "" + +msgid "New map" +msgstr "" + +msgid "Open a line list" +msgstr "" + +msgid "Loading line lists" +msgstr "" + +msgid "Couldn't load line lists" +msgstr "" + +msgid "" +"There was a problem loading line lists. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No line lists found. Click New line list to get started." +msgstr "" + +msgid "" +"No line lists found. Try adjusting your search or filter options to find " +"what you're looking for." +msgstr "" + +msgid "New line list" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Hide" +msgstr "" + +msgid "{{count}} org units" +msgid_plural "{{count}} org units" +msgstr[0] "" +msgstr[1] "" + +msgid "{{count}} levels" +msgid_plural "{{count}} levels" +msgstr[0] "" +msgstr[1] "" + +msgid "{{count}} groups" +msgid_plural "{{count}} groups" +msgstr[0] "" +msgstr[1] "" + +msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" +msgstr "" + +msgid "Nothing selected" +msgstr "" + +msgid "User organisation unit" +msgstr "" + +msgid "User sub-units" +msgstr "" + +msgid "User sub-x2-units" +msgstr "" + +msgid "Select a level" +msgstr "" + +msgid "Select a group" +msgstr "" + +msgid "Deselect all" +msgstr "सबै चयन उल्टाउनुहोस्" + +msgid "Period type" +msgstr "" + +msgid "Year" +msgstr "" + +msgid "Select year" +msgstr "" + +msgid "Period" +msgstr "अबधि" + +msgid "Selected Periods" +msgstr "" + +msgid "Relative periods" +msgstr "" + +msgid "Fixed periods" +msgstr "" + +msgid "No periods selected" +msgstr "" + +msgid "Daily" +msgstr "दैनिक" + +msgid "Weekly" +msgstr "" + +msgid "Weekly (Start Wednesday)" +msgstr "" + +msgid "Weekly (Start Thursday)" +msgstr "" + +msgid "Weekly (Start Saturday)" +msgstr "" + +msgid "Weekly (Start Sunday)" +msgstr "" + +msgid "Bi-weekly" +msgstr "" + +msgid "Monthly" +msgstr "" + +msgid "Bi-monthly" +msgstr "" + +msgid "Quarterly" +msgstr "" + +msgid "Six-monthly" +msgstr "" + +msgid "Six-monthly April" +msgstr "" + +msgid "Yearly" +msgstr "" + +msgid "Financial year (Start November)" +msgstr "" + +msgid "Financial year (Start October)" +msgstr "" + +msgid "Financial year (Start July)" +msgstr "" + +msgid "Financial year (Start April)" +msgstr "" + +msgid "Today" +msgstr "आज" + +msgid "Yesterday" +msgstr "हिजो" + +msgid "Last 3 days" +msgstr "" + +msgid "Last 7 days" +msgstr "" + +msgid "Last 14 days" +msgstr "" + +msgid "Last 30 days" +msgstr "" + +msgid "Last 60 days" +msgstr "" + +msgid "Last 90 days" +msgstr "" + +msgid "Last 180 days" +msgstr "" + +msgid "This week" +msgstr "" + +msgid "Last week" +msgstr "" + +msgid "Last 4 weeks" +msgstr "" + +msgid "Last 12 weeks" +msgstr "" + +msgid "Last 52 weeks" +msgstr "" + +msgid "Weeks this year" +msgstr "" + +msgid "This bi-week" +msgstr "" + +msgid "Last bi-week" +msgstr "" + +msgid "Last 4 bi-weeks" +msgstr "" + +msgid "This month" +msgstr "" + +msgid "Last month" +msgstr "" + +msgid "Last 3 months" +msgstr "" + +msgid "Last 6 months" +msgstr "" + +msgid "Last 12 months" +msgstr "" + +msgid "Months this year" +msgstr "" + +msgid "This bi-month" +msgstr "" + +msgid "Last bi-month" +msgstr "" + +msgid "Last 6 bi-months" +msgstr "" + +msgid "Bi-months this year" +msgstr "" + +msgid "This quarter" +msgstr "" + +msgid "Last quarter" +msgstr "" + +msgid "Last 4 quarters" +msgstr "" + +msgid "Quarters this year" +msgstr "" + +msgid "This six-month" +msgstr "" + +msgid "Last six-month" +msgstr "" + +msgid "Last 2 six-month" +msgstr "" + +msgid "This financial year" +msgstr "" + +msgid "Last financial year" +msgstr "" + +msgid "Last 5 financial years" +msgstr "" + +msgid "This year" +msgstr "" + +msgid "Last year" +msgstr "" + +msgid "Last 5 years" +msgstr "" + +msgid "Last 10 years" +msgstr "" + +msgid "Days" +msgstr "" + +msgid "Weeks" +msgstr "" + +msgid "Bi-weeks" +msgstr "" + +msgid "Months" +msgstr "" + +msgid "Bi-months" +msgstr "" + +msgid "Quarters" +msgstr "" + +msgid "Six-months" +msgstr "" + +msgid "Financial Years" +msgstr "" + +msgid "Years" +msgstr "" + +msgid "Bold text" +msgstr "" + +msgid "Italic text" +msgstr "" + +msgid "Link to a URL" +msgstr "" + +msgid "Mention a user" +msgstr "" + +msgid "Add emoji" +msgstr "" + +msgid "Preview" +msgstr "" + +msgid "Back to write mode" +msgstr "" + +msgid "Interpretations and details" +msgstr "" + +msgid "Translating to" +msgstr "" + +msgid "Choose a locale" +msgstr "" + +msgid "Base locale reference" +msgstr "" + +msgid "Choose a locale to translate from the menu above" +msgstr "" + +msgid "Translate: {{objectName}}" +msgstr "" + +msgid "Save translations" +msgstr "" + +msgid "Cannot save while offline" +msgstr "" + +msgid "Could not load translations" +msgstr "" + +msgid "Retry" +msgstr "" + +msgid "Too many results. Try refining the search." +msgstr "" + +msgid "Search for a user" +msgstr "" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "" + +msgid "No results found" +msgstr "कुनै पनि नतिजा भेटिएन" + +msgid "Series" +msgstr "" + +msgid "Category" +msgstr "" + +msgid "Filter" +msgstr "" + +msgid "Columns" +msgstr "" + +msgid "Rows" +msgstr "" + +msgid "Points" +msgstr "" + +msgid "Reporting rate" +msgstr "" + +msgid "Reporting rate on time" +msgstr "" + +msgid "Actual reports" +msgstr "" + +msgid "Actual reports on time" +msgstr "" + +msgid "Expected reports" +msgstr "" + +msgid "Program" +msgstr "" + +msgid "Select a program" +msgstr "" + +msgid "Indicators" +msgstr "" + +msgid "Indicator group" +msgstr "" + +msgid "All groups" +msgstr "" + +msgid "Indicator" +msgstr "" + +msgid "No indicator groups found" +msgstr "" + +msgid "Loading indicator groups" +msgstr "" + +msgid "Data element group" +msgstr "" + +msgid "Data element" +msgstr "" + +msgid "No data element groups found" +msgstr "" + +msgid "Loading data element groups" +msgstr "" + +msgid "Data sets" +msgstr "" + +msgid "Data set" +msgstr "" + +msgid "All data sets" +msgstr "" + +msgid "Loading data sets" +msgstr "" + +msgid "Event data items" +msgstr "" + +msgid "All programs" +msgstr "" + +msgid "Event data item" +msgstr "" + +msgid "No programs found" +msgstr "" + +msgid "Loading programs" +msgstr "" + +msgid "Program indicators" +msgstr "" + +msgid "Program indicator" +msgstr "" + +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + +msgid "Extra Small" +msgstr "" + +msgid "Small" +msgstr "" + +msgid "Regular" +msgstr "" + +msgid "Large" +msgstr "" + +msgid "Extra Large" +msgstr "" + +msgid "Left" +msgstr "" + +msgid "Center" +msgstr "" + +msgid "Right" +msgstr "" + +msgid "Start" +msgstr "" + +msgid "Middle" +msgstr "" + +msgid "End" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "{{dynamicOuNames}} and {{lastOuName}}" +msgstr "" + +msgid "{{allDynamicOuNames}} levels" +msgstr "" + +msgid "{{allDynamicOuNames}} groups" +msgstr "" + +msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" +msgstr "" + +msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" +msgstr "" + +msgid "{{percentage}}% of total x values" +msgstr "" + +msgid "{{percentage}}% of total y values" +msgstr "" + +msgid "{{thresholdFactor}} × IQR Q1" +msgstr "" + +msgid "{{thresholdFactor}} × IQR Q3" +msgstr "" + +msgid "{{thresholdFactor}} × Modified Z-score low" +msgstr "" + +msgid "{{thresholdFactor}} × Modified Z-score high" +msgstr "" + +msgid "{{thresholdFactor}} × Z-score low" +msgstr "" + +msgid "{{thresholdFactor}} × Z-score high" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "Organisation unit" +msgstr "" + +msgid "Assigned Categories" +msgstr "" + +msgid "Pivot table" +msgstr "" + +msgid "Area" +msgstr "" + +msgid "Stacked area" +msgstr "" + +msgid "Bar" +msgstr "" + +msgid "Stacked bar" +msgstr "" + +msgid "Column" +msgstr "" + +msgid "Year over year (column)" +msgstr "" + +msgid "Stacked column" +msgstr "" + +msgid "Gauge" +msgstr "" + +msgid "Line" +msgstr "" + +msgid "Line list" +msgstr "" + +msgid "Year over year (line)" +msgstr "" + +msgid "Pie" +msgstr "" + +msgid "Radar" +msgstr "" + +msgid "Scatter" +msgstr "" + +msgid "Single value" +msgstr "" + +msgid "Outlier table" +msgstr "" + +msgid "All charts" +msgstr "" + +msgid "{{seriesName}} (trend)" +msgstr "" + +msgid "Trend" +msgstr "" + +msgid "No legend for this series" +msgstr "" + +msgid "and {{amount}} more..." +msgstr "" + +msgid "Linear Regression" +msgstr "" + +msgid "Target" +msgstr "" + +msgid "Base" +msgstr "" + +msgid "Axis {{axisId}}" +msgstr "" + +msgid "{{count}} items" +msgid_plural "{{count}} items" +msgstr[0] "" +msgstr[1] "" + +msgid "Reset zoom" +msgstr "" diff --git a/i18n/nl.po b/i18n/nl.po index f5ff7073e..52e67a6f6 100644 --- a/i18n/nl.po +++ b/i18n/nl.po @@ -3,14 +3,17 @@ # Cherise Beek , 2021 # Yury Rogachev , 2021 # Rica Zamora Duchateau, 2022 +# Charel van den Elsen, 2023 +# Enzo Nicolas Rossi , 2023 +# Philip Larsen Donnelly, 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2023-09-27T14:15:13.876Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Rica Zamora Duchateau, 2022\n" -"Language-Team: Dutch (https://www.transifex.com/hisp-uio/teams/100509/nl/)\n" +"Last-Translator: Philip Larsen Donnelly, 2024\n" +"Language-Team: Dutch (https://app.transifex.com/hisp-uio/teams/100509/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -18,150 +21,212 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "view only" -msgstr "" +msgstr "alleen bekijken" msgid "view and edit" -msgstr "" +msgstr "bekijken en bewerken" msgid "all users ({{accessLevel}})" -msgstr "" +msgstr "alle gebruikers ({{accessLevel}})" msgid "{{userOrGroup}} ({{accessLevel}})" -msgstr "" +msgstr "{{userOrGroup}} ({{accessLevel}})" msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" -msgstr "" +msgstr "Gedeeld met {{commaSeparatedListOfUsersAndGroups}}" msgid "Not shared with any users or groups" -msgstr "" +msgstr "Niet gedeeld met gebruikers of groepen" msgid "No description" -msgstr "" +msgstr "Geen beschrijving" msgid "Last updated {{time}}" -msgstr "" +msgstr "Laatst bijgewerkt {{time}}" msgid "Created {{time}} by {{author}}" -msgstr "" +msgstr "Gemaakt {{time}} door {{author}}" msgid "Created {{time}}" -msgstr "" +msgstr "Gemaakt {{time}}" msgid "Viewed {{count}} times" msgid_plural "Viewed {{count}} times" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1 keer bekeken" +msgstr[1] "{{count}} keer bekeken" msgid "Notifications" -msgstr "" +msgstr "Meldingen" msgid "You're subscribed and getting updates about new interpretations." -msgstr "" +msgstr "Je bent geabonneerd en krijgt updates over nieuwe interpretaties." msgid "Unsubscribe" -msgstr "" +msgstr "Uitschrijven" msgid "Subscribe to get updates about new interpretations." -msgstr "" +msgstr "Abonneer u om updates over nieuwe interpretaties te ontvangen." msgid "Subscribe" -msgstr "" +msgstr "Abonneren" msgid "About this map" -msgstr "" +msgstr "Over deze kaart" msgid "About this line list" -msgstr "" +msgstr "Over deze lijnlijst" msgid "About this visualization" -msgstr "" +msgstr "Over deze visualisatie" msgid "This app could not retrieve required data." -msgstr "" +msgstr "Deze app kan de vereiste gegevens niet ophalen." msgid "Network error" -msgstr "" +msgstr "Netwerkfout" -msgid "Data Type" -msgstr "" +msgid "Data / Edit calculation" +msgstr "Gegevens / Berekening bewerken" -msgid "All types" +msgid "Data / New calculation" +msgstr "Gegevens / Nieuwe berekening" + +msgid "Remove item" +msgstr "Verwijder voorwerp" + +msgid "Check formula" +msgstr "Formule controleren" + +msgid "Calculation name" +msgstr "Berekening naam" + +msgid "Shown in table headers and chart axes/legends" +msgstr "Weergegeven in tabelkoppen en diagramassen/legenda's" + +msgid "Delete calculation" +msgstr "Berekening verwijderen" + +msgid "Cancel" +msgstr "Annuleer" + +msgid "The calculation can only be saved with a valid formula" +msgstr "De berekening kan alleen worden opgeslagen met een geldige formule" + +msgid "Add a name to save this calculation" +msgstr "Voeg een naam toe om deze berekening op te slaan" + +msgid "Save calculation" +msgstr "Berekening opslaan" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." msgstr "" +"Weet u zeker dat u deze berekening wilt verwijderen? Het kan worden gebruikt" +" door andere visualisaties." + +msgid "Yes, delete" +msgstr "Ja, verwijderen" msgid "Totals only" -msgstr "" +msgstr "Alleen totalen" msgid "Details only" +msgstr "Alleen details" + +msgid "Loading" +msgstr "Bezig met laden" + +msgid "Data elements" +msgstr "Gegevenselementen" + +msgid "Search by data element name" +msgstr "Zoeken op naam van gegevenselement" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "Geen gegevenselementen gevonden voor \"{{- searchTerm}}\"" + +msgid "No data elements found" +msgstr "Geen gegevenselementen gevonden" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" msgstr "" +"Sleep items hierheen, of dubbelklik in de lijst, om te beginnen met het " +"bouwen van een rekenformule" + +msgid "Math operators" +msgstr "Wiskundige operatoren" + +msgid "Data Type" +msgstr "Data type" + +msgid "All types" +msgstr "Alle typen" msgid "Disaggregation" -msgstr "" +msgstr "desaggregatie" msgid "No data" msgstr "Geen gegevens" -msgid "Loading" -msgstr "" - msgid "Search by data item name" -msgstr "" +msgstr "Zoeken op naam van gegevensitem" msgid "No items selected" -msgstr "" +msgstr "Geen items geselecteerd" msgid "Selected Items" -msgstr "" +msgstr "Geselecteerde voorwerpen" msgid "No indicators found" -msgstr "" - -msgid "No data elements found" -msgstr "" +msgstr "Geen indicatoren gevonden" msgid "No data sets found" -msgstr "" +msgstr "Geen datasets gevonden" msgid "No event data items found" -msgstr "" +msgstr "Geen item met gebeurtenisgegevens gevonden" msgid "No program indicators found" -msgstr "" +msgstr "Geen programma-indicatoren gevonden" msgid "No indicators found for \"{{- searchTerm}}\"" -msgstr "" - -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "Geen indicatoren gevonden voor \"{{- searchTerm}}\"" msgid "No data sets found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "Geen datasets gevonden voor \"{{- searchTerm}}\"" msgid "No event data items found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "Geen gebeurtenisgegevensitems gevonden voor \"{{- searchTerm}}\"" msgid "No program indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "Geen programma-indicatoren gevonden voor \"{{- searchTerm}}\"" msgid "Nothing found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "Niets gevonden voor \"{{- searchTerm}}\"" + +msgid "Calculation" +msgstr "Berekening" msgid "Metric type" -msgstr "" +msgstr "Metrische soort" msgid "All metrics" -msgstr "" +msgstr "Alle statistieken" msgid "Move to {{axisName}}" -msgstr "" +msgstr "Ga naar {{axisName}}" msgid "Add to {{axisName}}" msgstr "Voeg toe aan {{axisName}}" msgid "Not available for {{visualizationType}}" -msgstr "" +msgstr "Niet beschikbaar voor {{visualizationType}}" msgid "Remove Assigned Categories" -msgstr "" +msgstr "Verwijder toegewezen categorieën" msgid "Add Assigned Categories" msgstr "Voeg Toegewezen Categorieën toe" @@ -179,82 +244,83 @@ msgid "Your dimensions" msgstr "Uw dimensies" msgid "Dimension recommended with selected data" -msgstr "" +msgstr "Afmeting aanbevolen bij geselecteerde gegevens" msgid "All items" msgstr "Alle items" msgid "Automatically include all items" -msgstr "" +msgstr "Voeg automatisch alle items toe" msgid "" "Select all {{- dimensionTitle}} items. With this option, new items added in " "the future will be automatically included." msgstr "" +"Selecteer alle {{- dimensionTitle}} items. Met deze optie worden nieuwe " +"items die in de toekomst worden toegevoegd automatisch opgenomen." msgid "Manually select items..." -msgstr "" +msgstr "Items handmatig selecteren..." msgid "Nothing found in {{- dimensionTitle}}" -msgstr "" +msgstr "Niets gevonden in {{- dimensionTitle}}" msgid "Search" -msgstr "" +msgstr "Zoek" msgid "Nothing found for {{- searchTerm}}" -msgstr "" +msgstr "Niets gevonden voor {{- searchTerm}}" msgid "Delete {{fileType}}" -msgstr "" +msgstr "Verwijder {{fileType}}" msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" - -msgid "Cancel" -msgstr "Annuleer" +"Deze {{fileType}} en gerelateerde interpretaties worden verwijderd. " +"Doorgaan?" msgid "Delete" msgstr "Verwijderen" msgid "File" -msgstr "" +msgstr "Bestand" msgid "New" -msgstr "" +msgstr "Nieuw" msgid "Open…" -msgstr "" +msgstr "Open…" msgid "Save" msgstr "Sla op" msgid "Save…" -msgstr "" +msgstr "Redden…" msgid "Save as…" -msgstr "" +msgstr "Opslaan als…" msgid "Rename…" -msgstr "" +msgstr "Hernoemen..." msgid "Translate…" -msgstr "" +msgstr "Vertalen…" msgid "Share…" -msgstr "" +msgstr "Deel…" msgid "Get link…" -msgstr "" +msgstr "Krijg link…" msgid "Open in this app" -msgstr "" +msgstr "Openen in deze app" msgid "Close" msgstr "Sluit" msgid "Rename {{fileType}}" -msgstr "" +msgstr "Hernoem {{fileType}}" msgid "Name" msgstr "Naam" @@ -263,120 +329,137 @@ msgid "Description" msgstr "Beschrijving" msgid "Rename" -msgstr "" +msgstr "Hernoemen" -msgid "{{objectName}} (copy)" -msgstr "" +msgid "{{- objectName}} (copy)" +msgstr "{{- objectName}} (kopiëren)" msgid "Save {{fileType}} as" -msgstr "" +msgstr "Bewaar {{fileType}} als" msgid "event report" -msgstr "" +msgstr "evenement verslag" msgid "line list" -msgstr "" +msgstr "lijn lijst" msgid "map" -msgstr "" +msgstr "kaart" msgid "visualization" -msgstr "" +msgstr "visualisatie" msgid "Edit" msgstr "Bewerk" msgid "Write a reply" -msgstr "" +msgstr "Schrijf een reactie" msgid "Post reply" -msgstr "" +msgstr "Reageer" + +msgid "Delete failed" +msgstr "Verwijderen mislukt" msgid "Could not update comment" -msgstr "" +msgstr "Reactie kan niet worden bijgewerkt" msgid "Enter comment text" -msgstr "" +msgstr "Voer commentaartekst in" msgid "Update" msgstr "Bijwerken" msgid "Viewing interpretation: {{- visualisationName}}" -msgstr "" +msgstr "Interpretatie bekijken: {{- visualisationName}}" msgid "Could not load interpretation" -msgstr "" +msgstr "Kan interpretatie niet laden" msgid "" "The interpretation couldn’t be displayed. Try again or contact your system " "administrator." msgstr "" +"De interpretatie kon niet worden weergegeven. Probeer het opnieuw of neem " +"contact op met uw systeembeheerder." msgid "Hide interpretation" -msgstr "" +msgstr "Interpretatie verbergen" msgid "Write an interpretation" +msgstr "Schrijf een interpretatie" + +msgid "" +"Other people viewing this interpretation in the future may see more data." msgstr "" msgid "Post interpretation" -msgstr "" +msgstr "Interpretatie posten" msgid "Interpretations" msgstr "Interpretaties" +msgid "Reply" +msgstr "Antwoord" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} antwoord" +msgstr[1] "{{count}} antwoorden" + +msgid "View replies" +msgstr "Antwoorden bekijken" + msgid "Unlike" -msgstr "" +msgstr "in tegenstelling tot" msgid "Like" -msgstr "" - -msgid "Reply" -msgstr "" +msgstr "Leuk vinden" msgid "Share" -msgstr "" +msgstr "Deel" msgid "See interpretation" -msgstr "" +msgstr "Zie interpretatie" msgid "Manage sharing" -msgstr "" +msgstr "Beheer delen" msgid "Could not update interpretation" -msgstr "" +msgstr "Kan interpretatie niet updaten" msgid "Enter interpretation text" -msgstr "" +msgstr "Voer interpretatietekst in" msgid "Bold text" -msgstr "" +msgstr "Vetgedrukte tekst" msgid "Italic text" -msgstr "" +msgstr "Cursieve tekst" msgid "Link to a URL" -msgstr "" +msgstr "Link naar een URL" msgid "Mention a user" -msgstr "" +msgstr "Noem een gebruiker" msgid "Add emoji" -msgstr "" +msgstr "Emoji toevoegen" msgid "Preview" -msgstr "" +msgstr "Voorbeeld" msgid "Back to write mode" -msgstr "" +msgstr "Terug naar schrijfmodus" msgid "Too many results. Try refining the search." -msgstr "" +msgstr "Te veel resultaten. Probeer de zoekopdracht te verfijnen." msgid "Search for a user" -msgstr "" +msgstr "Zoek een gebruiker" msgid "Searching for \"{{- searchText}}\"" -msgstr "" +msgstr "Zoeken naar \"{{- searchText}}\"" msgid "No results found" msgstr "Geen resultaten gevonden" @@ -388,22 +471,22 @@ msgid "Created by" msgstr "Gecreëerd door" msgid "Anyone" -msgstr "" +msgstr "Iedereen" msgid "Only you" -msgstr "" +msgstr "Alleen jij" msgid "Others" -msgstr "" +msgstr "Anderen" msgid "Not supported by this app yet" -msgstr "" +msgstr "Nog niet ondersteund door deze app" msgid "Filter by name" -msgstr "" +msgstr "Filteren op naam" msgid "Created" -msgstr "" +msgstr "Gemaakt" msgid "Last updated" msgstr "Laatst bijgewerkt" @@ -412,107 +495,127 @@ msgid "Type" msgstr "Soort" msgid "Clear filters" -msgstr "" +msgstr "Wis filters" msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" -msgstr "" +msgstr "{{firstItemIndex}}-{{lastItemIndex}} van {{totalNumberOfItems}}" msgid "Open" -msgstr "" +msgstr "Open" msgid "Couldn't load items" -msgstr "" +msgstr "Kan items niet laden" msgid "" "There was a problem loading items. Try again or contact your system " "administrator." msgstr "" +"Er is een probleem opgetreden bij het laden van items. Probeer het opnieuw " +"of neem contact op met uw systeembeheerder." msgid "No items found. Create a new to get started." -msgstr "" +msgstr "Geen items gevonden. Maak een nieuwe aan om aan de slag te gaan." msgid "" "No items found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"Geen items gevonden. Probeer uw zoek- of filteropties aan te passen om te " +"vinden wat u zoekt." msgid "Create new" -msgstr "" +msgstr "Maak nieuw" msgid "Open a visualization" -msgstr "" +msgstr "Open een visualisatie" msgid "Loading visualizations" -msgstr "" +msgstr "Visualisaties laden" msgid "Couldn't load visualizations" -msgstr "" +msgstr "Kan visualisaties niet laden" msgid "" "There was a problem loading visualizations. Try again or contact your system" " administrator." msgstr "" +"Er is een probleem opgetreden bij het laden van visualisaties. Probeer het " +"opnieuw of neem contact op met uw systeembeheerder." msgid "No visualizations found. Click New visualization to get started." msgstr "" +"Geen visualisaties gevonden. Klik op Nieuwe visualisatie om aan de slag te " +"gaan." msgid "" "No visualizations found. Try adjusting your search or filter options to find" " what you're looking for." msgstr "" +"Geen visualisaties gevonden. Probeer uw zoek- of filteropties aan te passen " +"om te vinden wat u zoekt." msgid "New visualization" -msgstr "" +msgstr "Nieuwe visualisatie" msgid "Open a map" -msgstr "" +msgstr "Open een kaart" msgid "Loading maps" -msgstr "" +msgstr "Kaarten laden" msgid "Couldn't load maps" -msgstr "" +msgstr "Kan kaarten niet laden" msgid "" "There was a problem loading maps. Try again or contact your system " "administrator." msgstr "" +"Er is een probleem opgetreden bij het laden van kaarten. Probeer het opnieuw" +" of neem contact op met uw systeembeheerder." msgid "No maps found. Click New map to get started." -msgstr "" +msgstr "Geen kaarten gevonden. Klik op Nieuwe kaart om aan de slag te gaan." msgid "" "No maps found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"Geen kaarten gevonden. Probeer uw zoek- of filteropties aan te passen om te " +"vinden wat u zoekt." msgid "New map" -msgstr "" +msgstr "Nieuwe kaart" msgid "Open a line list" -msgstr "" +msgstr "Open een regellijst" msgid "Loading line lists" -msgstr "" +msgstr "Regellijsten laden" msgid "Couldn't load line lists" -msgstr "" +msgstr "Kan regellijsten niet laden" msgid "" "There was a problem loading line lists. Try again or contact your system " "administrator." msgstr "" +"Er is een probleem opgetreden bij het laden van regellijsten. Probeer het " +"opnieuw of neem contact op met uw systeembeheerder." msgid "No line lists found. Click New line list to get started." msgstr "" +"Geen regellijsten gevonden. Klik op Nieuwe regellijst om aan de slag te " +"gaan." msgid "" "No line lists found. Try adjusting your search or filter options to find " "what you're looking for." msgstr "" +"Geen regellijsten gevonden. Probeer uw zoek- of filteropties aan te passen " +"om te vinden wat u zoekt." msgid "New line list" -msgstr "" +msgstr "Nieuwe lijnlijst" msgid "Options" msgstr "Opties" @@ -522,42 +625,42 @@ msgstr "Verbergen" msgid "{{count}} org units" msgid_plural "{{count}} org units" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{{count}} organisatie-eenheid" +msgstr[1] "{{count}} organisatie-eenheden" msgid "{{count}} levels" msgid_plural "{{count}} levels" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{{count}} niveau" +msgstr[1] "{{count}} niveaus" msgid "{{count}} groups" msgid_plural "{{count}} groups" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{{count}} groep" +msgstr[1] "{{count}} groepen" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "" +msgstr "Geselecteerd: {{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" -msgstr "" +msgstr "Niets geselecteerd" msgid "User organisation unit" -msgstr "" +msgstr "Gebruikersorganisatie-eenheid" msgid "User sub-units" -msgstr "" +msgstr "Subeenheden van gebruikers" msgid "User sub-x2-units" -msgstr "" +msgstr "Gebruiker sub-x2-eenheden" msgid "Select a level" -msgstr "" +msgstr "Selecteer een niveau" msgid "Select a group" -msgstr "" +msgstr "Selecteer een groep" msgid "Deselect all" -msgstr "" +msgstr "Deselecteer alles" msgid "Period type" msgstr "Soort periode" @@ -566,64 +669,22 @@ msgid "Year" msgstr "Jaar" msgid "Select year" -msgstr "" +msgstr "Selecteer jaar" msgid "Period" msgstr "Periode" msgid "Relative periods" -msgstr "" +msgstr "Relatieve perioden" msgid "Fixed periods" -msgstr "" +msgstr "Vaste periodes" msgid "Selected Periods" -msgstr "" +msgstr "geselecteerde periodes" msgid "No periods selected" -msgstr "" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" +msgstr "Geen periodes geselecteerd" msgid "Daily" msgstr "Dagelijks" @@ -692,16 +753,16 @@ msgid "Last 14 days" msgstr "Laatste 14 dagen" msgid "Last 30 days" -msgstr "" +msgstr "Laatste 30 dagen" msgid "Last 60 days" -msgstr "" +msgstr "Laatste 60 dagen" msgid "Last 90 days" -msgstr "" +msgstr "Laatste 90 dagen" msgid "Last 180 days" -msgstr "" +msgstr "Laatste 180 dagen" msgid "This week" msgstr "Deze week" @@ -722,13 +783,13 @@ msgid "Weeks this year" msgstr "Weken dit jaar" msgid "This bi-week" -msgstr "" +msgstr "Deze tweewekelijkse" msgid "Last bi-week" -msgstr "" +msgstr "Afgelopen twee weken" msgid "Last 4 bi-weeks" -msgstr "" +msgstr "Laatste 4 twee weken" msgid "This month" msgstr "Deze maand" @@ -749,16 +810,16 @@ msgid "Months this year" msgstr "Maanden dit jaar" msgid "This bi-month" -msgstr "" +msgstr "Deze tweemaandelijkse" msgid "Last bi-month" -msgstr "" +msgstr "Laatste twee maanden" msgid "Last 6 bi-months" -msgstr "" +msgstr "Laatste 6 bi-maanden" msgid "Bi-months this year" -msgstr "" +msgstr "Tweemaandelijks dit jaar" msgid "This quarter" msgstr "Dit kwartier" @@ -779,7 +840,7 @@ msgid "Last six-month" msgstr "Laatste halfjaar" msgid "Last 2 six-month" -msgstr "" +msgstr "Laatste 2 zes maanden" msgid "This financial year" msgstr "Dit financieel jaar" @@ -800,61 +861,64 @@ msgid "Last 5 years" msgstr "Laatste 5 jaren" msgid "Last 10 years" -msgstr "" +msgstr "Laatste 10 jaar" msgid "Days" -msgstr "" +msgstr "Dagen" msgid "Weeks" -msgstr "" +msgstr "Weken" msgid "Bi-weeks" -msgstr "" +msgstr "Twee weken" msgid "Months" -msgstr "" +msgstr "Maanden" msgid "Bi-months" -msgstr "" +msgstr "Twee maanden" msgid "Quarters" -msgstr "" +msgstr "Kwartalen" msgid "Six-months" -msgstr "" +msgstr "Zes maanden" msgid "Financial Years" -msgstr "" +msgstr "Boekjaren" msgid "Years" -msgstr "" +msgstr "Jaren" + +msgid "Interpretations and details" +msgstr "Interpretaties en details" msgid "Translating to" -msgstr "" +msgstr "Vertalen naar" msgid "Choose a locale" -msgstr "" +msgstr "Kies een locatie" msgid "Base locale reference" -msgstr "" +msgstr "Base locale-referentie" msgid "Choose a locale to translate from the menu above" -msgstr "" +msgstr "Kies een landinstelling om te vertalen in het bovenstaande menu" msgid "Translate: {{objectName}}" -msgstr "" +msgstr "Vertalen: {{objectName}}" msgid "Save translations" -msgstr "" +msgstr "Sla vertalingen op" msgid "Cannot save while offline" -msgstr "" +msgstr "Kan offline niet opslaan" msgid "Could not load translations" -msgstr "" +msgstr "Kan vertalingen niet laden" msgid "Retry" -msgstr "" +msgstr "Opnieuw proberen" msgid "Series" msgstr "Reeks" @@ -866,55 +930,52 @@ msgid "Filter" msgstr "Filter" msgid "Columns" -msgstr "" +msgstr "Kolommen" msgid "Rows" -msgstr "" +msgstr "Rijen" msgid "Points" -msgstr "" +msgstr "Punten" msgid "Reporting rate" -msgstr "" +msgstr "Rapportagepercentage" msgid "Reporting rate on time" -msgstr "" +msgstr "Rapportagepercentage op tijd" msgid "Actual reports" -msgstr "" +msgstr "Actuele rapporten" msgid "Actual reports on time" -msgstr "" +msgstr "Actuele rapporten op tijd" msgid "Expected reports" -msgstr "" +msgstr "Verwachte rapporten" msgid "Program" msgstr "Programma" msgid "Select a program" -msgstr "" +msgstr "Selecteer een programma" msgid "Indicators" -msgstr "" +msgstr "Indicatoren" msgid "Indicator group" msgstr "Indicatorgroep" msgid "All groups" -msgstr "" +msgstr "Alle groepen" msgid "Indicator" msgstr "Indicator" msgid "No indicator groups found" -msgstr "" +msgstr "Geen indicatorgroepen gevonden" msgid "Loading indicator groups" -msgstr "" - -msgid "Data elements" -msgstr "Gegevenselementen" +msgstr "Indicatorgroepen laden" msgid "Data element group" msgstr "Gegevenselementengroep" @@ -923,37 +984,37 @@ msgid "Data element" msgstr "informatie onderdeel" msgid "No data element groups found" -msgstr "" +msgstr "Geen gegevenselementgroepen gevonden" msgid "Loading data element groups" -msgstr "" +msgstr "Data-elementgroepen laden" msgid "Data sets" -msgstr "" +msgstr "Gegevensreeksen" msgid "Data set" msgstr "Gegevensreeks" msgid "All data sets" -msgstr "" +msgstr "Alle datasets" msgid "Loading data sets" -msgstr "" +msgstr "Datasets laden" msgid "Event data items" msgstr "Gebeurtenisgegevensitems" msgid "All programs" -msgstr "" +msgstr "Alle programma's" msgid "Event data item" msgstr "Gebeurtenisgegevensitem" msgid "No programs found" -msgstr "" +msgstr "Geen programma's gevonden" msgid "Loading programs" -msgstr "" +msgstr "Programma's laden" msgid "Program indicators" msgstr "Programmaindicators" @@ -961,83 +1022,112 @@ msgstr "Programmaindicators" msgid "Program indicator" msgstr "Programmaindicator" -msgid "Extra Small" +msgid "Calculations" +msgstr "Berekeningen" + +msgid "Number" +msgstr "Nummer" + +msgid "Formula is empty. Add items to the formula from the lists on the left." msgstr "" +"Formule is leeg. Voeg items toe aan de formule uit de lijsten aan de " +"linkerkant." + +msgid "Consecutive math operators" +msgstr "Opeenvolgende wiskundige operatoren" + +msgid "Consecutive data elements" +msgstr "Opeenvolgende gegevenselementen" + +msgid "Starts or ends with a math operator" +msgstr "Begint of eindigt met een wiskundige operator" + +msgid "Empty parentheses" +msgstr "Lege haakjes" + +msgid "Missing right parenthesis )" +msgstr "Rechter haakje ontbreekt)" + +msgid "Missing left parenthesis (" +msgstr "Linker haakje ontbreekt (" + +msgid "Extra Small" +msgstr "Extra klein" msgid "Small" -msgstr "" +msgstr "Klein" msgid "Regular" -msgstr "" +msgstr "Normaal" msgid "Large" -msgstr "" +msgstr "Groot" msgid "Extra Large" -msgstr "" +msgstr "Extra groot" msgid "Left" -msgstr "" +msgstr "Links" msgid "Center" -msgstr "" +msgstr "Centrum" msgid "Right" -msgstr "" +msgstr "Rechts" msgid "Start" -msgstr "" +msgstr "Begin" msgid "Middle" -msgstr "" +msgstr "Midden" msgid "End" -msgstr "" +msgstr "Einde" msgid "Top" -msgstr "" +msgstr "Bovenkant" msgid "Bottom" -msgstr "" +msgstr "Onderkant" msgid "{{dynamicOuNames}} and {{lastOuName}}" -msgstr "" +msgstr "{{dynamicOuNames}} en {{lastOuName}}" msgid "{{allDynamicOuNames}} levels" -msgstr "" +msgstr "{{allDynamicOuNames}} niveaus" msgid "{{allDynamicOuNames}} groups" -msgstr "" +msgstr "{{allDynamicOuNames}} groepen" msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" -msgstr "" +msgstr "{{allDynamicOuNames}} niveaus in {{staticOuNames}}" msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" -msgstr "" +msgstr "{{allDynamicOuNames}} groepen in {{staticOuNames}}" msgid "{{percentage}}% of total x values" -msgstr "" +msgstr "{{percentage}}% van totale x waarden" msgid "{{percentage}}% of total y values" -msgstr "" +msgstr "{{percentage}}% van totale y-waarden" msgid "{{thresholdFactor}} × IQR Q1" -msgstr "" +msgstr "{{thresholdFactor}} × IQR Q1" msgid "{{thresholdFactor}} × IQR Q3" -msgstr "" +msgstr "{{thresholdFactor}} × IQR Q3" msgid "{{thresholdFactor}} × Modified Z-score low" -msgstr "" +msgstr "{{thresholdFactor}} × Aangepaste Z-score laag" msgid "{{thresholdFactor}} × Modified Z-score high" -msgstr "" +msgstr "{{thresholdFactor}} × Aangepaste Z-score hoog" msgid "{{thresholdFactor}} × Z-score low" -msgstr "" +msgstr "{{thresholdFactor}} × Z-score laag" msgid "{{thresholdFactor}} × Z-score high" -msgstr "" +msgstr "{{thresholdFactor}} × Z-score hoog" msgid "Data" msgstr "Gegevens" @@ -1046,16 +1136,16 @@ msgid "Organisation unit" msgstr "Organisatieëenheid" msgid "Assigned Categories" -msgstr "" +msgstr "Toegewezen categorieën" msgid "Pivot table" -msgstr "" +msgstr "Draaitafel" msgid "Area" msgstr "Oppervlakte" msgid "Stacked area" -msgstr "" +msgstr "Gestapeld gebied" msgid "Bar" msgstr "Staaf" @@ -1079,7 +1169,7 @@ msgid "Line" msgstr "Lijn" msgid "Line list" -msgstr "" +msgstr "Lijn lijst" msgid "Year over year (line)" msgstr "Jaar over jaar (lijn)" @@ -1091,42 +1181,42 @@ msgid "Radar" msgstr "Radar" msgid "Scatter" -msgstr "" +msgstr "Verstrooien" msgid "Single value" -msgstr "" +msgstr "Enkele waarde" msgid "All charts" -msgstr "" +msgstr "Alle grafieken" msgid "{{seriesName}} (trend)" -msgstr "" +msgstr "{{seriesName}} (trend)" msgid "Trend" -msgstr "" +msgstr "Trend" msgid "No legend for this series" -msgstr "" +msgstr "Geen legende voor deze serie" msgid "and {{amount}} more..." -msgstr "" +msgstr "en nog {{amount}} meer..." msgid "Linear Regression" -msgstr "" +msgstr "Lineaire regressie" msgid "Target" -msgstr "" +msgstr "Doel" msgid "Base" -msgstr "" +msgstr "Baseren" msgid "Axis {{axisId}}" -msgstr "" +msgstr "As {{axisId}}" msgid "{{count}} items" msgid_plural "{{count}} items" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{{count}} artikel" +msgstr[1] "{{count}} artikelen" msgid "Reset zoom" -msgstr "" +msgstr "Zoom resetten" diff --git a/i18n/prs.po b/i18n/prs.po index 292673b66..128c2fc79 100644 --- a/i18n/prs.po +++ b/i18n/prs.po @@ -1,14 +1,14 @@ # # Translators: -# phil_dhis2, 2022 +# phil_dhis2, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-04-18T08:41:27.838Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: phil_dhis2, 2022\n" -"Language-Team: Persian (Afghanistan) (https://www.transifex.com/hisp-uio/teams/100509/fa_AF/)\n" +"Last-Translator: phil_dhis2, 2023\n" +"Language-Team: Persian (Afghanistan) (https://app.transifex.com/hisp-uio/teams/100509/fa_AF/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -80,10 +80,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "انصراف" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -92,15 +127,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "در حال بار کردن" + +msgid "Data elements" +msgstr "دیتا ایلمنت ها" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + msgid "Disaggregation" msgstr "تکثیر" msgid "No data" msgstr "معلوماتی وجود ندارد" -msgid "Loading" -msgstr "در حال بار کردن" - msgid "Search by data item name" msgstr "" @@ -113,9 +174,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -128,9 +186,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -143,6 +198,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -209,9 +267,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "انصراف" - msgid "Delete" msgstr "حذف" @@ -263,6 +318,9 @@ msgstr "شرح" msgid "Rename" msgstr "تغییر نام" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -376,6 +434,9 @@ msgstr "" msgid "No results found" msgstr "هیج نتیجه ی یافت نشد" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "ایجاد شده توسط" @@ -575,48 +636,6 @@ msgstr "" msgid "No periods selected" msgstr "هېڅ مودې نه دي غوره شوې" -msgid "January" -msgstr "جنوری" - -msgid "February" -msgstr "فبروری" - -msgid "March" -msgstr "مارچ" - -msgid "April" -msgstr "آپریل" - -msgid "May" -msgstr "می" - -msgid "June" -msgstr "جون" - -msgid "July" -msgstr "جولای" - -msgid "August" -msgstr "آگست" - -msgid "September" -msgstr "سپتامبر" - -msgid "October" -msgstr "اکتبر" - -msgid "November" -msgstr "نوامبر" - -msgid "December" -msgstr "دسامبر" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "روزنه" @@ -839,6 +858,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -902,9 +924,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "دیتا ایلمنت ها" - msgid "Data element group" msgstr "د مالوماتو (ډاټا) د برخې ګروپ" @@ -950,6 +969,33 @@ msgstr "د پروګرام شاخصونه" msgid "Program indicator" msgstr "ایجاد پروگرام شاخص" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "نمبر" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/ps.po b/i18n/ps.po index 988a67ff7..0852be527 100644 --- a/i18n/ps.po +++ b/i18n/ps.po @@ -1,15 +1,15 @@ # # Translators: # Viktor Varland , 2022 -# phil_dhis2, 2022 +# phil_dhis2, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-04-18T08:41:27.838Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: phil_dhis2, 2022\n" -"Language-Team: Pashto (https://www.transifex.com/hisp-uio/teams/100509/ps/)\n" +"Last-Translator: phil_dhis2, 2023\n" +"Language-Team: Pashto (https://app.transifex.com/hisp-uio/teams/100509/ps/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -81,10 +81,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "رد یې کړئ [ ژباړه ـ ردول ]" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -93,15 +128,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "د پورته کېدو یا لوډینګ په حال کې" + +msgid "Data elements" +msgstr "د مالوماتو (ډاټا) برخې" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + msgid "Disaggregation" msgstr "" msgid "No data" msgstr "د مالوماتو (ډاټا) نشتوالۍ" -msgid "Loading" -msgstr "د پورته کېدو یا لوډینګ په حال کې" - msgid "Search by data item name" msgstr "" @@ -114,9 +175,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -129,9 +187,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -144,6 +199,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -210,9 +268,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "رد یې کړئ [ ژباړه ـ ردول ]" - msgid "Delete" msgstr "خذف یې کړئ" @@ -264,6 +319,9 @@ msgstr "تشریح [ ژباړه ـ نښه ـ تشریح ]" msgid "Rename" msgstr "بیا نومول" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -377,6 +435,9 @@ msgstr "" msgid "No results found" msgstr "هېڅ پایله ترلاسه نه شوه" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "لخوا ایجاد یا رامنځ ته شوی" @@ -576,48 +637,6 @@ msgstr "" msgid "No periods selected" msgstr "هېڅ مودې نه دي غوره شوې" -msgid "January" -msgstr "جنوري" - -msgid "February" -msgstr "فبروري" - -msgid "March" -msgstr "مارچ" - -msgid "April" -msgstr "اپرېل" - -msgid "May" -msgstr "می [ میاشت. می]" - -msgid "June" -msgstr "جون" - -msgid "July" -msgstr "جولای" - -msgid "August" -msgstr "اګست" - -msgid "September" -msgstr "سپټمبر" - -msgid "October" -msgstr "اکتوبر" - -msgid "November" -msgstr "نومبر" - -msgid "December" -msgstr "ډیسمبر" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "ورځني [ د مودې ډول ]" @@ -840,6 +859,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -903,9 +925,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "د مالوماتو (ډاټا) برخې" - msgid "Data element group" msgstr "د مالوماتو (ډاټا) د برخې ګروپ" @@ -951,6 +970,33 @@ msgstr "د پروګرام شاخص" msgid "Program indicator" msgstr "" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "عدد [ بشپړ عدد ]" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/pt.po b/i18n/pt.po index a5a8c0f1d..974f1160e 100644 --- a/i18n/pt.po +++ b/i18n/pt.po @@ -1,19 +1,21 @@ # # Translators: # Sheila André , 2020 -# phil_dhis2, 2022 +# Viktor Varland , 2021 # Gabriela Rodriguez , 2022 # Ge Joao , 2022 -# Viktor Varland , 2022 # Fernando Jorge Bade, 2022 +# David Júnior , 2023 +# Philip Larsen Donnelly, 2024 +# Shelsea Chumaio, 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2024-10-11T12:49:26.846Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Fernando Jorge Bade, 2022\n" -"Language-Team: Portuguese (https://www.transifex.com/hisp-uio/teams/100509/pt/)\n" +"Last-Translator: Shelsea Chumaio, 2024\n" +"Language-Team: Portuguese (https://app.transifex.com/hisp-uio/teams/100509/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -21,148 +23,225 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" msgid "view only" -msgstr "" +msgstr " apenas para visualização" msgid "view and edit" -msgstr "" +msgstr "visualizar e editar" msgid "all users ({{accessLevel}})" -msgstr "" +msgstr "todos utilizadores ({{accessLevel}})" msgid "{{userOrGroup}} ({{accessLevel}})" -msgstr "" +msgstr "{{userOrGroup}}({{accessLevel}})" msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" -msgstr "" +msgstr " Partilhado com{{commaSeparatedListOfUsersAndGroups}}" msgid "Not shared with any users or groups" -msgstr "" +msgstr " Não partilhado com quaisquer utilizadores ou grupos" msgid "No description" msgstr "Sem descrição" msgid "Last updated {{time}}" -msgstr "" +msgstr " Última actualização{{time}}" msgid "Created {{time}} by {{author}}" -msgstr "" +msgstr "Criado{{time}} por {{author}}" msgid "Created {{time}}" -msgstr "" +msgstr "Criado {{time}}" msgid "Viewed {{count}} times" msgid_plural "Viewed {{count}} times" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Visualizado 1 vez" +msgstr[1] "Visualizado {{count}} vezes" +msgstr[2] "Visualizado {{count}} vezes" msgid "Notifications" msgstr "Notificação" msgid "You're subscribed and getting updates about new interpretations." -msgstr "" +msgstr " Está inscrito para receber actualizações sobre novas interpretações." msgid "Unsubscribe" -msgstr "" +msgstr " Cancelar a subscrição" msgid "Subscribe to get updates about new interpretations." -msgstr "" +msgstr " Subscreva para receber actualizações sobre novas interpretações." msgid "Subscribe" -msgstr "" +msgstr "Subcreva" msgid "About this map" -msgstr "" +msgstr " Sobre este mapa" msgid "About this line list" -msgstr "" +msgstr " Sobre esta lista de linhas" msgid "About this visualization" -msgstr "" +msgstr " Sobre esta visualização" + +msgid "About this event chart" +msgstr "Sobre esta tabela de eventos" + +msgid "About this event report" +msgstr "Sobre este relatório de evento" msgid "This app could not retrieve required data." -msgstr "" +msgstr " Esta aplicação não conseguiu obter os dados necessários." msgid "Network error" -msgstr "" +msgstr " Erro de rede" -msgid "Data Type" -msgstr "Tipo de dados" +msgid "Data / Edit calculation" +msgstr " Dados / Editar cálculo" -msgid "All types" -msgstr "Todos os tipos" +msgid "Data / New calculation" +msgstr " Dados / Novo cálculo" -msgid "Totals only" +msgid "Remove item" +msgstr " Remover item" + +msgid "Check formula" +msgstr " Verificar a fórmula" + +msgid "Calculation name" +msgstr "Designação do cálculo" + +msgid "Shown in table headers and chart axes/legends" +msgstr " Apresentado em cabeçalhos de tabelas e eixos/legendas de gráficos" + +msgid "Delete calculation" +msgstr "Eliminar cálculo" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "The calculation can only be saved with a valid formula" +msgstr "O cálculo só pode ser guardado com uma fórmula válida" + +msgid "Add a name to save this calculation" +msgstr " Adicionar um nome para guardar este cálculo" + +msgid "Save calculation" +msgstr "Gravar cálculo" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." msgstr "" +"Tem a certeza de que pretende eliminar este cálculo? Ele pode ser usado por " +"outras visualizações." + +msgid "Yes, delete" +msgstr "Sim, eliminar" + +msgid "Totals only" +msgstr "Apenas os totais" msgid "Details only" +msgstr "Apenas os detalhes" + +msgid "Loading" +msgstr "Carregando" + +msgid "Data elements" +msgstr "Elementos de Dados" + +msgid "Search by data element name" +msgstr " Pesquisa por nome de elemento de dados" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr " Não foram encontrados elementos de dados para \"{{- searchTerm}}''" + +msgid "No data elements found" +msgstr "Nenhum elemento de dados encontrado" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" msgstr "" +"Arraste os itens para aqui, ou faça duplo clique na lista, para começar a " +"criar uma fórmula de cálculo" + +msgid "Math operators" +msgstr " Operadores matemáticos" + +msgid "Data Type" +msgstr "Tipo de dados" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "Apenas {{dataType}} pode ser usado em{{visType}}" + +msgid "All types" +msgstr "Todos os tipos" msgid "Disaggregation" msgstr "Desagregação" msgid "No data" -msgstr "Não ha dados" - -msgid "Loading" -msgstr "Carregando.." +msgstr "Não há dados" msgid "Search by data item name" -msgstr "" +msgstr " Pesquisa por nome de item de dados" msgid "No items selected" -msgstr "" +msgstr " Nenhum item seleccionado" msgid "Selected Items" -msgstr "" +msgstr " Itens seleccionados" msgid "No indicators found" -msgstr "" - -msgid "No data elements found" -msgstr "" +msgstr "Nenhum indicador encontrado" msgid "No data sets found" -msgstr "" +msgstr "Nenhum conjunto de dados encontrado" msgid "No event data items found" -msgstr "" +msgstr " Nenhum dado de evento encontrado" msgid "No program indicators found" -msgstr "" +msgstr " Nenhum indicador de programa encontrado" -msgid "No indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgid "No calculations found" +msgstr "Nenhum cálculo encontrado" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr " Nenhum indicador foi encontrado para ''{{- searchTerm}}''" msgid "No data sets found for \"{{- searchTerm}}\"" -msgstr "" +msgstr " Nenhum conjunto de dados encontrado para ''{{- searchTerm}}''" msgid "No event data items found for \"{{- searchTerm}}\"" -msgstr "" +msgstr " Nenhum dado de evento encontrado para ''{{- searchTerm}}''" msgid "No program indicators found for \"{{- searchTerm}}\"" -msgstr "" +msgstr "Nenhum indicador de programa encontrado para ''{{- searchTerm}}''" + +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "Nenhum cálculo encontrado para ''{{- searchTerm}}''" msgid "Nothing found for \"{{- searchTerm}}\"" -msgstr "" +msgstr " Nada encontrado para ''{{- searchTerm}}''" + +msgid "Calculation" +msgstr " Cálculo" msgid "Metric type" -msgstr "" +msgstr " Tipo de métrica" msgid "All metrics" msgstr "Todas métricas" msgid "Move to {{axisName}}" -msgstr "Mover para {{Nomedoeixo}}" +msgstr "Mover para {{axisName}}" msgid "Add to {{axisName}}" -msgstr "Adicionar à {{Nomedoeixo}}" +msgstr "Adicionar à {{axisName}}" msgid "Not available for {{visualizationType}}" -msgstr "Não disponível para {{Tipodevisualização}}" +msgstr "Não disponível para {{visualizationType}}" msgid "Remove Assigned Categories" msgstr "Remover categorias atribuídas" @@ -189,37 +268,38 @@ msgid "All items" msgstr "Todos Itens" msgid "Automatically include all items" -msgstr "" +msgstr " Incluir automaticamente todos os itens" msgid "" "Select all {{- dimensionTitle}} items. With this option, new items added in " "the future will be automatically included." msgstr "" +" Seleccionar todos os itens {{- dimensionTitle}}. Com esta opção, os novos " +"itens adicionados no futuro serão automaticamente incluídos." msgid "Manually select items..." -msgstr "" +msgstr "Seleccionar manualmente os itens..." msgid "Nothing found in {{- dimensionTitle}}" -msgstr "" +msgstr " Nada encontrado em {{- dimensionTitle}}" msgid "Search" msgstr "Pesquisar" msgid "Nothing found for {{- searchTerm}}" -msgstr "" +msgstr " Nada encontrado para {{- searchTerm}}" msgid "Delete {{fileType}}" -msgstr "" +msgstr " Eliminar {{fileType}}" msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" - -msgid "Cancel" -msgstr "Cancelar" +" Este {{fileType}} e as interpretações relacionadas serão eliminados. " +"Continuar?" msgid "Delete" -msgstr "Suprimir" +msgstr "Eliminar" msgid "File" msgstr "Arquivo" @@ -228,28 +308,28 @@ msgid "New" msgstr "Novo" msgid "Open…" -msgstr "" +msgstr " Abrir..." msgid "Save" msgstr "Salvar" msgid "Save…" -msgstr "" +msgstr "Gravar" msgid "Save as…" -msgstr "" +msgstr "Gravar como..." msgid "Rename…" -msgstr "" +msgstr "Renomear..." msgid "Translate…" -msgstr "" +msgstr "Traduzir..." msgid "Share…" -msgstr "" +msgstr "Partilhar..." msgid "Get link…" -msgstr "" +msgstr "Obter link..." msgid "Open in this app" msgstr "Abrir neste aplicativo" @@ -258,7 +338,7 @@ msgid "Close" msgstr "Fechar" msgid "Rename {{fileType}}" -msgstr "" +msgstr "Renomear {{fileType}}" msgid "Name" msgstr "Nome" @@ -269,23 +349,23 @@ msgstr "Descrição" msgid "Rename" msgstr "Renomear" -msgid "{{objectName}} (copy)" -msgstr "" +msgid "{{- objectName}} (copy)" +msgstr "{{- objectName}}(cópia)" msgid "Save {{fileType}} as" -msgstr "" +msgstr "Gravar {{fileType}} como" msgid "event report" msgstr "relatório de evento" msgid "line list" -msgstr "" +msgstr "lista de linha" msgid "map" msgstr "mapa" msgid "visualization" -msgstr "" +msgstr "visualização" msgid "Edit" msgstr "Editar" @@ -294,22 +374,25 @@ msgid "Write a reply" msgstr "Escreva uma resposta" msgid "Post reply" -msgstr "" +msgstr "Publicar resposta" + +msgid "Delete failed" +msgstr "Falha na eliminação" msgid "Could not update comment" -msgstr "" +msgstr " Não foi possível actualizar o comentário" msgid "Enter comment text" -msgstr "" +msgstr "Introduzir o texto do comentário" msgid "Update" msgstr "Actualizar" msgid "Viewing interpretation: {{- visualisationName}}" -msgstr "" +msgstr "Ver interpretação: {{- visualisationName}}" msgid "Could not load interpretation" -msgstr "" +msgstr " Não foi possível carregar a interpretação" msgid "" "The interpretation couldn’t be displayed. Try again or contact your system " @@ -317,73 +400,58 @@ msgid "" msgstr "" msgid "Hide interpretation" -msgstr "" +msgstr " Ocultar interpretação" msgid "Write an interpretation" msgstr "Escreva uma interpretação" -msgid "Post interpretation" +msgid "" +"Other people viewing this interpretation in the future may see more data." msgstr "" +"Outras pessoas que vejam esta interpretação no futuro poderão ver mais " +"dados." + +msgid "Post interpretation" +msgstr "Publicar interpretação" msgid "Interpretations" msgstr "Interpretações" +msgid "Reply" +msgstr "Responder" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} resposta" +msgstr[1] "{{count}} respostas" +msgstr[2] "{{count}} respostas" + +msgid "View replies" +msgstr "Ver respostas" + msgid "Unlike" -msgstr "Ao contrário" +msgstr "Diferente" msgid "Like" msgstr "como" -msgid "Reply" -msgstr "Responder" +msgid "See interpretation" +msgstr " Ver interpretação" -msgid "Share" -msgstr "Partilha" +msgid "Open in app" +msgstr " Abrir na aplicação" -msgid "See interpretation" -msgstr "" +msgid "Share" +msgstr " Partilhar" msgid "Manage sharing" -msgstr "Gerenciar compartilhamento" +msgstr "Gerir a partilha" msgid "Could not update interpretation" -msgstr "" +msgstr "Não foi possível actualizar a interpretação" msgid "Enter interpretation text" -msgstr "" - -msgid "Bold text" -msgstr "" - -msgid "Italic text" -msgstr "" - -msgid "Link to a URL" -msgstr "" - -msgid "Mention a user" -msgstr "" - -msgid "Add emoji" -msgstr "" - -msgid "Preview" -msgstr "Pré-visualização" - -msgid "Back to write mode" -msgstr "" - -msgid "Too many results. Try refining the search." -msgstr "" - -msgid "Search for a user" -msgstr "" - -msgid "Searching for \"{{- searchText}}\"" -msgstr "" - -msgid "No results found" -msgstr "Nenhum resultado encontrado" +msgstr "Introduzir texto de interpretação" msgid "Not available offline" msgstr "Não disponível offline" @@ -392,16 +460,16 @@ msgid "Created by" msgstr "Criado por" msgid "Anyone" -msgstr "" +msgstr "Qualquer um" msgid "Only you" -msgstr "" +msgstr "Apenas tu" msgid "Others" msgstr "Outros" msgid "Not supported by this app yet" -msgstr "" +msgstr "Ainda não suportado por esta aplicação" msgid "Filter by name" msgstr "Filtrar por nome" @@ -419,149 +487,169 @@ msgid "Clear filters" msgstr "Limpar filtros" msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" -msgstr "" +msgstr "{{firstItemIndex}}-{{lastItemIndex}} de {{totalNumberOfItems}}" msgid "Open" -msgstr "Abrir" +msgstr "Aberto" msgid "Couldn't load items" -msgstr "" +msgstr "Não foi possível carregar itens" msgid "" "There was a problem loading items. Try again or contact your system " "administrator." msgstr "" +"Houve um problema ao carregar itens. Tente novamente ou contacte o " +"administrador do sistema." msgid "No items found. Create a new to get started." -msgstr "" +msgstr "Nenhum item encontrado. Criar um novo para começar." msgid "" "No items found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"Nenhum item encontrado. Tente ajustar as suas opções de pesquisa ou de " +"filtro para encontrar o que procura." msgid "Create new" msgstr "Crie um novo" msgid "Open a visualization" -msgstr "" +msgstr "Abrir uma visualização" msgid "Loading visualizations" -msgstr "" +msgstr "Carregar visualizações" msgid "Couldn't load visualizations" -msgstr "" +msgstr " Não foi possível carregar visualizações" msgid "" "There was a problem loading visualizations. Try again or contact your system" " administrator." msgstr "" +"Houve um problema ao carregar as visualizações. Tente novamente ou contacte " +"o administrador do sistema." msgid "No visualizations found. Click New visualization to get started." msgstr "" +"Não foram encontradas visualizações. Clique em Nova visualização para " +"começar." msgid "" "No visualizations found. Try adjusting your search or filter options to find" " what you're looking for." msgstr "" +"Não foram encontradas visualizações. Tente ajustar as suas opções de " +"pesquisa ou de filtro para encontrar o que procura." msgid "New visualization" -msgstr "" +msgstr "Nova visualização" msgid "Open a map" -msgstr "" +msgstr "Abrir um mapa" msgid "Loading maps" -msgstr "" +msgstr "Carregar mapas" msgid "Couldn't load maps" -msgstr "" +msgstr "Não foi possível carregar mapas" msgid "" "There was a problem loading maps. Try again or contact your system " "administrator." msgstr "" +"Houve um problema ao carregar os mapas. Tente novamente ou contacte o " +"administrador do sistema." msgid "No maps found. Click New map to get started." -msgstr "" +msgstr "Não foram encontrados mapas. Clique em Novo mapa para começar." msgid "" "No maps found. Try adjusting your search or filter options to find what " "you're looking for." msgstr "" +"Não foram encontrados mapas. Tente ajustar as suas opções de pesquisa ou de " +"filtro para encontrar o que procura." msgid "New map" -msgstr "" +msgstr "Novo mapa" msgid "Open a line list" -msgstr "" +msgstr "Abrir uma lista de linhas" msgid "Loading line lists" -msgstr "" +msgstr "Carregar listas de linhas" msgid "Couldn't load line lists" -msgstr "" +msgstr "Não foi possível carregar as listas de linhas" msgid "" "There was a problem loading line lists. Try again or contact your system " "administrator." msgstr "" +"Houve um problema ao carregar as listas de linhas. Tente novamente ou " +"contacte o administrador do sistema." msgid "No line lists found. Click New line list to get started." msgstr "" +"Não foram encontradas listas de linhas. Clique em Nova lista de linhas para " +"começar." msgid "" "No line lists found. Try adjusting your search or filter options to find " "what you're looking for." msgstr "" +"Não foram encontradas listas de linhas. Tente ajustar as suas opções de " +"pesquisa ou de filtro para encontrar o que procura." msgid "New line list" -msgstr "" +msgstr "Nova lista de linhas" msgid "Options" msgstr "Opções" msgid "Hide" -msgstr "Esconder" +msgstr "Ocultar" msgid "{{count}} org units" msgid_plural "{{count}} org units" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} unidade orgânica" +msgstr[1] "{{count}} unidades orgânicas" +msgstr[2] "{{count}} unidades organizacionais" msgid "{{count}} levels" msgid_plural "{{count}} levels" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} nível" +msgstr[1] "{{count}} níveis" +msgstr[2] "{{count}} níveis" msgid "{{count}} groups" msgid_plural "{{count}} groups" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{{count}} grupo" +msgstr[1] "{{count}} grupos" +msgstr[2] "{{count}} grupos" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "" +msgstr "Seleccionado: {{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" -msgstr "" +msgstr "Nada seleccionado" msgid "User organisation unit" msgstr "Unidade organizacional do utilizador" msgid "User sub-units" -msgstr "Dois níveis abaixo" +msgstr "Sub-unidades do utilizador" msgid "User sub-x2-units" -msgstr "Dois níveis abaixo" +msgstr "Sub-unidades nível 2 do utilizador" msgid "Select a level" -msgstr "Selecione um nível" +msgstr "Seleccione um nível" msgid "Select a group" -msgstr "Selecione um grupo" +msgstr "Seleccione um grupo" msgid "Deselect all" msgstr "Desmarcar todos" @@ -573,65 +661,23 @@ msgid "Year" msgstr "Ano" msgid "Select year" -msgstr "Selecionar ano" +msgstr "Seleccionar ano" msgid "Period" msgstr "Período" +msgid "Selected Periods" +msgstr "Períodos seleccionados" + msgid "Relative periods" msgstr "Períodos relativos" msgid "Fixed periods" msgstr "Períodos fixos" -msgid "Selected Periods" -msgstr "" - msgid "No periods selected" msgstr "Não há períodos relativos seleccionados" -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "Diário" @@ -639,16 +685,16 @@ msgid "Weekly" msgstr "Semanal" msgid "Weekly (Start Wednesday)" -msgstr "" +msgstr "Semanalmente (início na Quarta-feira)" msgid "Weekly (Start Thursday)" -msgstr "" +msgstr " Semanal (início na Quinta-feira)" msgid "Weekly (Start Saturday)" -msgstr "" +msgstr " Semanal (início no Sábado)" msgid "Weekly (Start Sunday)" -msgstr "" +msgstr " Semanal (início no Domingo)" msgid "Bi-weekly" msgstr "Quinzenal" @@ -657,7 +703,7 @@ msgid "Monthly" msgstr "Mensal" msgid "Bi-monthly" -msgstr "Bimensal" +msgstr "Bimestre" msgid "Quarterly" msgstr "Trimestral" @@ -672,16 +718,16 @@ msgid "Yearly" msgstr "Anualmente" msgid "Financial year (Start November)" -msgstr "" +msgstr " Ano financeiro (início em Novembro)" msgid "Financial year (Start October)" -msgstr "Ano Financeiro - Outubro" +msgstr "Ano financeiro (início em Outubro)" msgid "Financial year (Start July)" -msgstr "Ano Financeiro - Julho" +msgstr "Ano financeiro (início em Julho)" msgid "Financial year (Start April)" -msgstr "Ano Financeiro - Abril" +msgstr "Ano financeiro (início em Abril)" msgid "Today" msgstr "Hoje" @@ -702,13 +748,13 @@ msgid "Last 30 days" msgstr "Últimos 30 dias" msgid "Last 60 days" -msgstr "" +msgstr "Últimos 60 dias" msgid "Last 90 days" -msgstr "" +msgstr "Últimos 90 dias" msgid "Last 180 days" -msgstr "" +msgstr "Últimos 180 dias" msgid "This week" msgstr "Esta semana" @@ -717,10 +763,10 @@ msgid "Last week" msgstr "Última semana" msgid "Last 4 weeks" -msgstr "Últimas quatro semanas" +msgstr "Últimas 4 semanas" msgid "Last 12 weeks" -msgstr "Últimas doze semanas" +msgstr "Últimas 12 semanas" msgid "Last 52 weeks" msgstr "Últimas 52 semanas" @@ -729,13 +775,13 @@ msgid "Weeks this year" msgstr "Semanas deste ano " msgid "This bi-week" -msgstr "Nesta bisemanal" +msgstr "Esta quinzena" msgid "Last bi-week" -msgstr "Ultimo bimensal " +msgstr "Última quinzena" msgid "Last 4 bi-weeks" -msgstr "Nas últimas 4 semanas" +msgstr "Últimas 4 semanas" msgid "This month" msgstr "Este mês" @@ -744,28 +790,28 @@ msgid "Last month" msgstr "Último mês" msgid "Last 3 months" -msgstr "Últimos três meses" +msgstr "Últimos 3 meses" msgid "Last 6 months" -msgstr "Últimos seis meses" +msgstr "Últimos 6 meses" msgid "Last 12 months" -msgstr "Últimos doze meses" +msgstr "Últimos 12 meses" msgid "Months this year" msgstr "Meses deste ano" msgid "This bi-month" -msgstr "Este bi-mês" +msgstr "Este bimestre" msgid "Last bi-month" msgstr "Último bimestre" msgid "Last 6 bi-months" -msgstr "Últimos seis bi-meses" +msgstr "Últimos 6 bimestres" msgid "Bi-months this year" -msgstr "Bimensais este ano" +msgstr "Bimestres deste ano" msgid "This quarter" msgstr "Este Trimestre" @@ -774,7 +820,7 @@ msgid "Last quarter" msgstr "Último trimestre" msgid "Last 4 quarters" -msgstr "Últimos quatro trimestres" +msgstr "Últimos 4 trimestres" msgid "Quarters this year" msgstr "Trimestres deste ano" @@ -786,7 +832,7 @@ msgid "Last six-month" msgstr "Último semestre" msgid "Last 2 six-month" -msgstr "" +msgstr " Últimos 2 semestres" msgid "This financial year" msgstr "Ano financeiro" @@ -795,7 +841,7 @@ msgid "Last financial year" msgstr "Último ano fiscal" msgid "Last 5 financial years" -msgstr "Últimos cinco anos fiscais" +msgstr "Últimos 5 anos fiscais" msgid "This year" msgstr "Este ano" @@ -804,7 +850,7 @@ msgid "Last year" msgstr "Último ano" msgid "Last 5 years" -msgstr "Últimos cinco anos" +msgstr "Últimos 5 anos" msgid "Last 10 years" msgstr "Últimos 10 anos" @@ -816,13 +862,13 @@ msgid "Weeks" msgstr "Semanas" msgid "Bi-weeks" -msgstr "Bisemanal" +msgstr "Quinzena" msgid "Months" msgstr "Meses" msgid "Bi-months" -msgstr "Bi-mensal" +msgstr "Bimestre" msgid "Quarters" msgstr "Trimestres" @@ -836,35 +882,74 @@ msgstr "Ano financeiro " msgid "Years" msgstr "Anos" +msgid "Value: {{value}}" +msgstr "Valor: {{value}}" + +msgid "Bold text" +msgstr "Texto em negrito" + +msgid "Italic text" +msgstr "Texto em itálico" + +msgid "Link to a URL" +msgstr "Ligação a um URL" + +msgid "Mention a user" +msgstr "Mencionar um utilizador" + +msgid "Add emoji" +msgstr "Adicionar emoji" + +msgid "Preview" +msgstr "Pré-visualização" + +msgid "Back to write mode" +msgstr "Voltar ao modo de escrita" + +msgid "Interpretations and details" +msgstr "Interpretações e pormenores" + msgid "Translating to" -msgstr "" +msgstr "Traduzir para" msgid "Choose a locale" -msgstr "" +msgstr "Escolher um local" msgid "Base locale reference" -msgstr "" +msgstr "Referência à localidade de base" msgid "Choose a locale to translate from the menu above" -msgstr "" +msgstr "Escolha uma localidade para traduzir no menu acima" msgid "Translate: {{objectName}}" -msgstr "" +msgstr "Traduzir: {{objectName}}" msgid "Save translations" -msgstr "" +msgstr "Gravar traduções" msgid "Cannot save while offline" -msgstr "" +msgstr "Não é possível gravar quando se está offline" msgid "Could not load translations" -msgstr "" +msgstr "Não foi possível carregar traduções" msgid "Retry" -msgstr "" +msgstr "Repetir" + +msgid "Too many results. Try refining the search." +msgstr "Demasiados resultados. Tente refinar a pesquisa." + +msgid "Search for a user" +msgstr "Procurar um utilizador" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "Procurar por \"{{- searchText}}\"" + +msgid "No results found" +msgstr "Nenhum resultado encontrado" msgid "Series" -msgstr "Série" +msgstr "Séries" msgid "Category" msgstr "Categoria" @@ -879,7 +964,7 @@ msgid "Rows" msgstr "Linhas" msgid "Points" -msgstr "" +msgstr "Pontos" msgid "Reporting rate" msgstr "Taxa de relatórios" @@ -888,10 +973,10 @@ msgid "Reporting rate on time" msgstr "Taxa de relatórios no prazo" msgid "Actual reports" -msgstr "Relatórios reais" +msgstr "Relatórios actuais" msgid "Actual reports on time" -msgstr "Relatórios reais dentro do prazo" +msgstr "Relatórios actuais dentro do prazo" msgid "Expected reports" msgstr "Relatórios esperados" @@ -900,7 +985,7 @@ msgid "Program" msgstr "Programa" msgid "Select a program" -msgstr "Selecione um programa" +msgstr "Seleccione um programa" msgid "Indicators" msgstr "Indicadores" @@ -909,19 +994,16 @@ msgid "Indicator group" msgstr "Grupo de Indicador" msgid "All groups" -msgstr "" +msgstr "Todos os grupos" msgid "Indicator" msgstr "Indicador" msgid "No indicator groups found" -msgstr "" +msgstr "Não foram encontrados grupos de indicadores" msgid "Loading indicator groups" -msgstr "" - -msgid "Data elements" -msgstr "Elementos de Dados" +msgstr "Carregando grupos de indicadores" msgid "Data element group" msgstr "Grupo de Elemento de Dados" @@ -930,19 +1012,19 @@ msgid "Data element" msgstr "Elemento de dado" msgid "No data element groups found" -msgstr "" +msgstr "Não foram encontrados grupos de elementos de dados" msgid "Loading data element groups" -msgstr "" +msgstr "Carregando de grupos de elementos de dados" msgid "Data sets" msgstr "Agregação de Dados" msgid "Data set" -msgstr "Ficha" +msgstr "Conjuntos de dados" msgid "All data sets" -msgstr "" +msgstr "Todos conjuntos de dados" msgid "Loading data sets" msgstr "Carregando conjuntos de dados" @@ -951,16 +1033,16 @@ msgid "Event data items" msgstr "Itens de dados do evento" msgid "All programs" -msgstr "" +msgstr "Todos os programas" msgid "Event data item" msgstr "Item de dados do evento" msgid "No programs found" -msgstr "" +msgstr "Nenhum programa encontrado" msgid "Loading programs" -msgstr "" +msgstr "Carregando programas" msgid "Program indicators" msgstr "Indicador do programa" @@ -968,6 +1050,35 @@ msgstr "Indicador do programa" msgid "Program indicator" msgstr "Gestão do indicadores de programa" +msgid "Calculations" +msgstr "Cálculos" + +msgid "Number" +msgstr "Número" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" +"A fórmula está vazia. Adicione itens à fórmula a partir das listas à " +"esquerda." + +msgid "Consecutive math operators" +msgstr "Operadores matemáticos consecutivos" + +msgid "Consecutive data elements" +msgstr "Elementos de dados consecutivos" + +msgid "Starts or ends with a math operator" +msgstr "Começa ou termina com um operador matemático" + +msgid "Empty parentheses" +msgstr "Parênteses vazios" + +msgid "Missing right parenthesis )" +msgstr "Parênteses direito em falta )" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" @@ -1008,19 +1119,19 @@ msgid "Bottom" msgstr "Inferior" msgid "{{dynamicOuNames}} and {{lastOuName}}" -msgstr "{{nomesdinâmicosOu}} e {{últimoNomeOu}}" +msgstr "{{dynamicOuNames}} e {{lastOuName}}" msgid "{{allDynamicOuNames}} levels" -msgstr "{{tudoDynamicOuNomes}} níveis" +msgstr "{{allDynamicOuNames}} níveis" msgid "{{allDynamicOuNames}} groups" -msgstr "{{tudoDynamicOuNomes}} grupos" +msgstr "{{allDynamicOuNames}} grupos" msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" -msgstr "{{tudoDynamicOuNomes}} níveis em {{NomesestáticosOu}}" +msgstr "{{allDynamicOuNames}} níveis em {{staticOuNames}}" msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" -msgstr "{{tudoDynamicOuNomes}} grupos em {{NomesestáticosOu}}" +msgstr "{{allDynamicOuNames}} grupos em {{staticOuNames}}" msgid "{{percentage}}% of total x values" msgstr "" @@ -1046,6 +1157,9 @@ msgstr "" msgid "{{thresholdFactor}} × Z-score high" msgstr "" +msgid "Not applicable" +msgstr "" + msgid "Data" msgstr "Dados" @@ -1103,6 +1217,9 @@ msgstr "" msgid "Single value" msgstr "Valor unico" +msgid "Outlier table" +msgstr "" + msgid "All charts" msgstr "" @@ -1128,7 +1245,7 @@ msgid "Base" msgstr "Base" msgid "Axis {{axisId}}" -msgstr "Eixo {{eixoId}}" +msgstr "Eixo {{axisId}}" msgid "{{count}} items" msgid_plural "{{count}} items" diff --git a/i18n/pt_BR.po b/i18n/pt_BR.po index 63c02c3d3..f61f34035 100644 --- a/i18n/pt_BR.po +++ b/i18n/pt_BR.po @@ -1,15 +1,16 @@ # # Translators: # Viktor Varland , 2021 -# phil_dhis2, 2022 +# Philip Larsen Donnelly, 2023 +# Thiago Rocha, 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-09-27T14:15:13.876Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: phil_dhis2, 2022\n" -"Language-Team: Portuguese (Brazil) (https://www.transifex.com/hisp-uio/teams/100509/pt_BR/)\n" +"Last-Translator: Thiago Rocha, 2024\n" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/hisp-uio/teams/100509/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -80,29 +81,90 @@ msgid "This app could not retrieve required data." msgstr "" msgid "Network error" +msgstr "Erro de rede" + +msgid "Data / Edit calculation" msgstr "" -msgid "Data Type" +msgid "Data / New calculation" msgstr "" -msgid "All types" +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" msgstr "" +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "Sim, excluir" + msgid "Totals only" msgstr "" msgid "Details only" msgstr "" -msgid "Disaggregation" +msgid "Loading" +msgstr "Carregando.." + +msgid "Data elements" +msgstr "Os elementos de dados" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" msgstr "" +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + +msgid "Disaggregation" +msgstr "Desagregação" + msgid "No data" msgstr "Não ha dados" -msgid "Loading" -msgstr "Carregando.." - msgid "Search by data item name" msgstr "" @@ -115,9 +177,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -130,9 +189,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -145,6 +201,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -211,9 +270,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Cancelar" - msgid "Delete" msgstr "Apagar" @@ -265,6 +321,9 @@ msgstr "Descrição" msgid "Rename" msgstr "Renomear" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -289,6 +348,9 @@ msgstr "" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Falha na exclusão" + msgid "Could not update comment" msgstr "" @@ -315,20 +377,33 @@ msgstr "" msgid "Write an interpretation" msgstr "" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "Interpretações" -msgid "Unlike" +msgid "Reply" +msgstr "Responder" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "View replies" msgstr "" -msgid "Like" +msgid "Unlike" msgstr "" -msgid "Reply" -msgstr "Responder" +msgid "Like" +msgstr "como" msgid "Share" msgstr "Partilhar" @@ -361,7 +436,7 @@ msgid "Add emoji" msgstr "" msgid "Preview" -msgstr "" +msgstr "Pré-visualização" msgid "Back to write mode" msgstr "" @@ -376,10 +451,13 @@ msgid "Searching for \"{{- searchText}}\"" msgstr "" msgid "No results found" +msgstr "Nenhum resultado encontrado" + +msgid "Not available offline" msgstr "" msgid "Created by" -msgstr "" +msgstr "Criado por" msgid "Anyone" msgstr "" @@ -397,7 +475,7 @@ msgid "Filter by name" msgstr "Filtrar por nome" msgid "Created" -msgstr "" +msgstr "Criado" msgid "Last updated" msgstr "Última actualização" @@ -406,13 +484,13 @@ msgid "Type" msgstr "Tipo" msgid "Clear filters" -msgstr "" +msgstr "Limpar filtros" msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" msgstr "" msgid "Open" -msgstr "" +msgstr "Abrir" msgid "Couldn't load items" msgstr "" @@ -554,7 +632,7 @@ msgid "Select a group" msgstr "" msgid "Deselect all" -msgstr "" +msgstr "Desmarcar todos" msgid "Period type" msgstr "Tipo de período" @@ -580,48 +658,6 @@ msgstr "" msgid "No periods selected" msgstr "Não há períodos relativos seleccionados" -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "Diário" @@ -800,7 +836,7 @@ msgid "Last 10 years" msgstr "" msgid "Days" -msgstr "" +msgstr "Dias" msgid "Weeks" msgstr "" @@ -826,6 +862,9 @@ msgstr "" msgid "Years" msgstr "Anos" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -844,6 +883,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -907,9 +949,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Os elementos de dados" - msgid "Data element group" msgstr "Grupo de elemento de dado" @@ -955,6 +994,33 @@ msgstr "" msgid "Program indicator" msgstr "" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Número" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/ru.po b/i18n/ru.po index e44255a90..7bc8a734d 100644 --- a/i18n/ru.po +++ b/i18n/ru.po @@ -1,19 +1,19 @@ # # Translators: -# Yury Rogachev , 2020 # Valeriu Plesca , 2021 # Wanda , 2022 # Viktor Varland , 2022 # Ulanbek Abakirov , 2022 -# phil_dhis2, 2022 +# Philip Larsen Donnelly, 2023 +# Yury Rogachev , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2024-01-25T12:05:03.360Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: phil_dhis2, 2022\n" -"Language-Team: Russian (https://www.transifex.com/hisp-uio/teams/100509/ru/)\n" +"Last-Translator: Yury Rogachev , 2024\n" +"Language-Team: Russian (https://app.transifex.com/hisp-uio/teams/100509/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -87,11 +87,46 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" -msgstr "Тип данных" +msgid "Data / Edit calculation" +msgstr "" -msgid "All types" -msgstr "Все типы" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Отмена" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" msgid "Totals only" msgstr "" @@ -99,15 +134,44 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "Загрузка" + +msgid "Data elements" +msgstr "Элементы данных" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "Тип данных" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "" + +msgid "All types" +msgstr "Все типы" + msgid "Disaggregation" msgstr "Разукрупнение" msgid "No data" msgstr "Нет данных" -msgid "Loading" -msgstr "Загрузка" - msgid "Search by data item name" msgstr "" @@ -120,9 +184,6 @@ msgstr "Выбранные элементы" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -132,10 +193,10 @@ msgstr "" msgid "No program indicators found" msgstr "" -msgid "No indicators found for \"{{- searchTerm}}\"" +msgid "No calculations found" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" +msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" msgid "No data sets found for \"{{- searchTerm}}\"" @@ -147,9 +208,15 @@ msgstr "" msgid "No program indicators found for \"{{- searchTerm}}\"" msgstr "" +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "" + msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -216,9 +283,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Отмена" - msgid "Delete" msgstr "Удалить" @@ -270,6 +334,9 @@ msgstr "Описание" msgid "Rename" msgstr "Переименовать" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -283,7 +350,7 @@ msgid "map" msgstr "Карта" msgid "visualization" -msgstr "" +msgstr "визуализация" msgid "Edit" msgstr "Редактировать" @@ -294,6 +361,9 @@ msgstr "Написать ответ" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Не удалось удалить" + msgid "Could not update comment" msgstr "" @@ -320,27 +390,44 @@ msgstr "" msgid "Write an interpretation" msgstr "Написать перевод" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "Interpretations" +msgid "Reply" +msgstr "Ответить" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} ответ" +msgstr[1] "{{count}} отвечает" +msgstr[2] "{{count}} отвечает" +msgstr[3] "{{count}} ответов" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "Не нравится" msgid "Like" msgstr "Нравится" -msgid "Reply" -msgstr "Ответить" +msgid "See interpretation" +msgstr "" + +msgid "Open in app" +msgstr "" msgid "Share" msgstr "Поделиться" -msgid "See interpretation" -msgstr "" - msgid "Manage sharing" msgstr "Управление совместным доступом" @@ -350,38 +437,8 @@ msgstr "" msgid "Enter interpretation text" msgstr "" -msgid "Bold text" -msgstr "" - -msgid "Italic text" -msgstr "" - -msgid "Link to a URL" -msgstr "" - -msgid "Mention a user" -msgstr "" - -msgid "Add emoji" -msgstr "" - -msgid "Preview" -msgstr "Предварительный просмотр" - -msgid "Back to write mode" -msgstr "" - -msgid "Too many results. Try refining the search." -msgstr "" - -msgid "Search for a user" -msgstr "" - -msgid "Searching for \"{{- searchText}}\"" -msgstr "" - -msgid "No results found" -msgstr "Результаты не найдены" +msgid "Not available offline" +msgstr "Недоступно в автономном режиме" msgid "Created by" msgstr "Создано" @@ -576,60 +633,18 @@ msgstr "Выбрать год" msgid "Period" msgstr "Период" +msgid "Selected Periods" +msgstr "Выбранные периоды" + msgid "Relative periods" msgstr "Соответствующие периоды" msgid "Fixed periods" msgstr "Фиксированные периоды" -msgid "Selected Periods" -msgstr "Выбранные периоды" - msgid "No periods selected" msgstr "Периоды не выбраны" -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "Week {{weekNumber}}" -msgstr "Неделя{{номерНедели}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "Двухнедельный {{biWeekNumber}}" - msgid "Daily" msgstr "Ежедневно" @@ -834,6 +849,30 @@ msgstr "Финансовые годы" msgid "Years" msgstr "Годы" +msgid "Bold text" +msgstr "" + +msgid "Italic text" +msgstr "" + +msgid "Link to a URL" +msgstr "" + +msgid "Mention a user" +msgstr "" + +msgid "Add emoji" +msgstr "" + +msgid "Preview" +msgstr "Предварительный просмотр" + +msgid "Back to write mode" +msgstr "" + +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -852,12 +891,27 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" msgid "Retry" msgstr "" +msgid "Too many results. Try refining the search." +msgstr "" + +msgid "Search for a user" +msgstr "" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "" + +msgid "No results found" +msgstr "Результаты не найдены" + msgid "Series" msgstr "Ряды" @@ -915,9 +969,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Элементы данных" - msgid "Data element group" msgstr "Группы элемента данных" @@ -963,6 +1014,33 @@ msgstr "Индикаторы программы" msgid "Program indicator" msgstr "Program indicator" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Число" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "Очень маленький" @@ -1093,11 +1171,14 @@ msgid "Radar" msgstr "Радиальная" msgid "Scatter" -msgstr "" +msgstr "Рассеивание" msgid "Single value" msgstr "Одиночное значение" +msgid "Outlier table" +msgstr "" + msgid "All charts" msgstr "" diff --git a/i18n/si.po b/i18n/si.po new file mode 100644 index 000000000..ef5f5e2c3 --- /dev/null +++ b/i18n/si.po @@ -0,0 +1,1167 @@ +# +# Translators: +# Malinda Wijeratne, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: i18next-conv\n" +"POT-Creation-Date: 2023-04-18T08:41:27.838Z\n" +"PO-Revision-Date: 2020-04-28 22:05+0000\n" +"Last-Translator: Malinda Wijeratne, 2023\n" +"Language-Team: Sinhala (https://app.transifex.com/hisp-uio/teams/100509/si/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: si\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "view only" +msgstr "නැරඹීම පමණයි" + +msgid "view and edit" +msgstr "නැරඹීම සහ සංස්කරණය" + +msgid "all users ({{accessLevel}})" +msgstr "" + +msgid "{{userOrGroup}} ({{accessLevel}})" +msgstr "" + +msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" +msgstr "" + +msgid "Not shared with any users or groups" +msgstr "" + +msgid "No description" +msgstr "විස්තරයක් නැත" + +msgid "Last updated {{time}}" +msgstr "" + +msgid "Created {{time}} by {{author}}" +msgstr "" + +msgid "Created {{time}}" +msgstr "" + +msgid "Viewed {{count}} times" +msgid_plural "Viewed {{count}} times" +msgstr[0] "" +msgstr[1] "" + +msgid "Notifications" +msgstr "" + +msgid "You're subscribed and getting updates about new interpretations." +msgstr "" + +msgid "Unsubscribe" +msgstr "" + +msgid "Subscribe to get updates about new interpretations." +msgstr "" + +msgid "Subscribe" +msgstr "" + +msgid "About this map" +msgstr "" + +msgid "About this line list" +msgstr "" + +msgid "About this visualization" +msgstr "" + +msgid "This app could not retrieve required data." +msgstr "" + +msgid "Network error" +msgstr "" + +msgid "Data / Edit calculation" +msgstr "" + +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "ඔව්, මකන්න" + +msgid "Totals only" +msgstr "" + +msgid "Details only" +msgstr "" + +msgid "Loading" +msgstr "" + +msgid "Data elements" +msgstr "" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + +msgid "Disaggregation" +msgstr "" + +msgid "No data" +msgstr "" + +msgid "Search by data item name" +msgstr "" + +msgid "No items selected" +msgstr "" + +msgid "Selected Items" +msgstr "" + +msgid "No indicators found" +msgstr "" + +msgid "No data sets found" +msgstr "" + +msgid "No event data items found" +msgstr "" + +msgid "No program indicators found" +msgstr "" + +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data sets found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No event data items found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No program indicators found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "Nothing found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "Calculation" +msgstr "" + +msgid "Metric type" +msgstr "" + +msgid "All metrics" +msgstr "" + +msgid "Move to {{axisName}}" +msgstr "" + +msgid "Add to {{axisName}}" +msgstr "" + +msgid "Not available for {{visualizationType}}" +msgstr "" + +msgid "Remove Assigned Categories" +msgstr "" + +msgid "Add Assigned Categories" +msgstr "" + +msgid "Remove" +msgstr "ඉවත් කරන්න" + +msgid "Filter dimensions" +msgstr "" + +msgid "Main dimensions" +msgstr "" + +msgid "Your dimensions" +msgstr "" + +msgid "Dimension recommended with selected data" +msgstr "" + +msgid "All items" +msgstr "" + +msgid "Automatically include all items" +msgstr "" + +msgid "" +"Select all {{- dimensionTitle}} items. With this option, new items added in " +"the future will be automatically included." +msgstr "" + +msgid "Manually select items..." +msgstr "" + +msgid "Nothing found in {{- dimensionTitle}}" +msgstr "" + +msgid "Search" +msgstr "සොයන්න" + +msgid "Nothing found for {{- searchTerm}}" +msgstr "" + +msgid "Delete {{fileType}}" +msgstr "" + +msgid "" +"This {{fileType}} and related interpretations will be deleted. Continue?" +msgstr "" + +msgid "Delete" +msgstr "ඉවත් කරන්න" + +msgid "File" +msgstr "ගොනුව" + +msgid "New" +msgstr "නව" + +msgid "Open…" +msgstr "" + +msgid "Save" +msgstr "සුරකින්න" + +msgid "Save…" +msgstr "" + +msgid "Save as…" +msgstr "" + +msgid "Rename…" +msgstr "" + +msgid "Translate…" +msgstr "" + +msgid "Share…" +msgstr "" + +msgid "Get link…" +msgstr "" + +msgid "Open in this app" +msgstr "" + +msgid "Close" +msgstr "වසන්න" + +msgid "Rename {{fileType}}" +msgstr "" + +msgid "Name" +msgstr "නම" + +msgid "Description" +msgstr "විස්තරය" + +msgid "Rename" +msgstr "" + +msgid "{{- objectName}} (copy)" +msgstr "" + +msgid "Save {{fileType}} as" +msgstr "" + +msgid "event report" +msgstr "" + +msgid "line list" +msgstr "" + +msgid "map" +msgstr "" + +msgid "visualization" +msgstr "" + +msgid "Edit" +msgstr "වෙනස් කරන්න" + +msgid "Write a reply" +msgstr "" + +msgid "Post reply" +msgstr "" + +msgid "Could not update comment" +msgstr "" + +msgid "Enter comment text" +msgstr "" + +msgid "Update" +msgstr "" + +msgid "Viewing interpretation: {{- visualisationName}}" +msgstr "" + +msgid "Could not load interpretation" +msgstr "" + +msgid "" +"The interpretation couldn’t be displayed. Try again or contact your system " +"administrator." +msgstr "" + +msgid "Hide interpretation" +msgstr "" + +msgid "Write an interpretation" +msgstr "" + +msgid "Post interpretation" +msgstr "" + +msgid "Interpretations" +msgstr "" + +msgid "Unlike" +msgstr "" + +msgid "Like" +msgstr "" + +msgid "Reply" +msgstr "" + +msgid "Share" +msgstr "" + +msgid "See interpretation" +msgstr "" + +msgid "Manage sharing" +msgstr "" + +msgid "Could not update interpretation" +msgstr "" + +msgid "Enter interpretation text" +msgstr "" + +msgid "Bold text" +msgstr "" + +msgid "Italic text" +msgstr "" + +msgid "Link to a URL" +msgstr "" + +msgid "Mention a user" +msgstr "" + +msgid "Add emoji" +msgstr "" + +msgid "Preview" +msgstr "" + +msgid "Back to write mode" +msgstr "" + +msgid "Too many results. Try refining the search." +msgstr "" + +msgid "Search for a user" +msgstr "" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "" + +msgid "No results found" +msgstr "" + +msgid "Not available offline" +msgstr "මාර්ග අපගතව නොතිබේ" + +msgid "Created by" +msgstr "" + +msgid "Anyone" +msgstr "ඕනෑම කෙනෙක්" + +msgid "Only you" +msgstr "" + +msgid "Others" +msgstr "" + +msgid "Not supported by this app yet" +msgstr "" + +msgid "Filter by name" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Clear filters" +msgstr "" + +msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" +msgstr "" + +msgid "Open" +msgstr "විවෘත කරන්න" + +msgid "Couldn't load items" +msgstr "" + +msgid "" +"There was a problem loading items. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No items found. Create a new to get started." +msgstr "" + +msgid "" +"No items found. Try adjusting your search or filter options to find what " +"you're looking for." +msgstr "" + +msgid "Create new" +msgstr "" + +msgid "Open a visualization" +msgstr "" + +msgid "Loading visualizations" +msgstr "" + +msgid "Couldn't load visualizations" +msgstr "" + +msgid "" +"There was a problem loading visualizations. Try again or contact your system" +" administrator." +msgstr "" + +msgid "No visualizations found. Click New visualization to get started." +msgstr "" + +msgid "" +"No visualizations found. Try adjusting your search or filter options to find" +" what you're looking for." +msgstr "" + +msgid "New visualization" +msgstr "" + +msgid "Open a map" +msgstr "" + +msgid "Loading maps" +msgstr "" + +msgid "Couldn't load maps" +msgstr "" + +msgid "" +"There was a problem loading maps. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No maps found. Click New map to get started." +msgstr "" + +msgid "" +"No maps found. Try adjusting your search or filter options to find what " +"you're looking for." +msgstr "" + +msgid "New map" +msgstr "" + +msgid "Open a line list" +msgstr "" + +msgid "Loading line lists" +msgstr "" + +msgid "Couldn't load line lists" +msgstr "" + +msgid "" +"There was a problem loading line lists. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No line lists found. Click New line list to get started." +msgstr "" + +msgid "" +"No line lists found. Try adjusting your search or filter options to find " +"what you're looking for." +msgstr "" + +msgid "New line list" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Hide" +msgstr "" + +msgid "{{count}} org units" +msgid_plural "{{count}} org units" +msgstr[0] "" +msgstr[1] "" + +msgid "{{count}} levels" +msgid_plural "{{count}} levels" +msgstr[0] "" +msgstr[1] "" + +msgid "{{count}} groups" +msgid_plural "{{count}} groups" +msgstr[0] "" +msgstr[1] "" + +msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" +msgstr "" + +msgid "Nothing selected" +msgstr "" + +msgid "User organisation unit" +msgstr "" + +msgid "User sub-units" +msgstr "" + +msgid "User sub-x2-units" +msgstr "" + +msgid "Select a level" +msgstr "" + +msgid "Select a group" +msgstr "" + +msgid "Deselect all" +msgstr "" + +msgid "Period type" +msgstr "" + +msgid "Year" +msgstr "වසර" + +msgid "Select year" +msgstr "වසර තෝරන්න" + +msgid "Period" +msgstr "" + +msgid "Relative periods" +msgstr "" + +msgid "Fixed periods" +msgstr "" + +msgid "Selected Periods" +msgstr "" + +msgid "No periods selected" +msgstr "" + +msgid "Daily" +msgstr "දිනපතා" + +msgid "Weekly" +msgstr "සතිපතා" + +msgid "Weekly (Start Wednesday)" +msgstr "සතියකට වරක් (Start Wednesday)" + +msgid "Weekly (Start Thursday)" +msgstr "සතියකට වරක් (Start Thursday)" + +msgid "Weekly (Start Saturday)" +msgstr "සතියකට වරක් (Start Saturday)" + +msgid "Weekly (Start Sunday)" +msgstr "සතියකට වරක් (Start Sunday)" + +msgid "Bi-weekly" +msgstr "දෙසතියකට වරක්" + +msgid "Monthly" +msgstr "මාස්පතා" + +msgid "Bi-monthly" +msgstr "දෙමසකට වරක්" + +msgid "Quarterly" +msgstr "කාර්තු පතා" + +msgid "Six-monthly" +msgstr "6 මසකට වරක්" + +msgid "Six-monthly April" +msgstr "6 මසකට වරක් අප්‍රේල්" + +msgid "Yearly" +msgstr "අවුරුදු පතා" + +msgid "Financial year (Start November)" +msgstr "" + +msgid "Financial year (Start October)" +msgstr "" + +msgid "Financial year (Start July)" +msgstr "" + +msgid "Financial year (Start April)" +msgstr "" + +msgid "Today" +msgstr "අද" + +msgid "Yesterday" +msgstr "ඊයේ" + +msgid "Last 3 days" +msgstr "පසුගිය දින 3" + +msgid "Last 7 days" +msgstr "පසුගිය දින 7" + +msgid "Last 14 days" +msgstr "පසුගිය දින 14" + +msgid "Last 30 days" +msgstr "" + +msgid "Last 60 days" +msgstr "" + +msgid "Last 90 days" +msgstr "" + +msgid "Last 180 days" +msgstr "" + +msgid "This week" +msgstr "මෙම සතිය" + +msgid "Last week" +msgstr "පසුගිය සතිය" + +msgid "Last 4 weeks" +msgstr "පසුගිය සති 4" + +msgid "Last 12 weeks" +msgstr "පසුගිය සති 12" + +msgid "Last 52 weeks" +msgstr "පසුගිය සති 52" + +msgid "Weeks this year" +msgstr "" + +msgid "This bi-week" +msgstr "" + +msgid "Last bi-week" +msgstr "" + +msgid "Last 4 bi-weeks" +msgstr "" + +msgid "This month" +msgstr "මෙම මාසය" + +msgid "Last month" +msgstr "පසුගිය මාසය" + +msgid "Last 3 months" +msgstr "පසුගිය මාස 3" + +msgid "Last 6 months" +msgstr "පසුගිය මාස 6" + +msgid "Last 12 months" +msgstr "පසුගිය මාස 12" + +msgid "Months this year" +msgstr "" + +msgid "This bi-month" +msgstr "" + +msgid "Last bi-month" +msgstr "" + +msgid "Last 6 bi-months" +msgstr "" + +msgid "Bi-months this year" +msgstr "" + +msgid "This quarter" +msgstr "" + +msgid "Last quarter" +msgstr "" + +msgid "Last 4 quarters" +msgstr "" + +msgid "Quarters this year" +msgstr "" + +msgid "This six-month" +msgstr "" + +msgid "Last six-month" +msgstr "" + +msgid "Last 2 six-month" +msgstr "" + +msgid "This financial year" +msgstr "" + +msgid "Last financial year" +msgstr "" + +msgid "Last 5 financial years" +msgstr "" + +msgid "This year" +msgstr "මෙම වසර" + +msgid "Last year" +msgstr "පසුගිය වසර" + +msgid "Last 5 years" +msgstr "පසුගිය 5 වසර" + +msgid "Last 10 years" +msgstr "පසුගිය 10 වසර" + +msgid "Days" +msgstr "දින" + +msgid "Weeks" +msgstr "සති" + +msgid "Bi-weeks" +msgstr "" + +msgid "Months" +msgstr "මාස" + +msgid "Bi-months" +msgstr "" + +msgid "Quarters" +msgstr "කාර්තු" + +msgid "Six-months" +msgstr "" + +msgid "Financial Years" +msgstr "" + +msgid "Years" +msgstr "අවුරුදු" + +msgid "Translating to" +msgstr "" + +msgid "Choose a locale" +msgstr "" + +msgid "Base locale reference" +msgstr "" + +msgid "Choose a locale to translate from the menu above" +msgstr "" + +msgid "Translate: {{objectName}}" +msgstr "" + +msgid "Save translations" +msgstr "" + +msgid "Cannot save while offline" +msgstr "" + +msgid "Could not load translations" +msgstr "" + +msgid "Retry" +msgstr "නැවත උත්සාහ කරන්න" + +msgid "Series" +msgstr "" + +msgid "Category" +msgstr "කාණ්ඩය" + +msgid "Filter" +msgstr "" + +msgid "Columns" +msgstr "" + +msgid "Rows" +msgstr "" + +msgid "Points" +msgstr "" + +msgid "Reporting rate" +msgstr "" + +msgid "Reporting rate on time" +msgstr "" + +msgid "Actual reports" +msgstr "" + +msgid "Actual reports on time" +msgstr "" + +msgid "Expected reports" +msgstr "" + +msgid "Program" +msgstr "" + +msgid "Select a program" +msgstr "" + +msgid "Indicators" +msgstr "" + +msgid "Indicator group" +msgstr "" + +msgid "All groups" +msgstr "" + +msgid "Indicator" +msgstr "" + +msgid "No indicator groups found" +msgstr "" + +msgid "Loading indicator groups" +msgstr "" + +msgid "Data element group" +msgstr "" + +msgid "Data element" +msgstr "" + +msgid "No data element groups found" +msgstr "" + +msgid "Loading data element groups" +msgstr "" + +msgid "Data sets" +msgstr "" + +msgid "Data set" +msgstr "" + +msgid "All data sets" +msgstr "" + +msgid "Loading data sets" +msgstr "" + +msgid "Event data items" +msgstr "" + +msgid "All programs" +msgstr "" + +msgid "Event data item" +msgstr "" + +msgid "No programs found" +msgstr "" + +msgid "Loading programs" +msgstr "" + +msgid "Program indicators" +msgstr "" + +msgid "Program indicator" +msgstr "" + +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + +msgid "Extra Small" +msgstr "ඉතා කුඩා" + +msgid "Small" +msgstr "කුඩා" + +msgid "Regular" +msgstr "මධ්‍යස්ථ" + +msgid "Large" +msgstr "ලොකු" + +msgid "Extra Large" +msgstr "" + +msgid "Left" +msgstr "" + +msgid "Center" +msgstr "" + +msgid "Right" +msgstr "" + +msgid "Start" +msgstr "" + +msgid "Middle" +msgstr "" + +msgid "End" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "{{dynamicOuNames}} and {{lastOuName}}" +msgstr "" + +msgid "{{allDynamicOuNames}} levels" +msgstr "" + +msgid "{{allDynamicOuNames}} groups" +msgstr "" + +msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" +msgstr "" + +msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" +msgstr "" + +msgid "{{percentage}}% of total x values" +msgstr "" + +msgid "{{percentage}}% of total y values" +msgstr "" + +msgid "{{thresholdFactor}} × IQR Q1" +msgstr "" + +msgid "{{thresholdFactor}} × IQR Q3" +msgstr "" + +msgid "{{thresholdFactor}} × Modified Z-score low" +msgstr "" + +msgid "{{thresholdFactor}} × Modified Z-score high" +msgstr "" + +msgid "{{thresholdFactor}} × Z-score low" +msgstr "" + +msgid "{{thresholdFactor}} × Z-score high" +msgstr "" + +msgid "Data" +msgstr "දත්ත" + +msgid "Organisation unit" +msgstr "" + +msgid "Assigned Categories" +msgstr "" + +msgid "Pivot table" +msgstr "" + +msgid "Area" +msgstr "" + +msgid "Stacked area" +msgstr "" + +msgid "Bar" +msgstr "" + +msgid "Stacked bar" +msgstr "" + +msgid "Column" +msgstr "" + +msgid "Year over year (column)" +msgstr "" + +msgid "Stacked column" +msgstr "" + +msgid "Gauge" +msgstr "" + +msgid "Line" +msgstr "" + +msgid "Line list" +msgstr "" + +msgid "Year over year (line)" +msgstr "" + +msgid "Pie" +msgstr "" + +msgid "Radar" +msgstr "" + +msgid "Scatter" +msgstr "" + +msgid "Single value" +msgstr "" + +msgid "All charts" +msgstr "" + +msgid "{{seriesName}} (trend)" +msgstr "" + +msgid "Trend" +msgstr "" + +msgid "No legend for this series" +msgstr "" + +msgid "and {{amount}} more..." +msgstr "" + +msgid "Linear Regression" +msgstr "" + +msgid "Target" +msgstr "ඉලක්කය" + +msgid "Base" +msgstr "" + +msgid "Axis {{axisId}}" +msgstr "" + +msgid "{{count}} items" +msgid_plural "{{count}} items" +msgstr[0] "" +msgstr[1] "" + +msgid "Reset zoom" +msgstr "" diff --git a/i18n/sv.po b/i18n/sv.po index 82271983c..9bdb02c5d 100644 --- a/i18n/sv.po +++ b/i18n/sv.po @@ -1,15 +1,17 @@ # # Translators: -# phil_dhis2, 2022 # Viktor Varland , 2022 +# Philip Larsen Donnelly, 2023 +# Jason Pickering , 2024 +# Martin , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2024-01-25T12:05:03.360Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Viktor Varland , 2022\n" -"Language-Team: Swedish (https://www.transifex.com/hisp-uio/teams/100509/sv/)\n" +"Last-Translator: Martin , 2024\n" +"Language-Team: Swedish (https://app.transifex.com/hisp-uio/teams/100509/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -81,10 +83,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Avbryt" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -93,13 +130,42 @@ msgstr "" msgid "Details only" msgstr "" -msgid "Disaggregation" +msgid "Loading" msgstr "" -msgid "No data" +msgid "Data elements" +msgstr "dataelement" + +msgid "Search by data element name" msgstr "" -msgid "Loading" +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "" + +msgid "All types" +msgstr "" + +msgid "Disaggregation" +msgstr "" + +msgid "No data" msgstr "" msgid "Search by data item name" @@ -114,9 +180,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -126,10 +189,10 @@ msgstr "" msgid "No program indicators found" msgstr "" -msgid "No indicators found for \"{{- searchTerm}}\"" +msgid "No calculations found" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" +msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" msgid "No data sets found for \"{{- searchTerm}}\"" @@ -141,9 +204,15 @@ msgstr "" msgid "No program indicators found for \"{{- searchTerm}}\"" msgstr "" +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "" + msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -151,10 +220,10 @@ msgid "All metrics" msgstr "" msgid "Move to {{axisName}}" -msgstr "" +msgstr "Flytta till {{axisName}}" msgid "Add to {{axisName}}" -msgstr "" +msgstr "Lägg till i {{axisName}}" msgid "Not available for {{visualizationType}}" msgstr "" @@ -210,9 +279,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Avbryt" - msgid "Delete" msgstr "Radera" @@ -264,6 +330,9 @@ msgstr "Beskrivning" msgid "Rename" msgstr "Döpa om" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -288,6 +357,9 @@ msgstr "" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "" + msgid "Could not update comment" msgstr "" @@ -314,27 +386,42 @@ msgstr "" msgid "Write an interpretation" msgstr "" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "tolkningar" +msgid "Reply" +msgstr "Svar" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "" +msgstr[1] "" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "" msgid "Like" msgstr "" -msgid "Reply" -msgstr "Svar" +msgid "See interpretation" +msgstr "" + +msgid "Open in app" +msgstr "" msgid "Share" msgstr "Dela med sig" -msgid "See interpretation" -msgstr "" - msgid "Manage sharing" msgstr "" @@ -377,6 +464,9 @@ msgstr "" msgid "No results found" msgstr "Inga resultat hittades" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "Skapad av" @@ -511,7 +601,7 @@ msgid "Options" msgstr "Alternativ" msgid "Hide" -msgstr "" +msgstr "Göm" msgid "{{count}} org units" msgid_plural "{{count}} org units" @@ -550,7 +640,7 @@ msgid "Select a group" msgstr "" msgid "Deselect all" -msgstr "" +msgstr "Avmarkera alla" msgid "Period type" msgstr "Periodtyp" @@ -564,58 +654,16 @@ msgstr "Välj år" msgid "Period" msgstr "Period" -msgid "Relative periods" -msgstr "" - -msgid "Fixed periods" -msgstr "" - msgid "Selected Periods" msgstr "" -msgid "No periods selected" +msgid "Relative periods" msgstr "" -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augusti" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "Week {{weekNumber}}" +msgid "Fixed periods" msgstr "" -msgid "Bi-Week {{biWeekNumber}}" +msgid "No periods selected" msgstr "" msgid "Daily" @@ -822,6 +870,9 @@ msgstr "" msgid "Years" msgstr "År" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -840,6 +891,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -903,9 +957,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "dataelement" - msgid "Data element group" msgstr "Dataelementgrupp" @@ -951,6 +1002,33 @@ msgstr "programindikatorer" msgid "Program indicator" msgstr "" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Antal" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" @@ -1086,6 +1164,9 @@ msgstr "" msgid "Single value" msgstr "" +msgid "Outlier table" +msgstr "" + msgid "All charts" msgstr "" diff --git a/i18n/tet.po b/i18n/tet.po index 3b373dc73..e6dd8285a 100644 --- a/i18n/tet.po +++ b/i18n/tet.po @@ -1,15 +1,15 @@ # # Translators: -# phil_dhis2, 2022 # Viktor Varland , 2022 +# phil_dhis2, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-04-18T08:41:27.838Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Viktor Varland , 2022\n" -"Language-Team: Tetum (Tetun) (https://www.transifex.com/hisp-uio/teams/100509/tet/)\n" +"Last-Translator: phil_dhis2, 2023\n" +"Language-Team: Tetum (Tetun) (https://app.transifex.com/hisp-uio/teams/100509/tet/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -80,10 +80,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Kansela" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -92,15 +127,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "" + +msgid "Data elements" +msgstr "Elementus dadus" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + msgid "Disaggregation" msgstr "" msgid "No data" msgstr "Laiha dadus" -msgid "Loading" -msgstr "" - msgid "Search by data item name" msgstr "" @@ -113,9 +174,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -128,9 +186,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -143,6 +198,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -209,9 +267,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Kansela" - msgid "Delete" msgstr "Soe" @@ -263,6 +318,9 @@ msgstr "Deskrisaun" msgid "Rename" msgstr "Tau naran foun" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -376,6 +434,9 @@ msgstr "" msgid "No results found" msgstr "" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "Kria husi" @@ -572,48 +633,6 @@ msgstr "" msgid "No periods selected" msgstr "Laiha períodu selesionadu" -msgid "January" -msgstr "Janeiru" - -msgid "February" -msgstr "Fevereiru" - -msgid "March" -msgstr "Marsu" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juñu" - -msgid "July" -msgstr "Jullu" - -msgid "August" -msgstr "Agostu" - -msgid "September" -msgstr "Setembru" - -msgid "October" -msgstr "Outubru" - -msgid "November" -msgstr "Novembru" - -msgid "December" -msgstr "Dezembru" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "Diáriu" @@ -836,6 +855,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -899,9 +921,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Elementus dadus" - msgid "Data element group" msgstr "" @@ -947,6 +966,33 @@ msgstr "" msgid "Program indicator" msgstr "" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Númeru" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/tg.po b/i18n/tg.po index 3d0d42a16..cd5d4de83 100644 --- a/i18n/tg.po +++ b/i18n/tg.po @@ -1,15 +1,15 @@ # # Translators: -# phil_dhis2, 2022 # Viktor Varland , 2022 +# phil_dhis2, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-04-18T08:41:27.838Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Viktor Varland , 2022\n" -"Language-Team: Tajik (https://www.transifex.com/hisp-uio/teams/100509/tg/)\n" +"Last-Translator: phil_dhis2, 2023\n" +"Language-Team: Tajik (https://app.transifex.com/hisp-uio/teams/100509/tg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -81,10 +81,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Бекор кардан" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -93,15 +128,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "Бор мешавад" + +msgid "Data elements" +msgstr "Унсурҳои иттилоот" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + msgid "Disaggregation" msgstr "" msgid "No data" msgstr "Ягон иттилоот нест" -msgid "Loading" -msgstr "Бор мешавад" - msgid "Search by data item name" msgstr "" @@ -114,9 +175,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -129,9 +187,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -144,6 +199,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -210,9 +268,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Бекор кардан" - msgid "Delete" msgstr "Нест кардан" @@ -264,6 +319,9 @@ msgstr "Тавсиф" msgid "Rename" msgstr "Ивази ном" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -377,6 +435,9 @@ msgstr "" msgid "No results found" msgstr "" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "" @@ -576,48 +637,6 @@ msgstr "" msgid "No periods selected" msgstr "Ягон давра инитихоб нашудааст" -msgid "January" -msgstr "Январ" - -msgid "February" -msgstr "Феврал" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрел" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июн" - -msgid "July" -msgstr "Июл" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябр" - -msgid "October" -msgstr "Октябр" - -msgid "November" -msgstr "Ноябр" - -msgid "December" -msgstr "Декабр" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "Ҳаррӯза" @@ -840,6 +859,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -903,9 +925,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Унсурҳои иттилоот" - msgid "Data element group" msgstr "Гурӯҳи унсурҳои иттилоот" @@ -951,6 +970,33 @@ msgstr "" msgid "Program indicator" msgstr "Идоракунии индикатори барнома" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Рақам" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/th.po b/i18n/th.po new file mode 100644 index 000000000..6b7b9b781 --- /dev/null +++ b/i18n/th.po @@ -0,0 +1,1194 @@ +# +# Translators: +# Namwan Chanthavisouk, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: i18next-conv\n" +"POT-Creation-Date: 2024-01-25T12:05:03.360Z\n" +"PO-Revision-Date: 2020-04-28 22:05+0000\n" +"Last-Translator: Namwan Chanthavisouk, 2024\n" +"Language-Team: Thai (https://app.transifex.com/hisp-uio/teams/100509/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "view only" +msgstr "สำหรับดูเท่านั้น" + +msgid "view and edit" +msgstr "ดู และ แก้ไข" + +msgid "all users ({{accessLevel}})" +msgstr "ผู้ใช้ทั้งหมด ( {{accessLevel}} )" + +msgid "{{userOrGroup}} ({{accessLevel}})" +msgstr "{{userOrGroup}} ( {{accessLevel}} )" + +msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" +msgstr "แชร์กับ {{commaSeparatedListOfUsersAndGroups}} " + +msgid "Not shared with any users or groups" +msgstr "" + +msgid "No description" +msgstr "" + +msgid "Last updated {{time}}" +msgstr "" + +msgid "Created {{time}} by {{author}}" +msgstr "" + +msgid "Created {{time}}" +msgstr "" + +msgid "Viewed {{count}} times" +msgid_plural "Viewed {{count}} times" +msgstr[0] "" + +msgid "Notifications" +msgstr "" + +msgid "You're subscribed and getting updates about new interpretations." +msgstr "" + +msgid "Unsubscribe" +msgstr "" + +msgid "Subscribe to get updates about new interpretations." +msgstr "" + +msgid "Subscribe" +msgstr "" + +msgid "About this map" +msgstr "" + +msgid "About this line list" +msgstr "" + +msgid "About this visualization" +msgstr "" + +msgid "This app could not retrieve required data." +msgstr "" + +msgid "Network error" +msgstr "" + +msgid "Data / Edit calculation" +msgstr "" + +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" + +msgid "Totals only" +msgstr "" + +msgid "Details only" +msgstr "" + +msgid "Loading" +msgstr "" + +msgid "Data elements" +msgstr "" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "" + +msgid "All types" +msgstr "" + +msgid "Disaggregation" +msgstr "" + +msgid "No data" +msgstr "" + +msgid "Search by data item name" +msgstr "" + +msgid "No items selected" +msgstr "" + +msgid "Selected Items" +msgstr "" + +msgid "No indicators found" +msgstr "" + +msgid "No data sets found" +msgstr "" + +msgid "No event data items found" +msgstr "" + +msgid "No program indicators found" +msgstr "" + +msgid "No calculations found" +msgstr "" + +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data sets found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No event data items found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No program indicators found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "Nothing found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "Calculation" +msgstr "" + +msgid "Metric type" +msgstr "" + +msgid "All metrics" +msgstr "" + +msgid "Move to {{axisName}}" +msgstr "" + +msgid "Add to {{axisName}}" +msgstr "" + +msgid "Not available for {{visualizationType}}" +msgstr "" + +msgid "Remove Assigned Categories" +msgstr "" + +msgid "Add Assigned Categories" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "Filter dimensions" +msgstr "" + +msgid "Main dimensions" +msgstr "" + +msgid "Your dimensions" +msgstr "" + +msgid "Dimension recommended with selected data" +msgstr "" + +msgid "All items" +msgstr "" + +msgid "Automatically include all items" +msgstr "" + +msgid "" +"Select all {{- dimensionTitle}} items. With this option, new items added in " +"the future will be automatically included." +msgstr "" + +msgid "Manually select items..." +msgstr "" + +msgid "Nothing found in {{- dimensionTitle}}" +msgstr "" + +msgid "Search" +msgstr "" + +msgid "Nothing found for {{- searchTerm}}" +msgstr "" + +msgid "Delete {{fileType}}" +msgstr "" + +msgid "" +"This {{fileType}} and related interpretations will be deleted. Continue?" +msgstr "" + +msgid "Delete" +msgstr "" + +msgid "File" +msgstr "" + +msgid "New" +msgstr "" + +msgid "Open…" +msgstr "" + +msgid "Save" +msgstr "" + +msgid "Save…" +msgstr "" + +msgid "Save as…" +msgstr "" + +msgid "Rename…" +msgstr "" + +msgid "Translate…" +msgstr "" + +msgid "Share…" +msgstr "" + +msgid "Get link…" +msgstr "" + +msgid "Open in this app" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "Rename {{fileType}}" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "{{- objectName}} (copy)" +msgstr "" + +msgid "Save {{fileType}} as" +msgstr "" + +msgid "event report" +msgstr "" + +msgid "line list" +msgstr "" + +msgid "map" +msgstr "" + +msgid "visualization" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Write a reply" +msgstr "" + +msgid "Post reply" +msgstr "" + +msgid "Delete failed" +msgstr "" + +msgid "Could not update comment" +msgstr "" + +msgid "Enter comment text" +msgstr "" + +msgid "Update" +msgstr "" + +msgid "Viewing interpretation: {{- visualisationName}}" +msgstr "" + +msgid "Could not load interpretation" +msgstr "" + +msgid "" +"The interpretation couldn’t be displayed. Try again or contact your system " +"administrator." +msgstr "" + +msgid "Hide interpretation" +msgstr "" + +msgid "Write an interpretation" +msgstr "" + +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + +msgid "Post interpretation" +msgstr "" + +msgid "Interpretations" +msgstr "" + +msgid "Reply" +msgstr "" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "" + +msgid "View replies" +msgstr "" + +msgid "Unlike" +msgstr "" + +msgid "Like" +msgstr "" + +msgid "See interpretation" +msgstr "" + +msgid "Open in app" +msgstr "" + +msgid "Share" +msgstr "" + +msgid "Manage sharing" +msgstr "" + +msgid "Could not update interpretation" +msgstr "" + +msgid "Enter interpretation text" +msgstr "" + +msgid "Bold text" +msgstr "" + +msgid "Italic text" +msgstr "" + +msgid "Link to a URL" +msgstr "" + +msgid "Mention a user" +msgstr "" + +msgid "Add emoji" +msgstr "" + +msgid "Preview" +msgstr "" + +msgid "Back to write mode" +msgstr "" + +msgid "Too many results. Try refining the search." +msgstr "" + +msgid "Search for a user" +msgstr "" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "" + +msgid "No results found" +msgstr "" + +msgid "Not available offline" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Anyone" +msgstr "" + +msgid "Only you" +msgstr "" + +msgid "Others" +msgstr "" + +msgid "Not supported by this app yet" +msgstr "" + +msgid "Filter by name" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Clear filters" +msgstr "" + +msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" +msgstr "" + +msgid "Open" +msgstr "" + +msgid "Couldn't load items" +msgstr "" + +msgid "" +"There was a problem loading items. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No items found. Create a new to get started." +msgstr "" + +msgid "" +"No items found. Try adjusting your search or filter options to find what " +"you're looking for." +msgstr "" + +msgid "Create new" +msgstr "" + +msgid "Open a visualization" +msgstr "" + +msgid "Loading visualizations" +msgstr "" + +msgid "Couldn't load visualizations" +msgstr "" + +msgid "" +"There was a problem loading visualizations. Try again or contact your system" +" administrator." +msgstr "" + +msgid "No visualizations found. Click New visualization to get started." +msgstr "" + +msgid "" +"No visualizations found. Try adjusting your search or filter options to find" +" what you're looking for." +msgstr "" + +msgid "New visualization" +msgstr "" + +msgid "Open a map" +msgstr "" + +msgid "Loading maps" +msgstr "" + +msgid "Couldn't load maps" +msgstr "" + +msgid "" +"There was a problem loading maps. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No maps found. Click New map to get started." +msgstr "" + +msgid "" +"No maps found. Try adjusting your search or filter options to find what " +"you're looking for." +msgstr "" + +msgid "New map" +msgstr "" + +msgid "Open a line list" +msgstr "" + +msgid "Loading line lists" +msgstr "" + +msgid "Couldn't load line lists" +msgstr "" + +msgid "" +"There was a problem loading line lists. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No line lists found. Click New line list to get started." +msgstr "" + +msgid "" +"No line lists found. Try adjusting your search or filter options to find " +"what you're looking for." +msgstr "" + +msgid "New line list" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Hide" +msgstr "" + +msgid "{{count}} org units" +msgid_plural "{{count}} org units" +msgstr[0] "" + +msgid "{{count}} levels" +msgid_plural "{{count}} levels" +msgstr[0] "" + +msgid "{{count}} groups" +msgid_plural "{{count}} groups" +msgstr[0] "" + +msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" +msgstr "" + +msgid "Nothing selected" +msgstr "" + +msgid "User organisation unit" +msgstr "" + +msgid "User sub-units" +msgstr "" + +msgid "User sub-x2-units" +msgstr "" + +msgid "Select a level" +msgstr "" + +msgid "Select a group" +msgstr "" + +msgid "Deselect all" +msgstr "" + +msgid "Period type" +msgstr "" + +msgid "Year" +msgstr "" + +msgid "Select year" +msgstr "" + +msgid "Period" +msgstr "" + +msgid "Selected Periods" +msgstr "" + +msgid "Relative periods" +msgstr "" + +msgid "Fixed periods" +msgstr "" + +msgid "No periods selected" +msgstr "" + +msgid "Daily" +msgstr "" + +msgid "Weekly" +msgstr "" + +msgid "Weekly (Start Wednesday)" +msgstr "" + +msgid "Weekly (Start Thursday)" +msgstr "" + +msgid "Weekly (Start Saturday)" +msgstr "" + +msgid "Weekly (Start Sunday)" +msgstr "" + +msgid "Bi-weekly" +msgstr "" + +msgid "Monthly" +msgstr "" + +msgid "Bi-monthly" +msgstr "" + +msgid "Quarterly" +msgstr "" + +msgid "Six-monthly" +msgstr "" + +msgid "Six-monthly April" +msgstr "" + +msgid "Yearly" +msgstr "" + +msgid "Financial year (Start November)" +msgstr "" + +msgid "Financial year (Start October)" +msgstr "" + +msgid "Financial year (Start July)" +msgstr "" + +msgid "Financial year (Start April)" +msgstr "" + +msgid "Today" +msgstr "" + +msgid "Yesterday" +msgstr "" + +msgid "Last 3 days" +msgstr "" + +msgid "Last 7 days" +msgstr "" + +msgid "Last 14 days" +msgstr "" + +msgid "Last 30 days" +msgstr "" + +msgid "Last 60 days" +msgstr "" + +msgid "Last 90 days" +msgstr "" + +msgid "Last 180 days" +msgstr "" + +msgid "This week" +msgstr "" + +msgid "Last week" +msgstr "" + +msgid "Last 4 weeks" +msgstr "" + +msgid "Last 12 weeks" +msgstr "" + +msgid "Last 52 weeks" +msgstr "" + +msgid "Weeks this year" +msgstr "" + +msgid "This bi-week" +msgstr "" + +msgid "Last bi-week" +msgstr "" + +msgid "Last 4 bi-weeks" +msgstr "" + +msgid "This month" +msgstr "" + +msgid "Last month" +msgstr "" + +msgid "Last 3 months" +msgstr "" + +msgid "Last 6 months" +msgstr "" + +msgid "Last 12 months" +msgstr "" + +msgid "Months this year" +msgstr "" + +msgid "This bi-month" +msgstr "" + +msgid "Last bi-month" +msgstr "" + +msgid "Last 6 bi-months" +msgstr "" + +msgid "Bi-months this year" +msgstr "" + +msgid "This quarter" +msgstr "" + +msgid "Last quarter" +msgstr "" + +msgid "Last 4 quarters" +msgstr "" + +msgid "Quarters this year" +msgstr "" + +msgid "This six-month" +msgstr "" + +msgid "Last six-month" +msgstr "" + +msgid "Last 2 six-month" +msgstr "" + +msgid "This financial year" +msgstr "" + +msgid "Last financial year" +msgstr "" + +msgid "Last 5 financial years" +msgstr "" + +msgid "This year" +msgstr "" + +msgid "Last year" +msgstr "" + +msgid "Last 5 years" +msgstr "" + +msgid "Last 10 years" +msgstr "" + +msgid "Days" +msgstr "" + +msgid "Weeks" +msgstr "" + +msgid "Bi-weeks" +msgstr "" + +msgid "Months" +msgstr "" + +msgid "Bi-months" +msgstr "" + +msgid "Quarters" +msgstr "" + +msgid "Six-months" +msgstr "" + +msgid "Financial Years" +msgstr "" + +msgid "Years" +msgstr "" + +msgid "Interpretations and details" +msgstr "" + +msgid "Translating to" +msgstr "" + +msgid "Choose a locale" +msgstr "" + +msgid "Base locale reference" +msgstr "" + +msgid "Choose a locale to translate from the menu above" +msgstr "" + +msgid "Translate: {{objectName}}" +msgstr "" + +msgid "Save translations" +msgstr "" + +msgid "Cannot save while offline" +msgstr "" + +msgid "Could not load translations" +msgstr "" + +msgid "Retry" +msgstr "" + +msgid "Series" +msgstr "" + +msgid "Category" +msgstr "" + +msgid "Filter" +msgstr "" + +msgid "Columns" +msgstr "" + +msgid "Rows" +msgstr "" + +msgid "Points" +msgstr "" + +msgid "Reporting rate" +msgstr "" + +msgid "Reporting rate on time" +msgstr "" + +msgid "Actual reports" +msgstr "" + +msgid "Actual reports on time" +msgstr "" + +msgid "Expected reports" +msgstr "" + +msgid "Program" +msgstr "" + +msgid "Select a program" +msgstr "" + +msgid "Indicators" +msgstr "" + +msgid "Indicator group" +msgstr "" + +msgid "All groups" +msgstr "" + +msgid "Indicator" +msgstr "" + +msgid "No indicator groups found" +msgstr "" + +msgid "Loading indicator groups" +msgstr "" + +msgid "Data element group" +msgstr "" + +msgid "Data element" +msgstr "" + +msgid "No data element groups found" +msgstr "" + +msgid "Loading data element groups" +msgstr "" + +msgid "Data sets" +msgstr "" + +msgid "Data set" +msgstr "" + +msgid "All data sets" +msgstr "" + +msgid "Loading data sets" +msgstr "" + +msgid "Event data items" +msgstr "" + +msgid "All programs" +msgstr "" + +msgid "Event data item" +msgstr "" + +msgid "No programs found" +msgstr "" + +msgid "Loading programs" +msgstr "" + +msgid "Program indicators" +msgstr "" + +msgid "Program indicator" +msgstr "" + +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + +msgid "Extra Small" +msgstr "" + +msgid "Small" +msgstr "" + +msgid "Regular" +msgstr "" + +msgid "Large" +msgstr "" + +msgid "Extra Large" +msgstr "" + +msgid "Left" +msgstr "" + +msgid "Center" +msgstr "" + +msgid "Right" +msgstr "" + +msgid "Start" +msgstr "" + +msgid "Middle" +msgstr "" + +msgid "End" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "{{dynamicOuNames}} and {{lastOuName}}" +msgstr "" + +msgid "{{allDynamicOuNames}} levels" +msgstr "" + +msgid "{{allDynamicOuNames}} groups" +msgstr "" + +msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" +msgstr "" + +msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" +msgstr "" + +msgid "{{percentage}}% of total x values" +msgstr "" + +msgid "{{percentage}}% of total y values" +msgstr "" + +msgid "{{thresholdFactor}} × IQR Q1" +msgstr "" + +msgid "{{thresholdFactor}} × IQR Q3" +msgstr "" + +msgid "{{thresholdFactor}} × Modified Z-score low" +msgstr "" + +msgid "{{thresholdFactor}} × Modified Z-score high" +msgstr "" + +msgid "{{thresholdFactor}} × Z-score low" +msgstr "" + +msgid "{{thresholdFactor}} × Z-score high" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "Organisation unit" +msgstr "" + +msgid "Assigned Categories" +msgstr "" + +msgid "Pivot table" +msgstr "" + +msgid "Area" +msgstr "" + +msgid "Stacked area" +msgstr "" + +msgid "Bar" +msgstr "" + +msgid "Stacked bar" +msgstr "" + +msgid "Column" +msgstr "" + +msgid "Year over year (column)" +msgstr "" + +msgid "Stacked column" +msgstr "" + +msgid "Gauge" +msgstr "" + +msgid "Line" +msgstr "" + +msgid "Line list" +msgstr "" + +msgid "Year over year (line)" +msgstr "" + +msgid "Pie" +msgstr "" + +msgid "Radar" +msgstr "" + +msgid "Scatter" +msgstr "" + +msgid "Single value" +msgstr "" + +msgid "Outlier table" +msgstr "" + +msgid "All charts" +msgstr "" + +msgid "{{seriesName}} (trend)" +msgstr "" + +msgid "Trend" +msgstr "" + +msgid "No legend for this series" +msgstr "" + +msgid "and {{amount}} more..." +msgstr "" + +msgid "Linear Regression" +msgstr "" + +msgid "Target" +msgstr "" + +msgid "Base" +msgstr "" + +msgid "Axis {{axisId}}" +msgstr "" + +msgid "{{count}} items" +msgid_plural "{{count}} items" +msgstr[0] "" + +msgid "Reset zoom" +msgstr "" diff --git a/i18n/uk.po b/i18n/uk.po index f026b4a3c..273f909b6 100644 --- a/i18n/uk.po +++ b/i18n/uk.po @@ -1,18 +1,18 @@ # # Translators: # Wanda , 2022 -# phil_dhis2, 2022 # Viktor Varland , 2022 -# Éva Tamási, 2022 # Nadiia , 2022 +# phil_dhis2, 2023 +# Éva Tamási, 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2023-07-06T08:30:33.216Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Nadiia , 2022\n" -"Language-Team: Ukrainian (https://www.transifex.com/hisp-uio/teams/100509/uk/)\n" +"Last-Translator: Éva Tamási, 2023\n" +"Language-Team: Ukrainian (https://app.transifex.com/hisp-uio/teams/100509/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -86,11 +86,46 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" -msgstr "Всі типи" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Скасувати" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "Так, видалити" msgid "Totals only" msgstr "" @@ -98,15 +133,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "Завантаження" + +msgid "Data elements" +msgstr "Елементи даних" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "Всі типи" + msgid "Disaggregation" msgstr "" msgid "No data" msgstr "Немає даних" -msgid "Loading" -msgstr "Завантаження" - msgid "Search by data item name" msgstr "" @@ -119,9 +180,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -134,9 +192,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -149,6 +204,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -215,9 +273,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Скасувати" - msgid "Delete" msgstr "Видалити" @@ -269,7 +324,7 @@ msgstr "Змалювання" msgid "Rename" msgstr "Перейменувати" -msgid "{{objectName}} (copy)" +msgid "{{- objectName}} (copy)" msgstr "" msgid "Save {{fileType}} as" @@ -296,6 +351,9 @@ msgstr "Написати відповідь" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Не вдалося видалити" + msgid "Could not update comment" msgstr "" @@ -328,15 +386,25 @@ msgstr "" msgid "Interpretations" msgstr "Інтерпретації" +msgid "Reply" +msgstr "Відповісти" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} відповідей" +msgstr[1] "{{count}} відповідей" +msgstr[2] "{{count}} відповідей" +msgstr[3] "{{count}} відповідей" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "Прибрати вподобання" msgid "Like" msgstr "Вподобати" -msgid "Reply" -msgstr "Відповісти" - msgid "Share" msgstr "Поділитися" @@ -593,48 +661,6 @@ msgstr "" msgid "No periods selected" msgstr "" -msgid "January" -msgstr "Січень" - -msgid "February" -msgstr "Лютий" - -msgid "March" -msgstr "Березень" - -msgid "April" -msgstr "Квітень" - -msgid "May" -msgstr "Травень" - -msgid "June" -msgstr "Червень" - -msgid "July" -msgstr "Липень" - -msgid "August" -msgstr "Серпень" - -msgid "September" -msgstr "Вересень" - -msgid "October" -msgstr "Жовтень" - -msgid "November" -msgstr "Листопад" - -msgid "December" -msgstr "Грудень" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "Щодня" @@ -839,6 +865,9 @@ msgstr "" msgid "Years" msgstr "Роки" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -923,9 +952,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Елементи даних" - msgid "Data element group" msgstr "Група елементів даних" @@ -971,6 +997,33 @@ msgstr "Програмні показники" msgid "Program indicator" msgstr "Program indicator" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Кількість" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/ur.po b/i18n/ur.po index 3440cd76e..97a44182a 100644 --- a/i18n/ur.po +++ b/i18n/ur.po @@ -1,15 +1,15 @@ # # Translators: -# phil_dhis2, 2022 -# Viktor Varland , 2022 +# phil_dhis2, 2023 +# Viktor Varland , 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-07-06T08:30:33.216Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Viktor Varland , 2022\n" -"Language-Team: Urdu (https://www.transifex.com/hisp-uio/teams/100509/ur/)\n" +"Last-Translator: Viktor Varland , 2023\n" +"Language-Team: Urdu (https://app.transifex.com/hisp-uio/teams/100509/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -81,10 +81,45 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" +msgid "Data / Edit calculation" msgstr "" -msgid "All types" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "منسوخ" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -93,15 +128,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "لوڈ کر رہا ہے" + +msgid "Data elements" +msgstr "ڈیٹا عنصر" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + msgid "Disaggregation" msgstr "ناجائز" msgid "No data" msgstr "کوئی مواد نہیں" -msgid "Loading" -msgstr "لوڈ کر رہا ہے" - msgid "Search by data item name" msgstr "" @@ -114,9 +175,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -129,9 +187,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -144,6 +199,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -210,9 +268,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "منسوخ" - msgid "Delete" msgstr "حذف" @@ -264,6 +319,9 @@ msgstr "تفصیلات" msgid "Rename" msgstr "نام بدلو" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -288,6 +346,9 @@ msgstr "" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "حذف ناکام ہوگیا" + msgid "Could not update comment" msgstr "" @@ -320,15 +381,23 @@ msgstr "" msgid "Interpretations" msgstr "تشریحات" +msgid "Reply" +msgstr "جواب" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "" +msgstr[1] "" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "برعکس" msgid "Like" msgstr "کی طرح" -msgid "Reply" -msgstr "جواب" - msgid "Share" msgstr "بانٹیں" @@ -377,6 +446,9 @@ msgstr "" msgid "No results found" msgstr "کوئی نتیجہ نہیں ملا" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "تخلیق کیا" @@ -576,48 +648,6 @@ msgstr "" msgid "No periods selected" msgstr "کوئی مدت منتخب نہیں" -msgid "January" -msgstr "جنوری" - -msgid "February" -msgstr "فروری" - -msgid "March" -msgstr "مارچ" - -msgid "April" -msgstr "اپریل" - -msgid "May" -msgstr "مئی" - -msgid "June" -msgstr "جون" - -msgid "July" -msgstr "جولائی" - -msgid "August" -msgstr "اگست" - -msgid "September" -msgstr "ستمبر" - -msgid "October" -msgstr "اکتوبر" - -msgid "November" -msgstr "نومبر" - -msgid "December" -msgstr "دسمبر" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "روزانہ" @@ -822,6 +852,9 @@ msgstr "" msgid "Years" msgstr "سال" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -840,6 +873,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -903,9 +939,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "ڈیٹا عنصر" - msgid "Data element group" msgstr "ڈیٹا عناصر گروپ" @@ -951,6 +984,33 @@ msgstr "پروگرام اشارے" msgid "Program indicator" msgstr "پروگرام کا اشارہ" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "نمبر" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/i18n/uz_Latn.po b/i18n/uz_Latn.po index 8a63fddb3..d6871a81b 100644 --- a/i18n/uz_Latn.po +++ b/i18n/uz_Latn.po @@ -1,14 +1,14 @@ # # Translators: -# Yury Rogachev , 2022 +# Yury Rogachev , 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-07-06T08:30:33.216Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Yury Rogachev , 2022\n" -"Language-Team: Uzbek (Latin) (https://www.transifex.com/hisp-uio/teams/100509/uz@Latn/)\n" +"Last-Translator: Yury Rogachev , 2023\n" +"Language-Team: Uzbek (Latin) (https://app.transifex.com/hisp-uio/teams/100509/uz@Latn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -79,11 +79,46 @@ msgstr "" msgid "Network error" msgstr "" -msgid "Data Type" -msgstr "Maʼlumot turi" +msgid "Data / Edit calculation" +msgstr "" -msgid "All types" -msgstr "Barcha turlari" +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Бекор қилиш" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" msgid "Totals only" msgstr "" @@ -91,15 +126,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "Yuklanmoqda" + +msgid "Data elements" +msgstr "Maʼlumot elementlari" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "Maʼlumot turi" + +msgid "All types" +msgstr "Barcha turlari" + msgid "Disaggregation" msgstr "" msgid "No data" msgstr "Maʼlumot yoʼq" -msgid "Loading" -msgstr "Yuklanmoqda" - msgid "Search by data item name" msgstr "" @@ -112,9 +173,6 @@ msgstr "Element tanlangan" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -127,9 +185,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -142,6 +197,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -208,9 +266,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Бекор қилиш" - msgid "Delete" msgstr "Oʼchirib tashlash" @@ -262,6 +317,9 @@ msgstr "Tavsif" msgid "Rename" msgstr "Қайта номлаш" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -286,6 +344,9 @@ msgstr "Izoh yozing" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Oʼchirish amalga oshmadi" + msgid "Could not update comment" msgstr "" @@ -318,15 +379,22 @@ msgstr "" msgid "Interpretations" msgstr "Talqinlar" +msgid "Reply" +msgstr "Javob" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "Аksincha" msgid "Like" msgstr "Kabi, oʼxshash" -msgid "Reply" -msgstr "Javob" - msgid "Share" msgstr "Улашиш" @@ -375,6 +443,9 @@ msgstr "" msgid "No results found" msgstr "Hech qanday natija topilmadi" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "Томонидан яратилган" @@ -571,48 +642,6 @@ msgstr "Tanlangan Davrlar" msgid "No periods selected" msgstr "Davr tanlanmagan" -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Аprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "Iyun" - -msgid "July" -msgstr "Iyul" - -msgid "August" -msgstr "Аvgust" - -msgid "September" -msgstr "Sentyabr" - -msgid "October" -msgstr "Oktyabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgid "Week {{weekNumber}}" -msgstr "Hafta {{weekNumber}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "Juft hafta {{biWeekNumber}}" - msgid "Daily" msgstr "Kunlik" @@ -817,6 +846,9 @@ msgstr "Moliyaviy yillar" msgid "Years" msgstr "Yillar" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -835,6 +867,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -898,9 +933,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Maʼlumot elementlari" - msgid "Data element group" msgstr "Maʼlumotlar elementi guruhi" @@ -946,6 +978,33 @@ msgstr "Dastur indikatorlari" msgid "Program indicator" msgstr "Dastur indikatori" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Tartib raqami" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "Juda Kichik" diff --git a/i18n/uz.po b/i18n/uz_UZ_Cyrl.po similarity index 90% rename from i18n/uz.po rename to i18n/uz_UZ_Cyrl.po index 8e5c02dce..9b9dc5769 100644 --- a/i18n/uz.po +++ b/i18n/uz_UZ_Cyrl.po @@ -1,14 +1,14 @@ # # Translators: -# Ibatov , 2022 +# Ibatov , 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2023-09-27T14:15:13.876Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Ibatov , 2022\n" -"Language-Team: Uzbek (Cyrillic) (https://www.transifex.com/hisp-uio/teams/100509/uz@Cyrl/)\n" +"Last-Translator: Ibatov , 2023\n" +"Language-Team: Uzbek (Cyrillic) (https://app.transifex.com/hisp-uio/teams/100509/uz@Cyrl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -77,13 +77,48 @@ msgid "This app could not retrieve required data." msgstr "" msgid "Network error" +msgstr "Тармоқда хатолик" + +msgid "Data / Edit calculation" msgstr "" -msgid "Data Type" -msgstr "Маълумот тури" +msgid "Data / New calculation" +msgstr "" -msgid "All types" -msgstr "Барча турлари" +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Бекор қилиш" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" msgid "Totals only" msgstr "" @@ -91,15 +126,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "Юкланмоқда" + +msgid "Data elements" +msgstr "Маълумот элементлари" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "Маълумот тури" + +msgid "All types" +msgstr "Барча турлари" + msgid "Disaggregation" msgstr "Ажратиш" msgid "No data" msgstr "Маълумот йўқ" -msgid "Loading" -msgstr "Юкланмоқда" - msgid "Search by data item name" msgstr "" @@ -112,9 +173,6 @@ msgstr "Элемент танланган" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -127,9 +185,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -142,6 +197,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -179,7 +237,7 @@ msgid "Dimension recommended with selected data" msgstr "Танланган маълумотлар учун созламалар тавсия этилади" msgid "All items" -msgstr "" +msgstr "Барча элементлар" msgid "Automatically include all items" msgstr "" @@ -208,9 +266,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Бекор қилиш" - msgid "Delete" msgstr "Ўчириб ташлаш" @@ -262,7 +317,7 @@ msgstr "Тавсиф" msgid "Rename" msgstr "Қайта номлашч" -msgid "{{objectName}} (copy)" +msgid "{{- objectName}} (copy)" msgstr "" msgid "Save {{fileType}} as" @@ -278,7 +333,7 @@ msgid "map" msgstr "харита" msgid "visualization" -msgstr "" +msgstr "Визуализация" msgid "Edit" msgstr "Таҳрирлаш" @@ -289,6 +344,9 @@ msgstr "Изоҳ ёзинг" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Ўчириш амалга ошмади" + msgid "Could not update comment" msgstr "" @@ -315,21 +373,32 @@ msgstr "" msgid "Write an interpretation" msgstr "Талқин ёзиш" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "Талқинлар" +msgid "Reply" +msgstr "Изоҳ" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} изоҳлар" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "Аксинча" msgid "Like" msgstr "Каби, ўхшаш" -msgid "Reply" -msgstr "Изоҳ" - msgid "Share" msgstr "Улашиш" @@ -530,10 +599,10 @@ msgid_plural "{{count}} groups" msgstr[0] "" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "" +msgstr "Танланган: {{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" -msgstr "" +msgstr "Ҳеч нима танланмаган" msgid "User organisation unit" msgstr "Ташкилий бўлим фойдаланувчиси" @@ -577,48 +646,6 @@ msgstr "Танланган Даврлар" msgid "No periods selected" msgstr "Давр танланмаган" -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "Week {{weekNumber}}" -msgstr "Ҳафта {{ҳафтаРақам}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "Жуфт ҳафта {{жуфтҲафтаРақам}}" - msgid "Daily" msgstr "Кунлик" @@ -823,6 +850,9 @@ msgstr "Молиявий йиллар" msgid "Years" msgstr "Йиллар" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -896,7 +926,7 @@ msgid "Indicator group" msgstr "Индикатор гуруҳи" msgid "All groups" -msgstr "" +msgstr "Барча гуруҳлар" msgid "Indicator" msgstr "Индикатор" @@ -907,9 +937,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Маълумот элементлари" - msgid "Data element group" msgstr "Маълумотлар элементи гуруҳи" @@ -955,6 +982,33 @@ msgstr "Дастур индикаторлари" msgid "Program indicator" msgstr "Дастур индикатори" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Тартиб рақами" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "Жуда Кичик" diff --git a/i18n/uz_UZ_Latn.po b/i18n/uz_UZ_Latn.po new file mode 100644 index 000000000..d6871a81b --- /dev/null +++ b/i18n/uz_UZ_Latn.po @@ -0,0 +1,1175 @@ +# +# Translators: +# Yury Rogachev , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: i18next-conv\n" +"POT-Creation-Date: 2023-07-06T08:30:33.216Z\n" +"PO-Revision-Date: 2020-04-28 22:05+0000\n" +"Last-Translator: Yury Rogachev , 2023\n" +"Language-Team: Uzbek (Latin) (https://app.transifex.com/hisp-uio/teams/100509/uz@Latn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz@Latn\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "view only" +msgstr "" + +msgid "view and edit" +msgstr "" + +msgid "all users ({{accessLevel}})" +msgstr "" + +msgid "{{userOrGroup}} ({{accessLevel}})" +msgstr "" + +msgid "Shared with {{commaSeparatedListOfUsersAndGroups}}" +msgstr "" + +msgid "Not shared with any users or groups" +msgstr "" + +msgid "No description" +msgstr "Tavsif yoʼq" + +msgid "Last updated {{time}}" +msgstr "" + +msgid "Created {{time}} by {{author}}" +msgstr "" + +msgid "Created {{time}}" +msgstr "" + +msgid "Viewed {{count}} times" +msgid_plural "Viewed {{count}} times" +msgstr[0] "" + +msgid "Notifications" +msgstr "" + +msgid "You're subscribed and getting updates about new interpretations." +msgstr "" + +msgid "Unsubscribe" +msgstr "" + +msgid "Subscribe to get updates about new interpretations." +msgstr "" + +msgid "Subscribe" +msgstr "" + +msgid "About this map" +msgstr "" + +msgid "About this line list" +msgstr "" + +msgid "About this visualization" +msgstr "" + +msgid "This app could not retrieve required data." +msgstr "" + +msgid "Network error" +msgstr "" + +msgid "Data / Edit calculation" +msgstr "" + +msgid "Data / New calculation" +msgstr "" + +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Бекор қилиш" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" + +msgid "Totals only" +msgstr "" + +msgid "Details only" +msgstr "" + +msgid "Loading" +msgstr "Yuklanmoqda" + +msgid "Data elements" +msgstr "Maʼlumot elementlari" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "Maʼlumot turi" + +msgid "All types" +msgstr "Barcha turlari" + +msgid "Disaggregation" +msgstr "" + +msgid "No data" +msgstr "Maʼlumot yoʼq" + +msgid "Search by data item name" +msgstr "" + +msgid "No items selected" +msgstr "Element tanlanmagan" + +msgid "Selected Items" +msgstr "Element tanlangan" + +msgid "No indicators found" +msgstr "" + +msgid "No data sets found" +msgstr "" + +msgid "No event data items found" +msgstr "" + +msgid "No program indicators found" +msgstr "" + +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data sets found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No event data items found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No program indicators found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "Nothing found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "Calculation" +msgstr "" + +msgid "Metric type" +msgstr "" + +msgid "All metrics" +msgstr "Barcha koʼrsatgichlar" + +msgid "Move to {{axisName}}" +msgstr "Harakatlaning {{axisName}} ga qarab" + +msgid "Add to {{axisName}}" +msgstr "{{axisName}} ga qoʼshing" + +msgid "Not available for {{visualizationType}}" +msgstr "{{visualizationType}} uchun mavjud emas" + +msgid "Remove Assigned Categories" +msgstr "Belgilangan kategoriyalar oʼchirilsin" + +msgid "Add Assigned Categories" +msgstr "Belgilangan kategoriyalar qoʼshilsin" + +msgid "Remove" +msgstr "Olib tashlash" + +msgid "Filter dimensions" +msgstr "Filtr sozlamalari" + +msgid "Main dimensions" +msgstr "Umumiy oʼlchamlar" + +msgid "Your dimensions" +msgstr "Sizning sozlamalaringiz" + +msgid "Dimension recommended with selected data" +msgstr "Tanlangan maʼlumotlar uchun sozlamalar tavsiya etiladi" + +msgid "All items" +msgstr "" + +msgid "Automatically include all items" +msgstr "" + +msgid "" +"Select all {{- dimensionTitle}} items. With this option, new items added in " +"the future will be automatically included." +msgstr "" + +msgid "Manually select items..." +msgstr "" + +msgid "Nothing found in {{- dimensionTitle}}" +msgstr "" + +msgid "Search" +msgstr "Izlash" + +msgid "Nothing found for {{- searchTerm}}" +msgstr "" + +msgid "Delete {{fileType}}" +msgstr "" + +msgid "" +"This {{fileType}} and related interpretations will be deleted. Continue?" +msgstr "" + +msgid "Delete" +msgstr "Oʼchirib tashlash" + +msgid "File" +msgstr "Fayl" + +msgid "New" +msgstr "Yangi" + +msgid "Open…" +msgstr "" + +msgid "Save" +msgstr "Saqlash" + +msgid "Save…" +msgstr "" + +msgid "Save as…" +msgstr "" + +msgid "Rename…" +msgstr "" + +msgid "Translate…" +msgstr "" + +msgid "Share…" +msgstr "" + +msgid "Get link…" +msgstr "" + +msgid "Open in this app" +msgstr "Ushbu ilovada oching" + +msgid "Close" +msgstr "Yopmoq" + +msgid "Rename {{fileType}}" +msgstr "" + +msgid "Name" +msgstr "Исми" + +msgid "Description" +msgstr "Tavsif" + +msgid "Rename" +msgstr "Қайта номлаш" + +msgid "{{- objectName}} (copy)" +msgstr "" + +msgid "Save {{fileType}} as" +msgstr "" + +msgid "event report" +msgstr "hodisa/tadbir hisoboti" + +msgid "line list" +msgstr "" + +msgid "map" +msgstr "xarita" + +msgid "visualization" +msgstr "" + +msgid "Edit" +msgstr "Tahrirlash" + +msgid "Write a reply" +msgstr "Izoh yozing" + +msgid "Post reply" +msgstr "" + +msgid "Delete failed" +msgstr "Oʼchirish amalga oshmadi" + +msgid "Could not update comment" +msgstr "" + +msgid "Enter comment text" +msgstr "" + +msgid "Update" +msgstr "Янгилаш" + +msgid "Viewing interpretation: {{- visualisationName}}" +msgstr "" + +msgid "Could not load interpretation" +msgstr "" + +msgid "" +"The interpretation couldn’t be displayed. Try again or contact your system " +"administrator." +msgstr "" + +msgid "Hide interpretation" +msgstr "" + +msgid "Write an interpretation" +msgstr "Talqin yozish" + +msgid "Post interpretation" +msgstr "" + +msgid "Interpretations" +msgstr "Talqinlar" + +msgid "Reply" +msgstr "Javob" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "" + +msgid "View replies" +msgstr "" + +msgid "Unlike" +msgstr "Аksincha" + +msgid "Like" +msgstr "Kabi, oʼxshash" + +msgid "Share" +msgstr "Улашиш" + +msgid "See interpretation" +msgstr "" + +msgid "Manage sharing" +msgstr "Ulashishni boshqarish" + +msgid "Could not update interpretation" +msgstr "" + +msgid "Enter interpretation text" +msgstr "" + +msgid "Bold text" +msgstr "" + +msgid "Italic text" +msgstr "" + +msgid "Link to a URL" +msgstr "" + +msgid "Mention a user" +msgstr "" + +msgid "Add emoji" +msgstr "" + +msgid "Preview" +msgstr "" + +msgid "Back to write mode" +msgstr "" + +msgid "Too many results. Try refining the search." +msgstr "" + +msgid "Search for a user" +msgstr "" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "" + +msgid "No results found" +msgstr "Hech qanday natija topilmadi" + +msgid "Not available offline" +msgstr "" + +msgid "Created by" +msgstr "Томонидан яратилган" + +msgid "Anyone" +msgstr "Kimdir" + +msgid "Only you" +msgstr "" + +msgid "Others" +msgstr "" + +msgid "Not supported by this app yet" +msgstr "" + +msgid "Filter by name" +msgstr "Nomi boʼyicha filtrlash" + +msgid "Created" +msgstr "Yaratilgan" + +msgid "Last updated" +msgstr "Oxirgi yangilangan" + +msgid "Type" +msgstr "Turi" + +msgid "Clear filters" +msgstr "Filtrlarni tozalash" + +msgid "{{firstItemIndex}}-{{lastItemIndex}} of {{totalNumberOfItems}}" +msgstr "" + +msgid "Open" +msgstr "Ochiq" + +msgid "Couldn't load items" +msgstr "" + +msgid "" +"There was a problem loading items. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No items found. Create a new to get started." +msgstr "" + +msgid "" +"No items found. Try adjusting your search or filter options to find what " +"you're looking for." +msgstr "" + +msgid "Create new" +msgstr "Yangisini yaratish" + +msgid "Open a visualization" +msgstr "" + +msgid "Loading visualizations" +msgstr "" + +msgid "Couldn't load visualizations" +msgstr "" + +msgid "" +"There was a problem loading visualizations. Try again or contact your system" +" administrator." +msgstr "" + +msgid "No visualizations found. Click New visualization to get started." +msgstr "" + +msgid "" +"No visualizations found. Try adjusting your search or filter options to find" +" what you're looking for." +msgstr "" + +msgid "New visualization" +msgstr "" + +msgid "Open a map" +msgstr "" + +msgid "Loading maps" +msgstr "" + +msgid "Couldn't load maps" +msgstr "" + +msgid "" +"There was a problem loading maps. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No maps found. Click New map to get started." +msgstr "" + +msgid "" +"No maps found. Try adjusting your search or filter options to find what " +"you're looking for." +msgstr "" + +msgid "New map" +msgstr "" + +msgid "Open a line list" +msgstr "" + +msgid "Loading line lists" +msgstr "" + +msgid "Couldn't load line lists" +msgstr "" + +msgid "" +"There was a problem loading line lists. Try again or contact your system " +"administrator." +msgstr "" + +msgid "No line lists found. Click New line list to get started." +msgstr "" + +msgid "" +"No line lists found. Try adjusting your search or filter options to find " +"what you're looking for." +msgstr "" + +msgid "New line list" +msgstr "" + +msgid "Options" +msgstr "Вариант" + +msgid "Hide" +msgstr "Berkitish" + +msgid "{{count}} org units" +msgid_plural "{{count}} org units" +msgstr[0] "" + +msgid "{{count}} levels" +msgid_plural "{{count}} levels" +msgstr[0] "" + +msgid "{{count}} groups" +msgid_plural "{{count}} groups" +msgstr[0] "" + +msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" +msgstr "" + +msgid "Nothing selected" +msgstr "" + +msgid "User organisation unit" +msgstr "Ташкилий бўлим фойдаланувчиси" + +msgid "User sub-units" +msgstr "Фойдаланувчига бўйсунувчи бирликлар" + +msgid "User sub-x2-units" +msgstr "Фойдаланувчига бўйсунувчи 2 даражали бирликлар" + +msgid "Select a level" +msgstr "Pogʼonani tanlang" + +msgid "Select a group" +msgstr "Guruhni tanlang" + +msgid "Deselect all" +msgstr "Barcha tanlanganni bekor qilish" + +msgid "Period type" +msgstr "Davr turi" + +msgid "Year" +msgstr "Yil" + +msgid "Select year" +msgstr "Yilni tanlang" + +msgid "Period" +msgstr "Davr" + +msgid "Relative periods" +msgstr "Nisbiy davrlar" + +msgid "Fixed periods" +msgstr "Beligalangan davrlar" + +msgid "Selected Periods" +msgstr "Tanlangan Davrlar" + +msgid "No periods selected" +msgstr "Davr tanlanmagan" + +msgid "Daily" +msgstr "Kunlik" + +msgid "Weekly" +msgstr "Haftalik" + +msgid "Weekly (Start Wednesday)" +msgstr "Haftalik (Boshlanishi Chorshanba)" + +msgid "Weekly (Start Thursday)" +msgstr "Haftalik (Boshlanishi Payshanba)" + +msgid "Weekly (Start Saturday)" +msgstr "Haftalik (Boshlanishi Shanba)" + +msgid "Weekly (Start Sunday)" +msgstr "Haftalik (Boshlanishi Yakshanba)" + +msgid "Bi-weekly" +msgstr "Juft haftalik" + +msgid "Monthly" +msgstr "Oylik" + +msgid "Bi-monthly" +msgstr "Juft oylik" + +msgid "Quarterly" +msgstr "Har kvartal" + +msgid "Six-monthly" +msgstr "Yarim yillik" + +msgid "Six-monthly April" +msgstr "Yarim yillik Аprel" + +msgid "Yearly" +msgstr "Yillik" + +msgid "Financial year (Start November)" +msgstr "Moliyaviy yil (Boshlanishi Noyabr)" + +msgid "Financial year (Start October)" +msgstr "Moliyaviy yil (boshlanishi Oktyabr)" + +msgid "Financial year (Start July)" +msgstr "Moliyaviy yil (boshlanishi Iyul)" + +msgid "Financial year (Start April)" +msgstr "Moliyaviy yil (boshlanishi Аprel)" + +msgid "Today" +msgstr "Bugun" + +msgid "Yesterday" +msgstr "Kecha" + +msgid "Last 3 days" +msgstr "Oxirgi 3 kun" + +msgid "Last 7 days" +msgstr "Oxirgi 7 kun" + +msgid "Last 14 days" +msgstr "Oxirgi 14 kun" + +msgid "Last 30 days" +msgstr "Oxirgi 30 kun" + +msgid "Last 60 days" +msgstr "Oxirgi 60 kun" + +msgid "Last 90 days" +msgstr "Oxirgi 90 kun" + +msgid "Last 180 days" +msgstr "Oxirgi 180 kun" + +msgid "This week" +msgstr "Ushbu hafta" + +msgid "Last week" +msgstr "Oxirgi hafta" + +msgid "Last 4 weeks" +msgstr "Oxirgi 4 hafta" + +msgid "Last 12 weeks" +msgstr "Oxirgi 12 hafta" + +msgid "Last 52 weeks" +msgstr "Oxirgi 52 hafta" + +msgid "Weeks this year" +msgstr "Haftalar ayni yilda" + +msgid "This bi-week" +msgstr "Ushbu juft hafta" + +msgid "Last bi-week" +msgstr "Oxirgi juft hafta" + +msgid "Last 4 bi-weeks" +msgstr "Oxirgi 4 juft haftalar" + +msgid "This month" +msgstr "Ushbu oy" + +msgid "Last month" +msgstr "Oxirgi oy" + +msgid "Last 3 months" +msgstr "Oxirgi 3 oy" + +msgid "Last 6 months" +msgstr "Oxirgi 6 oy" + +msgid "Last 12 months" +msgstr "Oxirgi 12 oy" + +msgid "Months this year" +msgstr "Oylar ayni yilda" + +msgid "This bi-month" +msgstr "Ushbu juft oy" + +msgid "Last bi-month" +msgstr "Oxirgi 2 oy" + +msgid "Last 6 bi-months" +msgstr "Oxirgi 6 juft oylar" + +msgid "Bi-months this year" +msgstr "Аyni yildagi juft oylar" + +msgid "This quarter" +msgstr "Ushbu kvartal" + +msgid "Last quarter" +msgstr "Oxirgi kvartal" + +msgid "Last 4 quarters" +msgstr "Oxirgi 4 kvartal" + +msgid "Quarters this year" +msgstr "Ushbu yildagi kvartallar" + +msgid "This six-month" +msgstr "Ushbu yarim yillik" + +msgid "Last six-month" +msgstr "Oxirgi 6 oy" + +msgid "Last 2 six-month" +msgstr "Oxirgi juft yarim yillik" + +msgid "This financial year" +msgstr "Ushbu moliyaviy yil" + +msgid "Last financial year" +msgstr "Oxirgi moliyaviy yil" + +msgid "Last 5 financial years" +msgstr "Oxirgi 5 moliyaviy yillar" + +msgid "This year" +msgstr "Ushbu yil" + +msgid "Last year" +msgstr "Oxirgi yil" + +msgid "Last 5 years" +msgstr "Oxirgi 5 yil" + +msgid "Last 10 years" +msgstr "Oxirgi 10 yil" + +msgid "Days" +msgstr "Kunlar" + +msgid "Weeks" +msgstr "Haftalar" + +msgid "Bi-weeks" +msgstr "Juft haftalar" + +msgid "Months" +msgstr "Oylar" + +msgid "Bi-months" +msgstr "2 oy" + +msgid "Quarters" +msgstr "Kvartal" + +msgid "Six-months" +msgstr "Yarim yillik" + +msgid "Financial Years" +msgstr "Moliyaviy yillar" + +msgid "Years" +msgstr "Yillar" + +msgid "Interpretations and details" +msgstr "" + +msgid "Translating to" +msgstr "" + +msgid "Choose a locale" +msgstr "" + +msgid "Base locale reference" +msgstr "" + +msgid "Choose a locale to translate from the menu above" +msgstr "" + +msgid "Translate: {{objectName}}" +msgstr "" + +msgid "Save translations" +msgstr "" + +msgid "Cannot save while offline" +msgstr "" + +msgid "Could not load translations" +msgstr "" + +msgid "Retry" +msgstr "" + +msgid "Series" +msgstr "Ketma-ketliklar" + +msgid "Category" +msgstr "Kategoriya" + +msgid "Filter" +msgstr "Filtr" + +msgid "Columns" +msgstr "Ustunlar" + +msgid "Rows" +msgstr "Qatorlar" + +msgid "Points" +msgstr "Nuqtalar" + +msgid "Reporting rate" +msgstr "Hisobotdagi stavka" + +msgid "Reporting rate on time" +msgstr "Hisobotdagi stavka oʼz vaqtida" + +msgid "Actual reports" +msgstr "Haqiqiy hisobotlar" + +msgid "Actual reports on time" +msgstr "Haqiqiy hisobotlar oʼz vaqtida" + +msgid "Expected reports" +msgstr "Kutilayotgan hisobotlar" + +msgid "Program" +msgstr "Programma" + +msgid "Select a program" +msgstr "Dasturni tanlang" + +msgid "Indicators" +msgstr "Indikatorlar" + +msgid "Indicator group" +msgstr "Koʼrsatgich guruhi" + +msgid "All groups" +msgstr "" + +msgid "Indicator" +msgstr "Indikator" + +msgid "No indicator groups found" +msgstr "" + +msgid "Loading indicator groups" +msgstr "" + +msgid "Data element group" +msgstr "Maʼlumotlar elementi guruhi" + +msgid "Data element" +msgstr "Maʼlumotlar elementi" + +msgid "No data element groups found" +msgstr "" + +msgid "Loading data element groups" +msgstr "" + +msgid "Data sets" +msgstr "Maʼlumotlar toʼplami" + +msgid "Data set" +msgstr "Maʼlumotlar toʼplami" + +msgid "All data sets" +msgstr "" + +msgid "Loading data sets" +msgstr "" + +msgid "Event data items" +msgstr "Hodisalar haqida maʼlumot elementlari" + +msgid "All programs" +msgstr "" + +msgid "Event data item" +msgstr "Hodisa/Tadbir maʼlumoti elementi" + +msgid "No programs found" +msgstr "" + +msgid "Loading programs" +msgstr "" + +msgid "Program indicators" +msgstr "Dastur indikatorlari" + +msgid "Program indicator" +msgstr "Dastur indikatori" + +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Tartib raqami" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + +msgid "Extra Small" +msgstr "Juda Kichik" + +msgid "Small" +msgstr "Kichik" + +msgid "Regular" +msgstr "Regulyar" + +msgid "Large" +msgstr "Katta" + +msgid "Extra Large" +msgstr "Juda Katta" + +msgid "Left" +msgstr "Chap" + +msgid "Center" +msgstr "Markaz" + +msgid "Right" +msgstr "Oʼng" + +msgid "Start" +msgstr "Boshlash" + +msgid "Middle" +msgstr "Oʼrtav" + +msgid "End" +msgstr "Oxiri" + +msgid "Top" +msgstr "Yuqoridagi" + +msgid "Bottom" +msgstr "Pastki" + +msgid "{{dynamicOuNames}} and {{lastOuName}}" +msgstr "{{dynamicOuNames}} va {{lastOuName}}" + +msgid "{{allDynamicOuNames}} levels" +msgstr "Barcha {{allDynamicOuNames}} pogʼonalar" + +msgid "{{allDynamicOuNames}} groups" +msgstr "{{allDynamicOuNames}} guruhlar" + +msgid "{{allDynamicOuNames}} levels in {{staticOuNames}}" +msgstr "{{allDynamicOuNames}} pogʼonalar {{staticOuNames}} ichida" + +msgid "{{allDynamicOuNames}} groups in {{staticOuNames}}" +msgstr "{{allDynamicOuNames}} guruhlar {{staticOuNames}} ichida" + +msgid "{{percentage}}% of total x values" +msgstr "" + +msgid "{{percentage}}% of total y values" +msgstr "" + +msgid "{{thresholdFactor}} × IQR Q1" +msgstr "" + +msgid "{{thresholdFactor}} × IQR Q3" +msgstr "" + +msgid "{{thresholdFactor}} × Modified Z-score low" +msgstr "" + +msgid "{{thresholdFactor}} × Modified Z-score high" +msgstr "" + +msgid "{{thresholdFactor}} × Z-score low" +msgstr "" + +msgid "{{thresholdFactor}} × Z-score high" +msgstr "" + +msgid "Data" +msgstr "Maʼlumot" + +msgid "Organisation unit" +msgstr "Ташкилий бирлик" + +msgid "Assigned Categories" +msgstr "Belgilangan Kategoriyalar" + +msgid "Pivot table" +msgstr "Solishtirma jadval" + +msgid "Area" +msgstr "Maydon" + +msgid "Stacked area" +msgstr "Yigʼilgan maydon" + +msgid "Bar" +msgstr "Tizimcha" + +msgid "Stacked bar" +msgstr "Yigʼilgan tizimcha" + +msgid "Column" +msgstr "Ustun" + +msgid "Year over year (column)" +msgstr "Yildan yilga (ustun)" + +msgid "Stacked column" +msgstr "Yigʼilgan ustun" + +msgid "Gauge" +msgstr "Hisoblagich" + +msgid "Line" +msgstr "Qator" + +msgid "Line list" +msgstr "Qatorlar roʼyxati" + +msgid "Year over year (line)" +msgstr "Yildan yilga (qator)" + +msgid "Pie" +msgstr "Butun aylana" + +msgid "Radar" +msgstr "Radar" + +msgid "Scatter" +msgstr "Tarqoqlik" + +msgid "Single value" +msgstr "Yagona qiymat" + +msgid "All charts" +msgstr "" + +msgid "{{seriesName}} (trend)" +msgstr "" + +msgid "Trend" +msgstr "Yoʼnalish" + +msgid "No legend for this series" +msgstr "Ushbu seriya uchun taʼrif mavjud emas" + +msgid "and {{amount}} more..." +msgstr "" + +msgid "Linear Regression" +msgstr "" + +msgid "Target" +msgstr "Nishon" + +msgid "Base" +msgstr "Аsos" + +msgid "Axis {{axisId}}" +msgstr "Oʼqlar {{axisId}}" + +msgid "{{count}} items" +msgid_plural "{{count}} items" +msgstr[0] "" + +msgid "Reset zoom" +msgstr "" diff --git a/i18n/vi.po b/i18n/vi.po index 95144d8fa..e7f86c0c6 100644 --- a/i18n/vi.po +++ b/i18n/vi.po @@ -1,16 +1,17 @@ # # Translators: # Mai Nguyen , 2022 -# phil_dhis2, 2022 -# Viktor Varland , 2022 +# Viktor Varland , 2023 +# Philip Larsen Donnelly, 2024 +# Thuy Nguyen , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2024-01-25T12:05:03.360Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: Viktor Varland , 2022\n" -"Language-Team: Vietnamese (https://www.transifex.com/hisp-uio/teams/100509/vi/)\n" +"Last-Translator: Thuy Nguyen , 2024\n" +"Language-Team: Vietnamese (https://app.transifex.com/hisp-uio/teams/100509/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -79,13 +80,48 @@ msgid "This app could not retrieve required data." msgstr "" msgid "Network error" +msgstr "Lỗi mạng" + +msgid "Data / Edit calculation" msgstr "" -msgid "Data Type" -msgstr "Loại dữ liệu" +msgid "Data / New calculation" +msgstr "" -msgid "All types" -msgstr "Các loại" +msgid "Remove item" +msgstr "Bỏ mặt hàng" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "Hủy" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" +msgstr "" msgid "Totals only" msgstr "" @@ -93,15 +129,44 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "Đang tải" + +msgid "Data elements" +msgstr "Các phần tử dữ liệu" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "Loại dữ liệu" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "" + +msgid "All types" +msgstr "Các loại" + msgid "Disaggregation" msgstr "Phân Tách Phần Tử Dữ Liệu" msgid "No data" msgstr "Không có dữ liệu" -msgid "Loading" -msgstr "Đang tải" - msgid "Search by data item name" msgstr "" @@ -114,9 +179,6 @@ msgstr "Các mục đã chọn" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -126,10 +188,10 @@ msgstr "" msgid "No program indicators found" msgstr "" -msgid "No indicators found for \"{{- searchTerm}}\"" +msgid "No calculations found" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" +msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" msgid "No data sets found for \"{{- searchTerm}}\"" @@ -141,9 +203,15 @@ msgstr "" msgid "No program indicators found for \"{{- searchTerm}}\"" msgstr "" +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "" + msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -210,9 +278,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "Hủy" - msgid "Delete" msgstr "Xóa" @@ -264,6 +329,9 @@ msgstr "Miêu tả" msgid "Rename" msgstr "Đổi tên" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -288,6 +356,9 @@ msgstr "Viết phản hồi" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "Không thể xóa" + msgid "Could not update comment" msgstr "" @@ -314,27 +385,41 @@ msgstr "" msgid "Write an interpretation" msgstr "Viết diễn giải" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "Diễn giải " +msgid "Reply" +msgstr "Trả lời" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}} câu trả lời" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "Không thích" msgid "Like" msgstr "Thích" -msgid "Reply" -msgstr "Trả lời" +msgid "See interpretation" +msgstr "" + +msgid "Open in app" +msgstr "" msgid "Share" msgstr "Chia sẻ" -msgid "See interpretation" -msgstr "" - msgid "Manage sharing" msgstr "Quản lý chia sẻ" @@ -377,6 +462,9 @@ msgstr "" msgid "No results found" msgstr "Không tìm thấy kết quả nào" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "Được tạo bởi" @@ -561,60 +649,18 @@ msgstr "Chọn năm" msgid "Period" msgstr "Thời điểm" +msgid "Selected Periods" +msgstr "Thời điểm đã chọn" + msgid "Relative periods" msgstr "Thời điểm tương đối" msgid "Fixed periods" msgstr "Thời điểm tĩnh" -msgid "Selected Periods" -msgstr "Thời điểm đã chọn" - msgid "No periods selected" msgstr "Chưa chọn thời điểm" -msgid "January" -msgstr "Tháng một" - -msgid "February" -msgstr "Tháng hai" - -msgid "March" -msgstr "Tháng ba" - -msgid "April" -msgstr "Tháng tư" - -msgid "May" -msgstr "Tháng năm" - -msgid "June" -msgstr "Tháng sáu" - -msgid "July" -msgstr "Tháng bảy" - -msgid "August" -msgstr "Tháng tám" - -msgid "September" -msgstr "Tháng chín" - -msgid "October" -msgstr "Tháng mười" - -msgid "November" -msgstr "Tháng mười một" - -msgid "December" -msgstr "Tháng mười hai" - -msgid "Week {{weekNumber}}" -msgstr "Tuần {{weekNumber}}" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "Hai tuần {{biWeekNumber}}" - msgid "Daily" msgstr "Hàng ngày" @@ -819,6 +865,9 @@ msgstr "Năm tài chính" msgid "Years" msgstr "Năm" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -837,6 +886,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -900,9 +952,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "Các phần tử dữ liệu" - msgid "Data element group" msgstr "Nhóm dữ liệu" @@ -948,6 +997,33 @@ msgstr "Chỉ Số Chương Trình" msgid "Program indicator" msgstr "Quản lý Chỉ số chương trình" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "Số" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "Rất nhỏ" @@ -1083,6 +1159,9 @@ msgstr "phân tán" msgid "Single value" msgstr "Giá trị đơn" +msgid "Outlier table" +msgstr "" + msgid "All charts" msgstr "" diff --git a/i18n/zh.po b/i18n/zh.po index d2a473adc..684f61cec 100644 --- a/i18n/zh.po +++ b/i18n/zh.po @@ -1,17 +1,17 @@ # # Translators: # Viktor Varland , 2021 -# 晓东 林 <13981924470@126.com>, 2022 -# phil_dhis2, 2022 -# easylin , 2022 +# 晓东 林 <13981924470@126.com>, 2023 +# Philip Larsen Donnelly, 2024 +# easylin , 2024 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-09-22T13:25:32.620Z\n" +"POT-Creation-Date: 2024-10-11T12:49:26.846Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: easylin , 2022\n" -"Language-Team: Chinese (https://www.transifex.com/hisp-uio/teams/100509/zh/)\n" +"Last-Translator: easylin , 2024\n" +"Language-Team: Chinese (https://app.transifex.com/hisp-uio/teams/100509/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -50,7 +50,7 @@ msgstr "已创建 {{time}}" msgid "Viewed {{count}} times" msgid_plural "Viewed {{count}} times" -msgstr[0] "查看了 {{count}} 次" +msgstr[0] "查看了 {{count}} 条" msgid "Notifications" msgstr "通知" @@ -76,33 +76,103 @@ msgstr "关于此行列表" msgid "About this visualization" msgstr "关于此可视化" +msgid "About this event chart" +msgstr "关于该事件图表" + +msgid "About this event report" +msgstr "关于本事件报表" + msgid "This app could not retrieve required data." msgstr "此应用无法检索所需数据。" msgid "Network error" msgstr "网络错误" -msgid "Data Type" -msgstr "数据类型" +msgid "Data / Edit calculation" +msgstr "数据/编辑计算" -msgid "All types" -msgstr "所有类型" +msgid "Data / New calculation" +msgstr "数据/新计算" + +msgid "Remove item" +msgstr "除去项目" + +msgid "Check formula" +msgstr "检查公式" + +msgid "Calculation name" +msgstr "计算名称" + +msgid "Shown in table headers and chart axes/legends" +msgstr "显示在表格标题和图表轴/图例中" + +msgid "Delete calculation" +msgstr "删除计算" + +msgid "Cancel" +msgstr "取消" + +msgid "The calculation can only be saved with a valid formula" +msgstr "计算只能用有效的公式保存" + +msgid "Add a name to save this calculation" +msgstr "添加名称以保存此计算" + +msgid "Save calculation" +msgstr "保存计算" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "您确定要删除此计算吗?它可以被其他可视化使用。" + +msgid "Yes, delete" +msgstr "是的,删除" msgid "Totals only" -msgstr "总计" +msgstr "仅总数" msgid "Details only" msgstr "仅详细信息" +msgid "Loading" +msgstr "载入" + +msgid "Data elements" +msgstr "数据元" + +msgid "Search by data element name" +msgstr "按数据元素名称搜索" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "找不到“ {{- searchTerm}}”的数据元素" + +msgid "No data elements found" +msgstr "找不到数据元素" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "将项目拖到此处,或在列表中双击,开始构建计算公式" + +msgid "Math operators" +msgstr "数学运算符" + +msgid "Data Type" +msgstr "数据类型" + +msgid "Only {{dataType}} can be used in {{visType}}" +msgstr "{{dataType}} 只能在 {{visType}} 中使用" + +msgid "All types" +msgstr "所有类型" + msgid "Disaggregation" msgstr "分解" msgid "No data" msgstr "无数据" -msgid "Loading" -msgstr "载入" - msgid "Search by data item name" msgstr "按数据项名称搜索" @@ -115,9 +185,6 @@ msgstr "选择的条目" msgid "No indicators found" msgstr "找不到指标" -msgid "No data elements found" -msgstr "找不到数据元素" - msgid "No data sets found" msgstr "找不到数据集" @@ -127,23 +194,29 @@ msgstr "找不到事件数据项" msgid "No program indicators found" msgstr "找不到项目指标" -msgid "No indicators found for \"{{- searchTerm}}\"" -msgstr "找不到“ {{-searchTerm}}”的指标" +msgid "No calculations found" +msgstr "没有找到计算结果" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "找不到“ {{-searchTerm}}”的数据元素" +msgid "No indicators found for \"{{- searchTerm}}\"" +msgstr "找不到“ {{- searchTerm}}”的指标" msgid "No data sets found for \"{{- searchTerm}}\"" -msgstr "找不到“ {{-searchTerm}}”的数据集" +msgstr "找不到“ {{- searchTerm}}”的数据集" msgid "No event data items found for \"{{- searchTerm}}\"" -msgstr "找不到“ {{-searchTerm}}”的事件数据项" +msgstr "找不到“ {{- searchTerm}}”的事件数据项" msgid "No program indicators found for \"{{- searchTerm}}\"" -msgstr "找不到“ {{-searchTerm}}”的计划指标" +msgstr "找不到“ {{- searchTerm}}”的计划指标" + +msgid "No calculations found for \"{{- searchTerm}}\"" +msgstr "找不到“{{- searchTerm}}”的计算" msgid "Nothing found for \"{{- searchTerm}}\"" -msgstr "找不到“ {{-searchTerm}}”" +msgstr "找不到“ {{- searchTerm}}”" + +msgid "Calculation" +msgstr "计算" msgid "Metric type" msgstr "尺度类型" @@ -211,9 +284,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "此{{fileType}}和相关解释将被删除。继续?" -msgid "Cancel" -msgstr "取消" - msgid "Delete" msgstr "删除" @@ -265,8 +335,8 @@ msgstr "描述" msgid "Rename" msgstr "改名" -msgid "{{objectName}} (copy)" -msgstr "{{objectName}}(副本)" +msgid "{{- objectName}} (copy)" +msgstr "{{- objectName}}(复制)" msgid "Save {{fileType}} as" msgstr "将{{fileType}}另存为" @@ -292,6 +362,9 @@ msgstr "书写应答" msgid "Post reply" msgstr "发表回复" +msgid "Delete failed" +msgstr "删除失败" + msgid "Could not update comment" msgstr "无法更新评论" @@ -302,7 +375,7 @@ msgid "Update" msgstr "更新" msgid "Viewing interpretation: {{- visualisationName}}" -msgstr "查看注释:{{-visualisationName}}" +msgstr "查看注释:{{- visualisationName}}" msgid "Could not load interpretation" msgstr "无法加载解释" @@ -318,27 +391,41 @@ msgstr "隐藏解释" msgid "Write an interpretation" msgstr "书写注释" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "将来查看此解释的其他人可能会看到更多数据。" + msgid "Post interpretation" msgstr "后解释" msgid "Interpretations" msgstr "解释" +msgid "Reply" +msgstr "应答" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "{{count}}条回复" + +msgid "View replies" +msgstr "查看回复" + msgid "Unlike" msgstr "不喜欢" msgid "Like" msgstr "喜欢" -msgid "Reply" -msgstr "应答" +msgid "See interpretation" +msgstr "见解释" + +msgid "Open in app" +msgstr "在应用程序中打开" msgid "Share" msgstr "分享" -msgid "See interpretation" -msgstr "见解释" - msgid "Manage sharing" msgstr "管理共享" @@ -348,39 +435,6 @@ msgstr "无法更新解释" msgid "Enter interpretation text" msgstr "输入解释文本" -msgid "Bold text" -msgstr "粗体文字" - -msgid "Italic text" -msgstr "斜体文字" - -msgid "Link to a URL" -msgstr "链接到 URL" - -msgid "Mention a user" -msgstr "提及用户" - -msgid "Add emoji" -msgstr "添加表情符号" - -msgid "Preview" -msgstr "预览" - -msgid "Back to write mode" -msgstr "返回写入模式" - -msgid "Too many results. Try refining the search." -msgstr "结果太多。尝试优化搜索。" - -msgid "Search for a user" -msgstr "搜索用户" - -msgid "Searching for \"{{- searchText}}\"" -msgstr "搜索“{{- searchText}}”" - -msgid "No results found" -msgstr "没有结果" - msgid "Not available offline" msgstr "离线不可用" @@ -568,60 +622,18 @@ msgstr "选择年份" msgid "Period" msgstr "期间" +msgid "Selected Periods" +msgstr "选择的期间" + msgid "Relative periods" msgstr "相对期间" msgid "Fixed periods" msgstr "固定期间" -msgid "Selected Periods" -msgstr "选择的期间" - msgid "No periods selected" msgstr "未选择期间" -msgid "January" -msgstr "1月" - -msgid "February" -msgstr "2月" - -msgid "March" -msgstr "3月" - -msgid "April" -msgstr "4月" - -msgid "May" -msgstr "5月" - -msgid "June" -msgstr "6月" - -msgid "July" -msgstr "7月" - -msgid "August" -msgstr "8月" - -msgid "September" -msgstr "9月" - -msgid "October" -msgstr "10月" - -msgid "November" -msgstr "11月" - -msgid "December" -msgstr "12月" - -msgid "Week {{weekNumber}}" -msgstr "{{weekNumber}}周" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr " {{biWeekNumber}} 两周" - msgid "Daily" msgstr "每日" @@ -665,13 +677,13 @@ msgid "Financial year (Start November)" msgstr "财政年(11月始)" msgid "Financial year (Start October)" -msgstr "财务十月" +msgstr "财政年度(10 月开始)" msgid "Financial year (Start July)" -msgstr "财务七月" +msgstr "财政年度(7 月开始)" msgid "Financial year (Start April)" -msgstr "财务四月" +msgstr "财政年度(4 月开始)" msgid "Today" msgstr "今天" @@ -707,16 +719,16 @@ msgid "Last week" msgstr "上周" msgid "Last 4 weeks" -msgstr "最近四周" +msgstr "最近 4 周" msgid "Last 12 weeks" -msgstr "最近12周" +msgstr "最近 12 周" msgid "Last 52 weeks" -msgstr "Last 52 weeks" +msgstr "最近52 周" msgid "Weeks this year" -msgstr "Weeks this year" +msgstr "今年的周" msgid "This bi-week" msgstr "本双周" @@ -737,7 +749,7 @@ msgid "Last 3 months" msgstr "最近3个月" msgid "Last 6 months" -msgstr "Last 6 months" +msgstr "最近 6 个月" msgid "Last 12 months" msgstr "最近12月" @@ -749,13 +761,13 @@ msgid "This bi-month" msgstr "本双月" msgid "Last bi-month" -msgstr "Last bi-month" +msgstr "上两个月" msgid "Last 6 bi-months" -msgstr "Last 6 bi-months" +msgstr "最近 6 个双月" msgid "Bi-months this year" -msgstr "Bi-months this year" +msgstr "今年的双月" msgid "This quarter" msgstr "本季度" @@ -764,7 +776,7 @@ msgid "Last quarter" msgstr "最近一季" msgid "Last 4 quarters" -msgstr "最近四个季度" +msgstr "最近 4 个季度" msgid "Quarters this year" msgstr "今年的季度" @@ -785,7 +797,7 @@ msgid "Last financial year" msgstr "上一财政年" msgid "Last 5 financial years" -msgstr "最近五个财政年" +msgstr "最近 5 个财政年度" msgid "This year" msgstr "今年" @@ -812,20 +824,47 @@ msgid "Months" msgstr "月" msgid "Bi-months" -msgstr "Bi-months" +msgstr "双月" msgid "Quarters" msgstr "四分之一" msgid "Six-months" -msgstr "Six-months" +msgstr "六个月" msgid "Financial Years" -msgstr "Financial Years" +msgstr "财政年度" msgid "Years" msgstr "年" +msgid "Value: {{value}}" +msgstr "值{{value}}" + +msgid "Bold text" +msgstr "粗体文字" + +msgid "Italic text" +msgstr "斜体文字" + +msgid "Link to a URL" +msgstr "链接到 URL" + +msgid "Mention a user" +msgstr "提及用户" + +msgid "Add emoji" +msgstr "添加表情符号" + +msgid "Preview" +msgstr "预览" + +msgid "Back to write mode" +msgstr "返回写入模式" + +msgid "Interpretations and details" +msgstr "解释和细节" + msgid "Translating to" msgstr "翻译成" @@ -853,6 +892,18 @@ msgstr "无法加载翻译" msgid "Retry" msgstr "重试" +msgid "Too many results. Try refining the search." +msgstr "结果太多。尝试优化搜索。" + +msgid "Search for a user" +msgstr "搜索用户" + +msgid "Searching for \"{{- searchText}}\"" +msgstr "搜索“{{- searchText}}”" + +msgid "No results found" +msgstr "没有结果" + msgid "Series" msgstr "系列" @@ -910,9 +961,6 @@ msgstr "找不到指标组" msgid "Loading indicator groups" msgstr "加载指标组" -msgid "Data elements" -msgstr "数据元" - msgid "Data element group" msgstr "数据元组" @@ -958,6 +1006,33 @@ msgstr "项目指标" msgid "Program indicator" msgstr "项目指标" +msgid "Calculations" +msgstr "计算" + +msgid "Number" +msgstr "数据" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "公式为空。将左侧列表中的项目添加到公式中。" + +msgid "Consecutive math operators" +msgstr "连续的数学运算符" + +msgid "Consecutive data elements" +msgstr "连续的数据元素" + +msgid "Starts or ends with a math operator" +msgstr "以数学运算符开始或结束" + +msgid "Empty parentheses" +msgstr "空括号" + +msgid "Missing right parenthesis )" +msgstr "缺少右括号 )" + +msgid "Missing left parenthesis (" +msgstr "缺少左括号 (" + msgid "Extra Small" msgstr "特小" @@ -1036,6 +1111,9 @@ msgstr "{{thresholdFactor}}×Z分数低" msgid "{{thresholdFactor}} × Z-score high" msgstr "{{thresholdFactor}}×Z分数高" +msgid "Not applicable" +msgstr "不适用" + msgid "Data" msgstr "数据" @@ -1088,11 +1166,14 @@ msgid "Radar" msgstr "雷达图" msgid "Scatter" -msgstr "分散" +msgstr "散点图" msgid "Single value" msgstr "单个值" +msgid "Outlier table" +msgstr "异常值表" + msgid "All charts" msgstr "所有图表" diff --git a/i18n/zh_CN.po b/i18n/zh_CN.po index e6138e1f0..654ffecea 100644 --- a/i18n/zh_CN.po +++ b/i18n/zh_CN.po @@ -1,15 +1,15 @@ # # Translators: -# 晓东 林 <13981924470@126.com>, 2022 -# easylin , 2022 +# 晓东 林 <13981924470@126.com>, 2023 +# easylin , 2023 # msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-08-22T09:12:05.760Z\n" +"POT-Creation-Date: 2023-09-27T14:15:13.876Z\n" "PO-Revision-Date: 2020-04-28 22:05+0000\n" -"Last-Translator: easylin , 2022\n" -"Language-Team: Chinese (China) (https://www.transifex.com/hisp-uio/teams/100509/zh_CN/)\n" +"Last-Translator: easylin , 2023\n" +"Language-Team: Chinese (China) (https://app.transifex.com/hisp-uio/teams/100509/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -78,12 +78,47 @@ msgid "This app could not retrieve required data." msgstr "" msgid "Network error" +msgstr "网络错误" + +msgid "Data / Edit calculation" msgstr "" -msgid "Data Type" +msgid "Data / New calculation" msgstr "" -msgid "All types" +msgid "Remove item" +msgstr "" + +msgid "Check formula" +msgstr "" + +msgid "Calculation name" +msgstr "" + +msgid "Shown in table headers and chart axes/legends" +msgstr "" + +msgid "Delete calculation" +msgstr "" + +msgid "Cancel" +msgstr "取消" + +msgid "The calculation can only be saved with a valid formula" +msgstr "" + +msgid "Add a name to save this calculation" +msgstr "" + +msgid "Save calculation" +msgstr "" + +msgid "" +"Are you sure you want to delete this calculation? It may be used by other " +"visualizations." +msgstr "" + +msgid "Yes, delete" msgstr "" msgid "Totals only" @@ -92,15 +127,41 @@ msgstr "" msgid "Details only" msgstr "" +msgid "Loading" +msgstr "载入" + +msgid "Data elements" +msgstr "数据元" + +msgid "Search by data element name" +msgstr "" + +msgid "No data elements found for \"{{- searchTerm}}\"" +msgstr "" + +msgid "No data elements found" +msgstr "" + +msgid "" +"Drag items here, or double click in the list, to start building a " +"calculation formula" +msgstr "" + +msgid "Math operators" +msgstr "" + +msgid "Data Type" +msgstr "" + +msgid "All types" +msgstr "" + msgid "Disaggregation" msgstr "分解" msgid "No data" msgstr "无数据" -msgid "Loading" -msgstr "载入" - msgid "Search by data item name" msgstr "" @@ -113,9 +174,6 @@ msgstr "" msgid "No indicators found" msgstr "" -msgid "No data elements found" -msgstr "" - msgid "No data sets found" msgstr "" @@ -128,9 +186,6 @@ msgstr "" msgid "No indicators found for \"{{- searchTerm}}\"" msgstr "" -msgid "No data elements found for \"{{- searchTerm}}\"" -msgstr "" - msgid "No data sets found for \"{{- searchTerm}}\"" msgstr "" @@ -143,6 +198,9 @@ msgstr "" msgid "Nothing found for \"{{- searchTerm}}\"" msgstr "" +msgid "Calculation" +msgstr "" + msgid "Metric type" msgstr "" @@ -209,9 +267,6 @@ msgid "" "This {{fileType}} and related interpretations will be deleted. Continue?" msgstr "" -msgid "Cancel" -msgstr "取消" - msgid "Delete" msgstr "删除" @@ -263,6 +318,9 @@ msgstr "描述" msgid "Rename" msgstr "重命名" +msgid "{{- objectName}} (copy)" +msgstr "" + msgid "Save {{fileType}} as" msgstr "" @@ -287,6 +345,9 @@ msgstr "" msgid "Post reply" msgstr "" +msgid "Delete failed" +msgstr "删除失败" + msgid "Could not update comment" msgstr "" @@ -313,21 +374,32 @@ msgstr "" msgid "Write an interpretation" msgstr "" +msgid "" +"Other people viewing this interpretation in the future may see more data." +msgstr "" + msgid "Post interpretation" msgstr "" msgid "Interpretations" msgstr "注释" +msgid "Reply" +msgstr "回复" + +msgid "{{count}} replies" +msgid_plural "{{count}} replies" +msgstr[0] "" + +msgid "View replies" +msgstr "" + msgid "Unlike" msgstr "" msgid "Like" msgstr "Like" -msgid "Reply" -msgstr "回复" - msgid "Share" msgstr "分享" @@ -376,6 +448,9 @@ msgstr "" msgid "No results found" msgstr "没有结果" +msgid "Not available offline" +msgstr "" + msgid "Created by" msgstr "创建自" @@ -525,10 +600,10 @@ msgid_plural "{{count}} groups" msgstr[0] "" msgid "Selected: {{commaSeparatedListOfOrganisationUnits}}" -msgstr "" +msgstr "已选择:{{commaSeparatedListOfOrganisationUnits}}" msgid "Nothing selected" -msgstr "" +msgstr "未选择任何内容" msgid "User organisation unit" msgstr "用户所在机构" @@ -540,7 +615,7 @@ msgid "User sub-x2-units" msgstr "二级下属机构" msgid "Select a level" -msgstr "" +msgstr "选择一个等级" msgid "Select a group" msgstr "" @@ -572,48 +647,6 @@ msgstr "" msgid "No periods selected" msgstr "" -msgid "January" -msgstr "01" - -msgid "February" -msgstr "02" - -msgid "March" -msgstr "03" - -msgid "April" -msgstr "04" - -msgid "May" -msgstr "05" - -msgid "June" -msgstr "06" - -msgid "July" -msgstr "07" - -msgid "August" -msgstr "08" - -msgid "September" -msgstr "09" - -msgid "October" -msgstr "10" - -msgid "November" -msgstr "11" - -msgid "December" -msgstr "12" - -msgid "Week {{weekNumber}}" -msgstr "" - -msgid "Bi-Week {{biWeekNumber}}" -msgstr "" - msgid "Daily" msgstr "每日" @@ -818,6 +851,9 @@ msgstr "" msgid "Years" msgstr "年" +msgid "Interpretations and details" +msgstr "" + msgid "Translating to" msgstr "" @@ -836,6 +872,9 @@ msgstr "" msgid "Save translations" msgstr "" +msgid "Cannot save while offline" +msgstr "" + msgid "Could not load translations" msgstr "" @@ -899,9 +938,6 @@ msgstr "" msgid "Loading indicator groups" msgstr "" -msgid "Data elements" -msgstr "数据元" - msgid "Data element group" msgstr "数据元组" @@ -947,6 +983,33 @@ msgstr "项目指标" msgid "Program indicator" msgstr "项目指标" +msgid "Calculations" +msgstr "" + +msgid "Number" +msgstr "数字" + +msgid "Formula is empty. Add items to the formula from the lists on the left." +msgstr "" + +msgid "Consecutive math operators" +msgstr "" + +msgid "Consecutive data elements" +msgstr "" + +msgid "Starts or ends with a math operator" +msgstr "" + +msgid "Empty parentheses" +msgstr "" + +msgid "Missing right parenthesis )" +msgstr "" + +msgid "Missing left parenthesis (" +msgstr "" + msgid "Extra Small" msgstr "" diff --git a/jest.config.js b/jest.config.js index 83db82633..59289738e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,7 @@ module.exports = { testPathIgnorePatterns: ['/node_modules/', '/build/'], - setupFilesAfterEnv: ['/config/setupEnzyme.js'], + setupFilesAfterEnv: [ + '/config/setupEnzyme.js', + '/config/setupTestingLibrary.js', + ], } diff --git a/package.json b/package.json index 60957a294..300a1122c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dhis2/analytics", - "version": "24.3.5", + "version": "26.9.1", "main": "./build/cjs/index.js", "module": "./build/es/index.js", "exports": { @@ -20,7 +20,6 @@ }, "scripts": { "build": "d2-app-scripts build", - "postbuild": "yarn build-storybook", "build-storybook": "build-storybook", "start-storybook": "start-storybook --port 5000", "start": "yarn start-storybook", @@ -31,43 +30,53 @@ "validate-push": "yarn test" }, "devDependencies": { - "@dhis2/app-runtime": "^3.4.4", + "@dhis2/app-runtime": "^3.9.0", "@dhis2/cli-app-scripts": "^9.0.1", "@dhis2/cli-style": "^10.4.1", "@dhis2/d2-i18n": "^1.1.0", - "@dhis2/ui": "^8.4.11", + "@dhis2/ui": "^9.4.4", "@sambego/storybook-state": "^2.0.1", - "@storybook/addons": "^6.5.9", + "@storybook/addons": "^6.5.16", "@storybook/preset-create-react-app": "^3.1.7", - "@storybook/react": "^6.1.14", + "@storybook/react": "^6.5.16", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^12.1.5", "enzyme": "^3.9.0", "enzyme-adapter-react-16": "^1.15.6", "fs-extra": "^10.1.0", "jest-enzyme": "^7.0.2", "prop-types": "^15", - "styled-jsx": "^4.0.1", - "typeface-roboto": "^0.0.75" + "styled-jsx": "^4.0.1" }, "peerDependencies": { "@dhis2/app-runtime": "^3", "@dhis2/d2-i18n": "^1.1", - "@dhis2/ui": "^8.2.5", + "@dhis2/ui": "^9.2.0", "prop-types": "^15", "react": "^16.3", "react-dom": "^16.3", "styled-jsx": "^4.0.1" }, "dependencies": { - "@dhis2/d2-ui-rich-text": "^7.4.0", + "@dhis2/multi-calendar-dates": "^1.2.2", + "@dnd-kit/core": "^6.0.7", + "@dnd-kit/sortable": "^7.0.2", + "@dnd-kit/utilities": "^3.2.1", + "@react-hook/debounce": "^4.0.0", "classnames": "^2.3.1", + "crypto-js": "^4.2.0", "d2-utilizr": "^0.2.16", "d3-color": "^1.2.3", - "highcharts": "^10.2.0", + "highcharts": "^10.3.3", "lodash": "^4.17.21", + "markdown-it": "^13.0.1", "mathjs": "^9.4.2", "react-beautiful-dnd": "^10.1.1", "resize-observer-polyfill": "^1.5.1" }, + "resolutions": { + "@dhis2/ui": "^9.2.0" + }, "files": [ "build" ] diff --git a/src/__demo__/CalculationModal.stories.js b/src/__demo__/CalculationModal.stories.js new file mode 100644 index 000000000..7c4debf4c --- /dev/null +++ b/src/__demo__/CalculationModal.stories.js @@ -0,0 +1,322 @@ +import { CustomDataProvider } from '@dhis2/app-runtime' +import { storiesOf } from '@storybook/react' +import React from 'react' +import CalculationModal from '../components/DataDimension/Calculation/CalculationModal.js' + +const DATA_ELEMENTS = { + pager: { + page: 1, + total: 622, + pageSize: 50, + nextPage: + 'http://localhost:8080/api/39/dataElements?page=2&filter=domainType%3Aeq%3AAGGREGATE&paging=true&fields=dimensionItem%7Erename%28id%29%2CdisplayName%7Erename%28name%29%2CdimensionItemType&order=displayName%3Aasc', + pageCount: 13, + }, + dataElements: [ + { + dimensionItemType: 'DATA_ELEMENT', + id: 'fbfJHSPpUQD', + name: 'ANC 1st visit', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'cYeuwXTCPkU', + name: 'ANC 2nd visit', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'Jtf34kNZhzP', + name: 'ANC 3rd visit', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'hfdmMSPBgLG', + name: 'ANC 4th or more visits', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'FHD3wiSM7Sn', + name: 'ARI treated with antibiotics (pneumonia) follow-up', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'oLfWYAJhZb2', + name: 'ARI treated without antibiotics (cough) referrals', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'GMd99K8gVut', + name: 'ART No clients who stopped TRT due to TRT failure', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'wfKKFhBn0Q0', + name: 'ART No clients who stopped TRT due to adverse clinical status/event', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'aIJZ2d2QgVV', + name: 'ART defaulters', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'BOSZApCrBni', + name: 'ART enrollment stage 1', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'dGdeotKpRed', + name: 'ART enrollment stage 2', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'LVaUdM3CERi', + name: 'ART entry point: No old patients', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'M62VHgYT2n0', + name: 'Acute Flaccid Paralysis (AFP) referrals', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'uF1DLnZNlWe', + name: 'Additional notes related to facility', + }, + + { + dimensionItemType: 'DATA_ELEMENT', + id: 'jmWyJFtE7Af', + name: 'Anaemia follow-up', + }, + { + dimensionItemType: 'DATA_ELEMENT', + id: 'HLPuaFB7Frw', + name: 'Anaemia new', + }, + ], +} + +const DATA_ELEMENT_OPERANDS = { + pager: { + page: 1, + pageCount: 43, + total: 2122, + pageSize: 50, + nextPage: + 'https://debug.dhis2.org/dev/api/dataElementOperands.json?page=2', + }, + dataElementOperands: [ + { + dimensionItemType: 'DATA_ELEMENT_OPERAND', + id: 'fbfJHSPpUQD.pq2XI5kz2BY', + name: 'ANC 1st visit Fixed', + }, + { + dimensionItemType: 'DATA_ELEMENT_OPERAND', + id: 'fbfJHSPpUQD.PT59n8BQbqM', + name: 'ANC 1st visit Outreach', + }, + ], +} + +const DATA_ELEMENT_GROUPS = { + dataElementGroups: [ + { id: 'qfxEYY9xAl6', name: 'ANC' }, + { id: 'yhg8oYU9ekY', name: 'ARI Treated Without Antibiotics (Cough)' }, + { id: 'M2cth8EmrlT', name: 'ARI treated with antibiotics (Pneumonia)' }, + { id: 'k1M0nuodfhN', name: 'ART' }, + { id: 'bdiyMm9qZl5', name: 'ART enrollment' }, + { id: 's8FiXqB2DhB', name: 'ART entry points' }, + { id: 'TcxHxMlYzpv', name: 'ART pediatric 1st line' }, + { id: 'vxIWSNeEcf7', name: 'ART staging' }, + { id: 'zz1lNBgRKWU', name: 'ART treatment' }, + { id: 'oDkJh5Ddh7d', name: 'Acute Flaccid Paralysis (AFP) ' }, + { id: 'GBHN1a1Jddh', name: 'All Others' }, + { id: 'KmwPVkjp7yl', name: 'Anaemia' }, + { id: 'oGktdmYkRNo', name: 'Burns' }, + { id: 'KUSvwZQsMSN', name: 'Cholera' }, + { id: 'Euvh58hLl61', name: 'Clinical Malnutrition' }, + { id: 'Svac1cNQhRS', name: 'Commodities' }, + { id: 'KJKWrWBcJdf', name: 'Commodities Child Health' }, + { id: 'idD1wcvBISQ', name: 'Commodities Maternal Health' }, + { id: 'rioWDAi1S7z', name: 'Commodities Newborn Health' }, + { id: 'IyIa0h8CbCZ', name: 'Commodities Reproductive Health' }, + { id: 'PfJGQacYpjn', name: 'Deaths' }, + { id: 't5W0AAqvK5b', name: 'Delivery' }, + { id: 'mcjC3qZgIkO', name: 'Diarrhoea With Blood (Dysentery)' }, + { id: 'RSFc8ADyKTw', name: 'Diarrhoea With Severe Dehydration' }, + { id: 'kE8lP5t0b5R', name: 'Diarrhoea Without Severe Dehydration' }, + { id: 'qiF051Ue9Ei', name: 'Emergency Response' }, + { id: 'GbSz3TobZcc', name: 'Expenditures' }, + { id: 'lLKpwhjd1dM', name: 'Eye Infection' }, + { id: 'Sp1jJqzsiOi', name: 'Facility infrastructure' }, + { id: 'g50BzGAsrvu', name: 'Follow-up' }, + { id: 'URmi41e0SFH', name: 'HIV Care' }, + { id: 'ID4BbhF7Eli', name: 'HIV Peadriatics' }, + { id: 'HKU7L73im5r', name: 'HIV/AIDS' }, + { id: 'jWgEsdH87Jk', name: 'Hypertension' }, + { id: 'nb3rBNvVHtp', name: 'ICS Children' }, + { id: 'dMyLpSQn6hu', name: 'ICS mother' }, + { id: 'b3gDdvmrSFc', name: 'IDSR' }, + { id: 'h9cuJOkOwY2', name: 'Immunization' }, + { id: 'OP4dLqk0JTH', name: 'Inpatient morbidity/mortality aggregates' }, + { id: 'SriP0jBXMr6', name: 'Lassa Fever' }, + { id: 'U0uJG4kydwE', name: 'Leprosy' }, + { id: 'eeQCyjnMyGY', name: 'Low birth' }, + { id: 'LEet4tb49IP', name: 'MNCH Aggregates' }, + { id: 'TzwKbcw1nUK', name: 'Malaria' }, + { id: 'qk2KOBMX4Mf', name: 'Measles' }, + { id: 'lnLbEej0gwe', name: 'Meningitis / Severe Bacterial Infection' }, + { id: 'SLsJy3zqUbD', name: 'Morbidity' }, + { id: 'QAc5FhbeFwl', name: 'Mortality' }, + { id: 'rPGfUFYbcfJ', name: 'Mortality < 5 years' }, + { id: 'KU0wDurtWDM', name: 'Mortality Narrative' }, + { id: 'UAEhIWpoQFN', name: 'Neonatal Tetanus' }, + { id: 'weRMUzBs8T7', name: 'New cases' }, + { id: 'XGSHYf5uOlJ', name: 'New on ART' }, + { id: 'u1ilfnoYafG', name: 'Nutrition' }, + { id: 'HDdnX6XqxIn', name: 'Onchocerciasis' }, + { id: 'JZ3usxLEcc9', name: 'Otitis Media' }, + { id: 'WS3MniopkOQ', name: 'PMTCT' }, + { id: 'e5NGCRQR8Yo', name: 'PMTCT ANC' }, + { id: 'bXpe2ByvlFR', name: 'PMTCT Maternity/Delivery' }, + { id: 'sGLusXgmaOT', name: 'PMTCT Postnatal' }, + { id: 'sP7jTt3YGBb', name: 'Population Estimates' }, + { id: 'ubJrVb4v5xy', name: 'Postnatal' }, + { id: 'qkrZMU4Y2h5', name: 'Pregnancy complications and deaths' }, + { id: 'ZPtRFVLY40u', name: 'Pregnancy-related (PHUF5)' }, + { id: 'AiytigJkHP6', name: 'Prev month on ART' }, + { id: 'UWaMbg9h7vF', name: 'Referrals' }, + { id: 'OJxi4vkcTBS', name: 'Reproductive health' }, + { id: 'xNrDrDbJgnm', name: 'STI - Genital Discharge' }, + { id: 'UmyRWILcoed', name: 'STI - Genital Ulcer' }, + { id: 'LqG1FnAUhyb', name: 'Schistosomiasis' }, + { id: 'rwG73cCi66Z', name: 'Shift from ART reg.' }, + { id: 'rgTZ4mKjZza', name: 'Shift to ART reg.' }, + { id: 'VCoSeRRVS1n', name: 'Skin Infection' }, + { id: 'rVEe5QNBgDX', name: 'Staffing' }, + { id: 'pxWhf42tCIs', name: 'Stock PHU' }, + { id: 'OnAQ2lsilN9', name: 'TB' }, + { id: 'LgtuBcNaMB3', name: 'Tetanus' }, + { id: 'yHtsPZqpAxm', name: 'Tuberculosis' }, + { id: 'dUK38PhdUdV', name: 'Typhoid Fever' }, + { id: 'U9wcARyKSzx', name: 'VCCT' }, + { id: 'LzDaTmQYWcj', name: 'Worm Infestation' }, + { id: 'IUZ0GidX0jh', name: 'Wounds/Trauma' }, + { id: 'zmWJAEjfv59', name: 'Yaws' }, + { id: 'HAraPb0v7ex', name: 'Yellow Fever' }, + ], +} + +const calculation = { + id: 'calculationid', + name: 'My calculation', + expression: '#{fbfJHSPpUQD}/10*#{hfdmMSPBgLG}', +} + +const calculationWithOperand = { + id: 'calcid2', + name: 'Calculation with operand', + expression: '#{cYeuwXTCPkU}*10-#{fbfJHSPpUQD.pq2XI5kz2BY}', +} + +storiesOf('CalculationModal', module) + .add('Default', () => { + return ( + + + + ) + }) + .add('With calculation', () => { + return ( + + + + ) + }) + .add('With calculation containing operand', () => { + return ( + + + + ) + }) + .add('No available data', () => { + return ( + + + + ) + }) diff --git a/src/__demo__/DimensionsPanel.stories.js b/src/__demo__/DimensionsPanel.stories.js index 6a3fbc6de..71cc1abc6 100644 --- a/src/__demo__/DimensionsPanel.stories.js +++ b/src/__demo__/DimensionsPanel.stories.js @@ -94,6 +94,7 @@ storiesOf('DimensionsPanel', module).add('locked dimension', () => { dimension === DIMENSION_ID_DATA} /> ) diff --git a/src/__demo__/FileMenu.stories.js b/src/__demo__/FileMenu.stories.js index f8b821002..98092feac 100644 --- a/src/__demo__/FileMenu.stories.js +++ b/src/__demo__/FileMenu.stories.js @@ -2,6 +2,7 @@ import { Provider } from '@dhis2/app-runtime' import { storiesOf } from '@storybook/react' import React from 'react' import { FileMenu } from '../components/FileMenu/FileMenu.js' +import { HoverMenuBar } from '../components/Toolbar/index.js' const configMock = { baseUrl: 'http://localhost:8080', @@ -61,24 +62,30 @@ const visReadonlyObject = { storiesOf('FileMenu', module) .add('Simple', () => ( - + + + )) .add('With AO', () => ( - + + + )) .add('With readonly AO', () => ( - + + + )) diff --git a/src/__demo__/InterpretationsUnit.stories.js b/src/__demo__/InterpretationsUnit.stories.js new file mode 100644 index 000000000..f1c786f57 --- /dev/null +++ b/src/__demo__/InterpretationsUnit.stories.js @@ -0,0 +1,51 @@ +import { CustomDataProvider } from '@dhis2/app-runtime' +import { storiesOf } from '@storybook/react' +import React from 'react' +import { InterpretationsUnit } from '../components/Interpretations/InterpretationsUnit/index.js' + +storiesOf('IntepretationsUnit', module).add('Default', () => { + return ( + + + + ) +}) + +storiesOf('IntepretationsUnit', module).add( + 'With no time dimensions warning', + () => { + return ( + + + + ) + } +) diff --git a/src/__demo__/OrgUnitDimension.stories.js b/src/__demo__/OrgUnitDimension.stories.js index 82586c35e..533eb356b 100644 --- a/src/__demo__/OrgUnitDimension.stories.js +++ b/src/__demo__/OrgUnitDimension.stories.js @@ -4,7 +4,10 @@ import React, { useState } from 'react' import OrgUnitDimension from '../components/OrgUnitDimension/OrgUnitDimension.js' const Wrapper = (story) => ( - + {story()} ) @@ -134,3 +137,81 @@ storiesOf('OrgUnitDimension', module) /> ) }) + +storiesOf('OrgUnitDimension', module) + .addDecorator(Wrapper) + .add('Without user org units selection', () => { + const [selected, setSelected] = useState([]) + + return ( + setSelected(response.items)} + roots={defaultRootOrgUnits} + /> + ) + }) + +storiesOf('OrgUnitDimension', module) + .addDecorator(Wrapper) + .add('Without level selector', () => { + const [selected, setSelected] = useState([]) + + return ( + setSelected(response.items)} + roots={defaultRootOrgUnits} + /> + ) + }) + +storiesOf('OrgUnitDimension', module) + .addDecorator(Wrapper) + .add('Without group selector', () => { + const [selected, setSelected] = useState([]) + + return ( + setSelected(response.items)} + roots={defaultRootOrgUnits} + /> + ) + }) + +storiesOf('OrgUnitDimension', module) + .addDecorator(Wrapper) + .add('Without level and group selector', () => { + const [selected, setSelected] = useState([]) + + return ( + setSelected(response.items)} + roots={defaultRootOrgUnits} + /> + ) + }) + +storiesOf('OrgUnitDimension', module) + .addDecorator(Wrapper) + .add('Without level and group selector, with warning text', () => { + const [selected, setSelected] = useState([]) + + return ( + setSelected(response.items)} + roots={defaultRootOrgUnits} + warning={'No org. units selected'} + /> + ) + }) diff --git a/src/__demo__/PivotTable.stories.js b/src/__demo__/PivotTable.stories.js index b4c46f346..93ca49ae9 100644 --- a/src/__demo__/PivotTable.stories.js +++ b/src/__demo__/PivotTable.stories.js @@ -784,6 +784,26 @@ storiesOf('PivotTable', module).add( } ) +storiesOf('PivotTable', module).add( + 'cumulative + empty columns (weekly) - shown', + (_, { pivotTableOptions }) => { + const visualization = { + ...weeklyColumnsVisualization, + ...pivotTableOptions, + hideEmptyColumns: false, + cumulativeValues: true, + } + return ( +
+ +
+ ) + } +) + storiesOf('PivotTable', module).add( 'empty columns (weekly) - hidden', (_, { pivotTableOptions }) => { @@ -803,6 +823,26 @@ storiesOf('PivotTable', module).add( } ) +storiesOf('PivotTable', module).add( + 'cumulative + empty columns (weekly) - hidden', + (_, { pivotTableOptions }) => { + const visualization = { + ...weeklyColumnsVisualization, + ...pivotTableOptions, + hideEmptyColumns: true, + cumulativeValues: true, + } + return ( +
+ +
+ ) + } +) + storiesOf('PivotTable', module).add( 'empty columns + assigned cats (shown)', (_, { pivotTableOptions }) => { @@ -1119,3 +1159,44 @@ storiesOf('PivotTable', module).add('DEGS', (_, { pivotTableOptions }) => { ) }) + +storiesOf('PivotTable', module).add( + 'Truncated header cell', + (_, { pivotTableOptions }) => { + const widths = [250, 200, 500] + const [width, setWidth] = useState(250) + const toggleWidth = () => + setWidth( + (currentWidth) => + widths[widths.indexOf(currentWidth) + 1] ?? widths[0] + ) + const visualization = { + ...narrativeVisualization, + ...visualizationReset, + ...pivotTableOptions, + columns: narrativeVisualization.filters, + filters: narrativeVisualization.columns, + rowTotals: true, + colTotals: true, + } + + const data = { + ...narrativeData, + rows: [narrativeData.rows[0]], + } + + return ( +
+ + +
+ ) + } +) diff --git a/src/__demo__/SingleValue.stories.js b/src/__demo__/SingleValue.stories.js new file mode 100644 index 000000000..c47b82cbd --- /dev/null +++ b/src/__demo__/SingleValue.stories.js @@ -0,0 +1,802 @@ +import { storiesOf } from '@storybook/react' +import React, { useState, useMemo, useRef, useEffect, useCallback } from 'react' +import { createVisualization } from '../index.js' +const constainerStyleBase = { + width: 800, + height: 800, + border: '1px solid magenta', + marginBottom: 14, +} +const innerContainerStyle = { + overflow: 'hidden', + display: 'flex', + justifyContent: 'center', + height: '100%', +} + +const baseDataObj = { + response: { + headers: [ + { + name: 'dx', + column: 'Data', + valueType: 'TEXT', + type: 'java.lang.String', + hidden: false, + meta: true, + }, + { + name: 'value', + column: 'Value', + valueType: 'NUMBER', + type: 'java.lang.Double', + hidden: false, + meta: false, + }, + ], + metaData: { + items: { + 202308: { + uid: '202308', + code: '202308', + name: 'August 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-08-01T00:00:00.000', + endDate: '2023-08-31T00:00:00.000', + }, + 202309: { + uid: '202309', + code: '202309', + name: 'September 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-09-01T00:00:00.000', + endDate: '2023-09-30T00:00:00.000', + }, + 202310: { + uid: '202310', + code: '202310', + name: 'October 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-10-01T00:00:00.000', + endDate: '2023-10-31T00:00:00.000', + }, + 202311: { + uid: '202311', + code: '202311', + name: 'November 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-11-01T00:00:00.000', + endDate: '2023-11-30T00:00:00.000', + }, + 202312: { + uid: '202312', + code: '202312', + name: 'December 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-12-01T00:00:00.000', + endDate: '2023-12-31T00:00:00.000', + }, + 202401: { + uid: '202401', + code: '202401', + name: 'January 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-01-01T00:00:00.000', + endDate: '2024-01-31T00:00:00.000', + }, + 202402: { + uid: '202402', + code: '202402', + name: 'February 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-02-01T00:00:00.000', + endDate: '2024-02-29T00:00:00.000', + }, + 202403: { + uid: '202403', + code: '202403', + name: 'March 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-03-01T00:00:00.000', + endDate: '2024-03-31T00:00:00.000', + }, + 202404: { + uid: '202404', + code: '202404', + name: 'April 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-04-01T00:00:00.000', + endDate: '2024-04-30T00:00:00.000', + }, + 202405: { + uid: '202405', + code: '202405', + name: 'May 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-05-01T00:00:00.000', + endDate: '2024-05-31T00:00:00.000', + }, + 202406: { + uid: '202406', + code: '202406', + name: 'June 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-06-01T00:00:00.000', + endDate: '2024-06-30T00:00:00.000', + }, + 202407: { + uid: '202407', + code: '202407', + name: 'July 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-07-01T00:00:00.000', + endDate: '2024-07-31T00:00:00.000', + }, + ou: { + uid: 'ou', + name: 'Organisation unit', + dimensionType: 'ORGANISATION_UNIT', + }, + O6uvpzGd5pu: { + uid: 'O6uvpzGd5pu', + code: 'OU_264', + name: 'Bo', + dimensionItemType: 'ORGANISATION_UNIT', + valueType: 'TEXT', + totalAggregationType: 'SUM', + }, + LAST_12_MONTHS: { + name: 'Last 12 months', + }, + dx: { + uid: 'dx', + name: 'Data', + dimensionType: 'DATA_X', + }, + pe: { + uid: 'pe', + name: 'Period', + dimensionType: 'PERIOD', + }, + FnYCr2EAzWS: { + uid: 'FnYCr2EAzWS', + code: 'IN_52493', + name: 'BCG Coverage <1y', + legendSet: 'BtxOoQuLyg1', + dimensionItemType: 'INDICATOR', + valueType: 'NUMBER', + totalAggregationType: 'AVERAGE', + indicatorType: { + name: 'Per cent', + displayName: 'Per cent', + factor: 100, + number: false, + }, + }, + }, + dimensions: { + dx: ['FnYCr2EAzWS'], + pe: [ + '202308', + '202309', + '202310', + '202311', + '202312', + '202401', + '202402', + '202403', + '202404', + '202405', + '202406', + '202407', + ], + ou: ['O6uvpzGd5pu'], + co: [], + }, + }, + rowContext: {}, + rows: [['FnYCr2EAzWS', '34.19']], + width: 2, + height: 1, + headerWidth: 2, + }, + headers: [ + { + name: 'dx', + column: 'Data', + valueType: 'TEXT', + type: 'java.lang.String', + hidden: false, + meta: true, + isPrefix: false, + isCollect: false, + index: 0, + }, + { + name: 'value', + column: 'Value', + valueType: 'NUMBER', + type: 'java.lang.Double', + hidden: false, + meta: false, + isPrefix: false, + isCollect: false, + index: 1, + }, + ], + rows: [['FnYCr2EAzWS', '34.19']], + metaData: { + items: { + 202308: { + uid: '202308', + code: '202308', + name: 'August 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-08-01T00:00:00.000', + endDate: '2023-08-31T00:00:00.000', + }, + 202309: { + uid: '202309', + code: '202309', + name: 'September 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-09-01T00:00:00.000', + endDate: '2023-09-30T00:00:00.000', + }, + 202310: { + uid: '202310', + code: '202310', + name: 'October 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-10-01T00:00:00.000', + endDate: '2023-10-31T00:00:00.000', + }, + 202311: { + uid: '202311', + code: '202311', + name: 'November 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-11-01T00:00:00.000', + endDate: '2023-11-30T00:00:00.000', + }, + 202312: { + uid: '202312', + code: '202312', + name: 'December 2023', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2023-12-01T00:00:00.000', + endDate: '2023-12-31T00:00:00.000', + }, + 202401: { + uid: '202401', + code: '202401', + name: 'January 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-01-01T00:00:00.000', + endDate: '2024-01-31T00:00:00.000', + }, + 202402: { + uid: '202402', + code: '202402', + name: 'February 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-02-01T00:00:00.000', + endDate: '2024-02-29T00:00:00.000', + }, + 202403: { + uid: '202403', + code: '202403', + name: 'March 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-03-01T00:00:00.000', + endDate: '2024-03-31T00:00:00.000', + }, + 202404: { + uid: '202404', + code: '202404', + name: 'April 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-04-01T00:00:00.000', + endDate: '2024-04-30T00:00:00.000', + }, + 202405: { + uid: '202405', + code: '202405', + name: 'May 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-05-01T00:00:00.000', + endDate: '2024-05-31T00:00:00.000', + }, + 202406: { + uid: '202406', + code: '202406', + name: 'June 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-06-01T00:00:00.000', + endDate: '2024-06-30T00:00:00.000', + }, + 202407: { + uid: '202407', + code: '202407', + name: 'July 2024', + dimensionItemType: 'PERIOD', + valueType: 'TEXT', + totalAggregationType: 'SUM', + startDate: '2024-07-01T00:00:00.000', + endDate: '2024-07-31T00:00:00.000', + }, + ou: { + uid: 'ou', + name: 'Organisation unit', + dimensionType: 'ORGANISATION_UNIT', + }, + O6uvpzGd5pu: { + uid: 'O6uvpzGd5pu', + code: 'OU_264', + name: 'Bo', + dimensionItemType: 'ORGANISATION_UNIT', + valueType: 'TEXT', + totalAggregationType: 'SUM', + }, + LAST_12_MONTHS: { + name: 'Last 12 months', + }, + dx: { + uid: 'dx', + name: 'Data', + dimensionType: 'DATA_X', + }, + pe: { + uid: 'pe', + name: 'Period', + dimensionType: 'PERIOD', + }, + FnYCr2EAzWS: { + uid: 'FnYCr2EAzWS', + code: 'IN_52493', + name: 'BCG Coverage <1y', + legendSet: 'BtxOoQuLyg1', + dimensionItemType: 'INDICATOR', + valueType: 'NUMBER', + totalAggregationType: 'AVERAGE', + }, + }, + dimensions: { + dx: ['FnYCr2EAzWS'], + pe: [ + '202308', + '202309', + '202310', + '202311', + '202312', + '202401', + '202402', + '202403', + '202404', + '202405', + '202406', + '202407', + ], + ou: ['O6uvpzGd5pu'], + co: [], + }, + }, +} +const numberIndicatorType = { + name: 'Plain', + number: true, +} +const subtextIndicatorType = { + name: 'Custom', + displayName: 'Custom subtext', + number: true, +} +const percentIndicatorType = { + name: 'Per cent', + displayName: 'Per cent', + factor: 100, + number: false, +} +const layout = { + name: 'BCG coverage last 12 months - Bo', + created: '2013-10-16T19:50:52.464', + lastUpdated: '2021-07-06T12:53:57.296', + translations: [], + favorites: [], + lastUpdatedBy: { + id: 'xE7jOejl9FI', + code: null, + name: 'John Traore', + displayName: 'John Traore', + username: 'admin', + }, + regressionType: 'NONE', + displayDensity: 'NORMAL', + fontSize: 'NORMAL', + sortOrder: 0, + topLimit: 0, + hideEmptyRows: false, + showHierarchy: false, + completedOnly: false, + skipRounding: false, + dataDimensionItems: [ + { + indicator: { + name: 'BCG Coverage <1y', + dimensionItemType: 'INDICATOR', + displayName: 'BCG Coverage <1y', + access: { + manage: true, + externalize: true, + write: true, + read: true, + update: true, + delete: true, + }, + displayShortName: 'BCG Coverage <1y', + id: 'FnYCr2EAzWS', + }, + dataDimensionItemType: 'INDICATOR', + }, + ], + subscribers: [], + aggregationType: 'DEFAULT', + digitGroupSeparator: 'SPACE', + hideEmptyRowItems: 'NONE', + noSpaceBetweenColumns: false, + cumulativeValues: false, + percentStackedValues: false, + showData: true, + colTotals: false, + rowTotals: false, + rowSubTotals: false, + colSubTotals: false, + hideTitle: false, + hideSubtitle: false, + showDimensionLabels: false, + interpretations: [], + type: 'SINGLE_VALUE', + reportingParams: { + grandParentOrganisationUnit: false, + parentOrganisationUnit: false, + organisationUnit: false, + reportingPeriod: false, + }, + numberType: 'VALUE', + fontStyle: {}, + colorSet: 'DEFAULT', + yearlySeries: [], + regression: false, + hideEmptyColumns: false, + fixColumnHeaders: false, + fixRowHeaders: false, + filters: [ + { + items: [ + { + name: 'Bo', + dimensionItemType: 'ORGANISATION_UNIT', + displayShortName: 'Bo', + displayName: 'Bo', + access: { + manage: true, + externalize: true, + write: true, + read: true, + update: true, + delete: true, + }, + id: 'O6uvpzGd5pu', + }, + ], + dimension: 'ou', + }, + { + items: [ + { + name: 'LAST_12_MONTHS', + dimensionItemType: 'PERIOD', + displayShortName: 'LAST_12_MONTHS', + displayName: 'LAST_12_MONTHS', + access: { + manage: true, + externalize: true, + write: true, + read: true, + update: true, + delete: true, + }, + id: 'LAST_12_MONTHS', + }, + ], + dimension: 'pe', + }, + ], + parentGraphMap: { + O6uvpzGd5pu: 'ImspTQPwCqd', + }, + columns: [ + { + items: [ + { + name: 'BCG Coverage <1y', + dimensionItemType: 'INDICATOR', + displayName: 'BCG Coverage <1y', + access: { + manage: true, + externalize: true, + write: true, + read: true, + update: true, + delete: true, + }, + displayShortName: 'BCG Coverage <1y', + id: 'FnYCr2EAzWS', + }, + ], + dimension: 'dx', + }, + ], + rows: [], + subscribed: false, + displayName: 'BCG coverage last 12 months - Bo', + access: { + manage: true, + externalize: true, + write: true, + read: true, + update: true, + delete: true, + }, + favorite: false, + user: { + id: 'xE7jOejl9FI', + code: null, + name: 'John Traore', + displayName: 'John Traore', + username: 'admin', + }, + href: 'http://localhost:8080/api/41/visualizations/mYMnDl5Z9oD', + id: 'mYMnDl5Z9oD', + legend: { + showKey: false, + }, + sorting: [], + series: [], + icons: [], + seriesKey: { + hidden: false, + }, + axes: [], +} +const icon = + '' + +const baseExtraOptions = { + dashboard: true, + animation: 200, + legendSets: [], + icon, +} + +const indicatorTypes = ['plain', 'percent', 'subtext'] + +storiesOf('SingleValue', module).add('default', () => { + const newChartRef = useRef(null) + const newContainerRef = useRef(null) + const [dashboard, setDashboard] = useState(false) + const [showIcon, setShowIcon] = useState(true) + const [indicatorType, setIndicatorType] = useState('plain') + const [exportAsPdf, setExportAsPdf] = useState(true) + const [width, setWidth] = useState(constainerStyleBase.width) + const [height, setHeight] = useState(constainerStyleBase.height) + const containerStyle = useMemo( + () => ({ + ...constainerStyleBase, + width, + height, + }), + [width, height] + ) + useEffect(() => { + if (newContainerRef.current) { + requestAnimationFrame(() => { + const extraOptions = { + ...baseExtraOptions, + dashboard, + icon: showIcon ? icon : undefined, + } + const dataObj = { ...baseDataObj } + + if (indicatorType === 'plain') { + dataObj.metaData.items.FnYCr2EAzWS.indicatorType = + numberIndicatorType + } + if (indicatorType === 'percent') { + dataObj.metaData.items.FnYCr2EAzWS.indicatorType = + percentIndicatorType + } + if (indicatorType === 'subtext') { + dataObj.metaData.items.FnYCr2EAzWS.indicatorType = + subtextIndicatorType + } + const newVisualization = createVisualization( + [dataObj], + layout, + newContainerRef.current, + extraOptions, + undefined, + undefined, + 'highcharts' + ) + newChartRef.current = newVisualization.visualization + }) + } + }, [containerStyle, dashboard, showIcon, indicatorType]) + const downloadOffline = useCallback(() => { + if (newChartRef.current) { + const currentBackgroundColor = + newChartRef.current.userOptions.chart.backgroundColor + + newChartRef.current.update({ + exporting: { + chartOptions: { + isPdfExport: exportAsPdf, + }, + }, + }) + newChartRef.current.exportChartLocal( + { + sourceHeight: 768, + sourceWidth: 1024, + scale: 1, + fallbackToExportServer: false, + filename: 'testOfflineDownload', + showExportInProgress: true, + type: exportAsPdf ? 'application/pdf' : 'image/png', + }, + { + chart: { + backgroundColor: + currentBackgroundColor === 'transparent' + ? '#ffffff' + : currentBackgroundColor, + }, + } + ) + } + }, [exportAsPdf]) + + return ( + <> +
+
+ + + setWidth(parseInt(event.target.value)) + } + value={width.toString()} + /> +
+
+ + + setHeight(parseInt(event.target.value)) + } + value={height.toString()} + /> +
+ + + + + +
+
+
+
+
+
+ + ) +}) diff --git a/src/__demo__/Toolbar.stories.js b/src/__demo__/Toolbar.stories.js new file mode 100644 index 000000000..f0795632e --- /dev/null +++ b/src/__demo__/Toolbar.stories.js @@ -0,0 +1,78 @@ +import { storiesOf } from '@storybook/react' +import React, { useState } from 'react' +import { + HoverMenuBar, + HoverMenuDropdown, + HoverMenuList, + HoverMenuListItem, + InterpretationsAndDetailsToggler, + Toolbar, + ToolbarSidebar, + UpdateButton, +} from '../components/Toolbar/index.js' + +function ToolbarWithState() { + const [isHidden, setIsHidden] = useState(false) + const [isSidebarShowing, setIsSidebarShowing] = useState(false) + return ( + + + Toolbar side bar + setIsHidden(true)} + > + click to hide + + + {}} /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + setIsSidebarShowing((current) => !current)} + /> + + ) +} + +storiesOf('Toolbar', module).add('default', () => { + return +}) diff --git a/src/__fixtures__/fixtures.js b/src/__fixtures__/fixtures.js index 4fab49688..b900ea724 100644 --- a/src/__fixtures__/fixtures.js +++ b/src/__fixtures__/fixtures.js @@ -114,6 +114,10 @@ export default (function x() { require('./json/api/analytics/enrollments.json') ) + addFixture( + '/api/analytics/outlierDetection', + require('./json/api/analytics/outlierDetection.json') + ) return { get: getFixture, add: addFixture, diff --git a/src/__fixtures__/json/api/analytics/outlierDetection.json b/src/__fixtures__/json/api/analytics/outlierDetection.json new file mode 100644 index 000000000..014ac1183 --- /dev/null +++ b/src/__fixtures__/json/api/analytics/outlierDetection.json @@ -0,0 +1,213 @@ +{ + "headers": [ + { + "name": "dxname", + "column": "Data name", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": false + }, + { + "name": "ouname", + "column": "Organisation unit name", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": false + }, + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + }, + { + "name": "absdev", + "column": "Absolute deviation", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + }, + { + "name": "modifiedzscore", + "column": "Modified zScore", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + }, + { + "name": "median", + "column": "Median", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + }, + { + "name": "lowerbound", + "column": "Lower boundary", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + }, + { + "name": "upperbound", + "column": "Upper boundary", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + } + ], + "metaData": { + "maxResults": 100, + "count": 13, + "orderBy": "mean_abs_dev", + "threshold": 3.0, + "algorithm": "MOD_Z_SCORE" + }, + "rowContext": { + + }, + "rows": [ + [ + "ANC 2nd visit", + "UMC (Urban Centre) Hospital", + "1669.0", + "920.0", + "3.902767295597484", + "749.0", + "-290.93013894085743", + "1788.9301389408574" + ], + [ + "ANC 1st visit", + "Charlotte CHP", + "49.0", + "39.0", + "7.515857142857143", + "10.0", + "-23.948490393535913", + "43.94849039353591" + ], + [ + "ANC 2nd visit", + "Charlotte CHP", + "40.0", + "33.0", + "22.258499999999998", + "7.0", + "-30.86489139031037", + "44.86489139031037" + ], + [ + "ANC 2nd visit", + "Wilberforce CHC", + "56.0", + "24.5", + "3.004590909090909", + "31.5", + "-1.3890179239210454", + "64.38901792392105" + ], + [ + "ANC 1st visit", + "Deep Eye water MCHP", + "40.0", + "16.0", + "3.5973333333333333", + "24.0", + "4.850913859925324", + "43.14908614007467" + ], + [ + "ANC 2nd visit", + "Lion for Lion Clinic", + "30.0", + "16.0", + "3.5973333333333333", + "14.0", + "-5.620896815302167", + "33.62089681530217" + ], + [ + "ANC 2nd visit", + "Deep Eye water MCHP", + "33.0", + "14.5", + "3.9121", + "18.5", + "-3.4245866551686603", + "40.42458665516866" + ], + [ + "ANC 2nd visit", + "Blessed Mokaka East Clinic", + "2.0", + "13.0", + "4.38425", + "15.0", + "-3.417043736713012", + "33.41704373671301" + ], + [ + "ANC 2nd visit", + "Malambay CHP", + "15.0", + "12.0", + "5.396", + "3.0", + "-13.770509831248425", + "19.770509831248425" + ], + [ + "ANC 2nd visit", + "Wellbody MCHP", + "20.0", + "10.0", + "3.3725", + "10.0", + "-10.999999999999996", + "30.999999999999996" + ], + [ + "ANC 1st visit", + "Blessed Mokaka East Clinic", + "26.0", + "10.0", + "4.496666666666667", + "16.0", + "1.6734512181055958", + "30.326548781894402" + ], + [ + "ANC 1st visit", + "Murray Town CHC", + "18.0", + "9.0", + "6.0705", + "9.0", + "-2.43571205496543", + "20.43571205496543" + ], + [ + "ANC 2nd visit", + "Thompson Bay MCHP", + "11.0", + "6.0", + "4.047", + "5.0", + "-2.038266127580332", + "12.038266127580332" + ] + ], + "headerWidth": 8, + "width": 8, + "height": 13 +} diff --git a/src/api/analytics/Analytics.js b/src/api/analytics/Analytics.js index d08872524..0e0ddba2f 100644 --- a/src/api/analytics/Analytics.js +++ b/src/api/analytics/Analytics.js @@ -6,12 +6,15 @@ import AnalyticsEnrollments from './AnalyticsEnrollments.js' import AnalyticsEvents from './AnalyticsEvents.js' import AnalyticsRequest from './AnalyticsRequest.js' import AnalyticsResponse from './AnalyticsResponse.js' +import AnalyticsTrackedEntities from './AnalyticsTrackedEntities.js' /** * @description * Analytics class used to request analytics data from Web API. * * @requires analytics.AnalyticsAggregate + * @requires analytics.AnalyticsTrackedEntities + * @requires analytics.AnalyticsEnrollments * @requires analytics.AnalyticsEvents * @requires analytics.AnalyticsRequest * @requires analytics.AnalyticsResponse @@ -31,13 +34,22 @@ import AnalyticsResponse from './AnalyticsResponse.js' class Analytics { /** * @param {!module:analytics.AnalyticsAggregate} analyticsAggregate The AnalyticsAggregate instance + * @param {!module:analytics.AnalyticsTrackedEntities} analyticsTrackedEntities The AnalyticsTrackedEntities instance * @param {!module:analytics.AnalyticsEnrollments} analyticsEnrollments The AnalyticsEnrollments instance * @param {!module:analytics.AnalyticsEvents} analyticsEvents The AnalyticsEvents instance * @param {!module:analytics.AnalyticsRequest} analyticsRequest The AnalyticsRequest class * @param {!module:analytics.AnalyticsResponse} analyticsResponse The AnalyticsResponse class */ - constructor({ aggregate, enrollments, events, request, response }) { + constructor({ + aggregate, + trackedEntities, + enrollments, + events, + request, + response, + }) { this.aggregate = aggregate + this.trackedEntities = trackedEntities this.enrollments = enrollments this.events = events this.request = request @@ -60,6 +72,7 @@ class Analytics { if (!Analytics.getAnalytics.analytics) { Analytics.getAnalytics.analytics = new Analytics({ aggregate: new AnalyticsAggregate(dataEngine), + trackedEntities: new AnalyticsTrackedEntities(dataEngine), enrollments: new AnalyticsEnrollments(dataEngine), events: new AnalyticsEvents(dataEngine), request: AnalyticsRequest, diff --git a/src/api/analytics/AnalyticsAggregate.js b/src/api/analytics/AnalyticsAggregate.js index 88adebc81..93de9f8b4 100644 --- a/src/api/analytics/AnalyticsAggregate.js +++ b/src/api/analytics/AnalyticsAggregate.js @@ -68,12 +68,38 @@ class AnalyticsAggregate extends AnalyticsBase { * .withStartDate('2017-10-01') * .withEndDate('2017-10-31'); * - * analytics.aggregate.getDebugSql(req); + * analytics.aggregate.getDebugSql(req) * .then(console.log); */ getDebugSql(req) { return this.fetch(req.withPath('debug/sql')) } + + /** + * @param {!AnalyticsRequest} req Request object + * + * @returns {Promise} Promise that resolves with the SQL statement used to query the database. + * + * @example + * const req = new analytics.request() + * .withParameters({ + * dx: 'fbfJHSPpUQD,cYeuwXTCPkU', + * pe: 'THIS_YEAR', + * ou: 'USER_ORGUNIT,USER_ORGUNIT_CHILDREN', + * headers: 'dxname,pename,ouname,value,absdev,modifiedzscore,median,lowerbound,upperbound', + * algorithm: 'MODIFIED_Z_SCORE', + * maxResults: 100, + * threshold: 3, + orderBy: 'value', + sortOrder: 'desc', + * }); + * + * analytics.aggregate.getOutliersData(req) + * .then(console.log); + */ + getOutliersData(req) { + return this.fetch(req.withPath('outlierDetection')) + } } export default AnalyticsAggregate diff --git a/src/api/analytics/AnalyticsBase.js b/src/api/analytics/AnalyticsBase.js index 41b2fcf62..3bd153818 100644 --- a/src/api/analytics/AnalyticsBase.js +++ b/src/api/analytics/AnalyticsBase.js @@ -1,27 +1,38 @@ import sortBy from 'lodash/sortBy' import AnalyticsRequest from './AnalyticsRequest.js' +import { formatRequestPath } from './utils.js' const analyticsQuery = { resource: 'analytics', - id: ({ path, program }) => { - return [path, program].filter(Boolean).join('/') - }, + id: ({ path, program, trackedEntityType }) => + formatRequestPath({ + path, + program, + trackedEntityType, + }), params: ({ dimensions, filters, parameters }) => ({ - dimension: dimensions, - filter: filters, + dimension: dimensions.length ? dimensions : undefined, + filter: filters.length ? filters : undefined, ...parameters, }), } const analyticsDataQuery = { resource: 'analytics', - id: ({ path, program }) => { - return [path, program].filter(Boolean).join('/') - }, + id: ({ path, program, trackedEntityType }) => + formatRequestPath({ + path, + program, + trackedEntityType, + }), params: ({ dimensions, filters, parameters }) => { return { - dimension: dimensions, - filter: filters, + dimension: dimensions.length + ? generateDimensionStrings(dimensions, { sorted: true }) + : undefined, + filter: filters.length + ? generateDimensionStrings(filters, { sorted: true }) + : undefined, ...parameters, skipMeta: true, skipData: false, @@ -31,12 +42,17 @@ const analyticsDataQuery = { const analyticsMetaDataQuery = { resource: 'analytics', - id: ({ path, program }) => { - return [path, program].filter(Boolean).join('/') - }, + id: ({ path, program, trackedEntityType }) => + formatRequestPath({ + path, + program, + trackedEntityType, + }), params: ({ dimensions, filters, parameters }) => ({ - dimension: dimensions, - filter: filters, + dimension: dimensions.length + ? generateDimensionStrings(dimensions) + : undefined, + filter: filters.length ? generateDimensionStrings(filters) : undefined, ...parameters, skipMeta: false, skipData: true, @@ -44,15 +60,12 @@ const analyticsMetaDataQuery = { }), } -const generateDimensionStrings = (dimensions = [], options) => { - if (options && options.sorted) { - dimensions = sortBy(dimensions, 'dimension') - } - - return dimensions.map(({ dimension, items }) => { +export const generateDimensionStrings = (dimensions = [], options) => { + const sortedDimensions = sortBy(dimensions, 'dimension') + return sortedDimensions.map(({ dimension, items }) => { if (Array.isArray(items) && items.length) { if (options && options.sorted) { - items.sort() + items = items.slice().sort() } return `${dimension}:${items.join(';')}` @@ -120,8 +133,9 @@ class AnalyticsBase { variables: { path: req.path, program: req.program, - dimensions: generateDimensionStrings(req.dimensions), - filters: generateDimensionStrings(req.filters), + trackedEntityType: req.trackedEntityType, + dimensions: req.dimensions, + filters: req.filters, parameters: req.parameters, dataParams: dataReq.parameters, metaDataParams: metaDataReq.parameters, @@ -164,6 +178,7 @@ class AnalyticsBase { variables: { path: req.path, program: req.program, + trackedEntityType: req.trackedEntityType, dimensions: generateDimensionStrings( req.dimensions, options diff --git a/src/api/analytics/AnalyticsRequest.js b/src/api/analytics/AnalyticsRequest.js index 27bf20da5..b3ff28ce4 100644 --- a/src/api/analytics/AnalyticsRequest.js +++ b/src/api/analytics/AnalyticsRequest.js @@ -1,8 +1,10 @@ +import { getExpressionHashFromVisualization } from '../../modules/hash.js' import { getFixedDimensions } from '../../modules/predefinedDimensions.js' import AnalyticsRequestBase from './AnalyticsRequestBase.js' import AnalyticsRequestDimensionsMixin from './AnalyticsRequestDimensionsMixin.js' import AnalyticsRequestFiltersMixin from './AnalyticsRequestFiltersMixin.js' import AnalyticsRequestPropertiesMixin from './AnalyticsRequestPropertiesMixin.js' +import { formatDimension } from './utils.js' /** * @description @@ -44,6 +46,8 @@ class AnalyticsRequest extends AnalyticsRequestDimensionsMixin( fromVisualization(visualization, passFilterAsDimension = false) { let request = this + const outputType = visualization.outputType + // extract dimensions from visualization const columns = visualization.columns || [] const rows = visualization.rows || [] @@ -55,23 +59,31 @@ class AnalyticsRequest extends AnalyticsRequestDimensionsMixin( dimension += `-${d.legendSet.id}` } - if (d.programStage?.id) { - dimension = `${d.programStage.id}.${dimension}` - } - if (d.filter) { dimension += `:${d.filter}` } + const programStageId = d.programStage?.id + if (d.repetition?.indexes?.length) { d.repetition.indexes.forEach((index) => { request = request.addDimension( - dimension.replace(/\./, `[${index}].`) + formatDimension({ + programId: d.program?.id, + programStageId: `${programStageId}[${index}]`, + dimension, + outputType, + }) ) }) } else { request = request.addDimension( - dimension, + formatDimension({ + programId: d.program?.id, + programStageId, + dimension, + outputType, + }), d.items?.map((item) => item.id) ) } @@ -90,29 +102,46 @@ class AnalyticsRequest extends AnalyticsRequestDimensionsMixin( f.items?.map((item) => item.id) ) } else { - let filterString = f.programStage?.id - ? `${f.programStage.id}.${f.dimension}` - : f.dimension + let filterString = f.dimension if (f.filter) { filterString += `:${f.filter}` } + const programStageId = f.programStage?.id + if (f.repetition?.indexes?.length) { f.repetition.indexes.forEach((index) => { request = request.addFilter( - filterString.replace(/\./, `[${index}].`) + formatDimension({ + programId: f.program?.id, + programStageId: `${programStageId}[${index}]`, + dimension: filterString, + outputType, + }) ) }) } else { request = request.addFilter( - filterString, + formatDimension({ + programId: f.program?.id, + programStageId, + dimension: filterString, + outputType, + }), f.items?.map((item) => item.id) ) } } }) + // add cache param for expression dimension items + const expressionHash = getExpressionHashFromVisualization(visualization) + + if (expressionHash) { + request.withParameters({ edi_cache: expressionHash }) + } + return request } } diff --git a/src/api/analytics/AnalyticsRequestBase.js b/src/api/analytics/AnalyticsRequestBase.js index 780d3e6cb..ba317ae38 100644 --- a/src/api/analytics/AnalyticsRequestBase.js +++ b/src/api/analytics/AnalyticsRequestBase.js @@ -17,6 +17,7 @@ class AnalyticsRequestBase { format = 'json', path, program, + trackedEntityType, dimensions = [], filters = [], parameters = {}, @@ -25,6 +26,7 @@ class AnalyticsRequestBase { this.format = format.toLowerCase() this.path = path this.program = program + this.trackedEntityType = trackedEntityType this.dimensions = dimensions this.filters = filters @@ -46,14 +48,14 @@ class AnalyticsRequestBase { // at least 1 dimension is required let dimensions = this.dimensions - if (options && options.sorted) { + if (dimensions.length && options?.sorted) { dimensions = sortBy(dimensions, 'dimension') } const encodedDimensions = dimensions.map(({ dimension, items }) => { if (Array.isArray(items) && items.length) { const encodedItems = items.map(customEncodeURIComponent) - if (options && options.sorted) { + if (options?.sorted) { encodedItems.sort() } @@ -63,13 +65,22 @@ class AnalyticsRequestBase { return dimension }) - const endPoint = [this.endPoint, this.path, this.program] - .filter((e) => !!e) + const endPoint = [ + this.endPoint, + this.path, + this.program, + this.trackedEntityType, + ] + .filter(Boolean) .join('/') - return `${endPoint}.${this.format}?dimension=${encodedDimensions.join( - '&dimension=' - )}` + let url = `${endPoint}.${this.format}` + + if (encodedDimensions.length) { + url += `?dimension=${encodedDimensions.join('&dimension=')}` + } + + return url } /** @@ -88,14 +99,14 @@ class AnalyticsRequestBase { buildQuery(options) { let filters = this.filters - if (options && options.sorted) { + if (filters.length && options?.sorted) { filters = sortBy(filters, 'dimension') } const encodedFilters = filters.map(({ dimension, items }) => { if (Array.isArray(items) && items.length) { const encodedItems = items.map(customEncodeURIComponent) - if (options && options.sorted) { + if (options?.sorted) { encodedItems.sort() } diff --git a/src/api/analytics/AnalyticsRequestPropertiesMixin.js b/src/api/analytics/AnalyticsRequestPropertiesMixin.js index 6dd0f8cec..7d5ff0531 100644 --- a/src/api/analytics/AnalyticsRequestPropertiesMixin.js +++ b/src/api/analytics/AnalyticsRequestPropertiesMixin.js @@ -514,6 +514,26 @@ const AnalyticsRequestPropertiesMixin = (base) => return new AnalyticsRequest(this) } + /** + * Sets the tracked entity type for the request. + * It appends the tracked entity type id to the request's path. + * + * @param {!String} trackedEntityType The tracked entity type id + * + * @returns {AnalyticsRequest} A new instance of the class for chaining purposes + * + * @example + * const req = new analytics.request() + * .withTrackedEntityType('nEenWmSyUEp'); + */ + withTrackedEntityType(trackedEntityType) { + if (trackedEntityType) { + this.trackedEntityType = trackedEntityType + } + + return new AnalyticsRequest(this) + } + /** * Sets the program for the request. * It appends the program id to the request's path. diff --git a/src/api/analytics/AnalyticsResponse.js b/src/api/analytics/AnalyticsResponse.js index a7bcd8014..525393de6 100644 --- a/src/api/analytics/AnalyticsResponse.js +++ b/src/api/analytics/AnalyticsResponse.js @@ -81,7 +81,8 @@ class AnalyticsResponse { } extractHeaders() { - const dimensions = this.response.metaData.dimensions + // some endpoints (ie. outlierDetection) don't return dimensions in metaData + const dimensions = this.response.metaData.dimensions || {} const headers = this.response.headers || [] return headers.map( @@ -125,59 +126,61 @@ class AnalyticsResponse { const { dimensions, items } = metaData - // populate metaData dimensions and items - this.headers - .filter( - (header) => - !DEFAULT_COLLECT_IGNORE_HEADERS.includes(header.name) - ) - .forEach((header) => { - let ids - - // collect row values - if (header.isCollect) { - ids = this.getSortedUniqueRowIdStringsByHeader(header) - dimensions[header.name] = ids - } else { - ids = dimensions[header.name] - } + // some endpoints (ie. outlierDetection) don't return dimensions or items + if (dimensions && items) { + this.headers + .filter( + (header) => + !DEFAULT_COLLECT_IGNORE_HEADERS.includes(header.name) + ) + .forEach((header) => { + let ids + + // collect row values + if (header.isCollect) { + ids = this.getSortedUniqueRowIdStringsByHeader(header) + dimensions[header.name] = ids + } else { + ids = dimensions[header.name] + } - if (header.isPrefix) { - // create prefixed dimensions array - dimensions[header.name] = ids.map((id) => - getPrefixedId(id, header.name) - ) + if (header.isPrefix) { + // create prefixed dimensions array + dimensions[header.name] = ids.map((id) => + getPrefixedId(id, header.name) + ) - // create items - dimensions[header.name].forEach((prefixedId, index) => { - const id = ids[index] - const valueType = header.valueType + // create items + dimensions[header.name].forEach((prefixedId, index) => { + const id = ids[index] + const valueType = header.valueType - const name = getNameByIdsByValueType(id, valueType) + const name = getNameByIdsByValueType(id, valueType) - items[prefixedId] = { name } - }) - } - }) + items[prefixedId] = { name } + }) + } + }) - // for events, add items from 'ouname' - if (this.hasHeader(OUNAME) && this.hasHeader(OU)) { - const ouNameHeaderIndex = this.getHeader(OUNAME).getIndex() - const ouHeaderIndex = this.getHeader(OU).getIndex() - let ouId - let ouName + // for events, add items from 'ouname' + if (this.hasHeader(OUNAME) && this.hasHeader(OU)) { + const ouNameHeaderIndex = this.getHeader(OUNAME).getIndex() + const ouHeaderIndex = this.getHeader(OU).getIndex() + let ouId + let ouName - this.rows.forEach((row) => { - ouId = row[ouHeaderIndex] + this.rows.forEach((row) => { + ouId = row[ouHeaderIndex] - if (items[ouId] === undefined) { - ouName = row[ouNameHeaderIndex] + if (items[ouId] === undefined) { + ouName = row[ouNameHeaderIndex] - items[ouId] = { - name: ouName, + items[ouId] = { + name: ouName, + } } - } - }) + }) + } } return metaData diff --git a/src/api/analytics/AnalyticsTrackedEntities.js b/src/api/analytics/AnalyticsTrackedEntities.js new file mode 100644 index 000000000..3756be0e8 --- /dev/null +++ b/src/api/analytics/AnalyticsTrackedEntities.js @@ -0,0 +1,25 @@ +import AnalyticsBase from './AnalyticsBase.js' + +/** + * @extends module:analytics.AnalyticsBase + * + * @description + * Analytics tracked entities class used to request analytics tracked entities data from Web API. + * + * @memberof module:analytics + */ +class AnalyticsTrackedEntities extends AnalyticsBase { + /** + * @param {!AnalyticsRequest} req Request object + * + * @returns {Promise} Promise that resolves with the analytics query data from the api. + * + * @example + // TODO: provide working example + */ + getQuery(req) { + return this.fetch(req.withPath('trackedEntities/query')) + } +} + +export default AnalyticsTrackedEntities diff --git a/src/api/analytics/__tests__/Analytics.spec.js b/src/api/analytics/__tests__/Analytics.spec.js index 4add9c1b1..17d88344c 100644 --- a/src/api/analytics/__tests__/Analytics.spec.js +++ b/src/api/analytics/__tests__/Analytics.spec.js @@ -1,5 +1,6 @@ import Analytics from '../Analytics.js' import AnalyticsAggregate from '../AnalyticsAggregate.js' +import AnalyticsEnrollments from '../AnalyticsEnrollments.js' import AnalyticsEvents from '../AnalyticsEvents.js' import AnalyticsRequest from '../AnalyticsRequest.js' @@ -9,6 +10,7 @@ describe('Analytics', () => { beforeEach(() => { analytics = new Analytics({ aggregate: new AnalyticsAggregate(), + enrollments: new AnalyticsEnrollments(), events: new AnalyticsEvents(), request: AnalyticsRequest, }) @@ -26,6 +28,10 @@ describe('Analytics', () => { expect(analytics.aggregate).toBeInstanceOf(AnalyticsAggregate) }) + it('should contain an instance of AnalyticsEnrollments', () => { + expect(analytics.enrollments).toBeInstanceOf(AnalyticsEnrollments) + }) + it('should contain an instance of AnalyticsEvents', () => { expect(analytics.events).toBeInstanceOf(AnalyticsEvents) }) diff --git a/src/api/analytics/__tests__/AnalyticsAggregate.spec.js b/src/api/analytics/__tests__/AnalyticsAggregate.spec.js index f7fecba11..4a5d40d54 100644 --- a/src/api/analytics/__tests__/AnalyticsAggregate.spec.js +++ b/src/api/analytics/__tests__/AnalyticsAggregate.spec.js @@ -133,4 +133,44 @@ describe('Analytics.aggregate', () => { expect(data.height).toEqual(0) })) }) + + describe('.getOutliersData', () => { + beforeEach(() => { + aggregate = new AnalyticsAggregate(new DataEngineMock()) + + request = new AnalyticsRequest() + + request.withParameters({ + dx: 'fbfJHSPpUQD,cYeuwXTCPkU', + pe: 'THIS_YEAR', + ou: 'at6UHUQatSo', + headers: + 'dxname,pename,ouname,value,absdev,modifiedzscore,median,lowerbound,upperbound', + algorithm: 'MOD_Z_SCORE', + maxResults: 100, + threshold: 3, + }) + + fixture = fixtures.get('/api/analytics/outlierDetection') + + dataEngineMock.query.mockReturnValue( + Promise.resolve({ data: fixture }) + ) + }) + + it('should be a function', () => { + expect(aggregate.getOutliersData).toBeInstanceOf(Function) + }) + + it('should resolve a promise with data', () => + aggregate.getOutliersData(request).then((data) => { + expect(data.metaData.items).toEqual(fixture.metaData.items) + expect(data.metaData.dimensions).toEqual( + fixture.metaData.dimensions + ) + expect(data.headers).toEqual(fixture.headers) + expect(data.width).toEqual(8) + expect(data.height).toEqual(13) + })) + }) }) diff --git a/src/api/analytics/__tests__/AnalyticsBase.spec.js b/src/api/analytics/__tests__/AnalyticsBase.spec.js index 729eebdb7..9bc51eae6 100644 --- a/src/api/analytics/__tests__/AnalyticsBase.spec.js +++ b/src/api/analytics/__tests__/AnalyticsBase.spec.js @@ -1,4 +1,4 @@ -import AnalyticsBase from '../AnalyticsBase.js' +import AnalyticsBase, { generateDimensionStrings } from '../AnalyticsBase.js' let base @@ -19,3 +19,36 @@ describe('constructor', () => { expect(base.dataEngine).toBe(dataEngineMock) }) }) + +describe('generateDimensionString', () => { + const tests = [ + { + input: [ + { + dimension: 'dim2', + items: ['item2', 'item1'], + }, + { + dimension: 'dim1', + items: ['item1'], + }, + ], + output: ['dim1:item1', 'dim2:item2;item1'], + outputSorted: ['dim1:item1', 'dim2:item1;item2'], + }, + ] + + it('should return dimension strings correctly formatted', () => { + tests.forEach(({ input, output }) => { + expect(generateDimensionStrings(input)).toEqual(output) + }) + }) + + it('should return dimension strings correctly formatted and sorted', () => { + tests.forEach(({ input, outputSorted }) => { + expect(generateDimensionStrings(input, { sorted: true })).toEqual( + outputSorted + ) + }) + }) +}) diff --git a/src/api/analytics/utils.js b/src/api/analytics/utils.js index bf766d69c..bb15681d2 100644 --- a/src/api/analytics/utils.js +++ b/src/api/analytics/utils.js @@ -7,3 +7,20 @@ const whitelistRegExp = new RegExp(`(?:${whitelistURICodes.join('|')})`, 'g') export const customEncodeURIComponent = (uri) => encodeURIComponent(uri).replace(whitelistRegExp, decodeURIComponent) + +export const formatRequestPath = ({ path, program, trackedEntityType }) => + [path, program, trackedEntityType].filter(Boolean).join('/') + +export const formatDimension = ({ + outputType, + programId, + programStageId, + dimension, +}) => + [ + outputType === 'TRACKED_ENTITY_INSTANCE' ? programId : undefined, + programStageId, + dimension, + ] + .filter(Boolean) + .join('.') diff --git a/src/api/dimensions.js b/src/api/dimensions.js index 1ca3b334f..3a657fc43 100644 --- a/src/api/dimensions.js +++ b/src/api/dimensions.js @@ -71,7 +71,7 @@ export const dataItemsQuery = { } return objectClean({ - fields: `id,${nameProp}~rename(name),dimensionItemType`, + fields: `id,${nameProp}~rename(name),dimensionItemType,expression`, order: `${nameProp}:asc`, filter: filters, paging: true, diff --git a/src/api/expression.js b/src/api/expression.js new file mode 100644 index 000000000..64bb61c30 --- /dev/null +++ b/src/api/expression.js @@ -0,0 +1,28 @@ +export const validateExpressionMutation = { + type: 'create', + resource: 'indicators/expression/description', + data: ({ expression }) => expression, +} + +export const createCalculationMutation = { + type: 'create', + resource: 'expressionDimensionItems', + data: ({ name, expression }) => ({ name, shortName: name, expression }), +} + +export const updateCalculationMutation = { + type: 'json-patch', + resource: 'expressionDimensionItems', + id: ({ id }) => id, + data: ({ name, expression }) => [ + { op: 'add', path: '/name', value: name }, + { op: 'add', path: '/shortName', value: name }, + { op: 'add', path: '/expression', value: expression }, + ], +} + +export const deleteCalculationMutation = { + type: 'delete', + resource: 'expressionDimensionItems', + id: ({ id }) => id, +} diff --git a/src/assets/DimensionItemIcons/CalculationIcon.js b/src/assets/DimensionItemIcons/CalculationIcon.js new file mode 100644 index 000000000..a7b124ed0 --- /dev/null +++ b/src/assets/DimensionItemIcons/CalculationIcon.js @@ -0,0 +1,18 @@ +import React from 'react' + +export default ( + + + +) diff --git a/src/assets/DynamicDimensionIcon.js b/src/assets/DynamicDimensionIcon.js index 83d6c678d..8fbeb84ab 100644 --- a/src/assets/DynamicDimensionIcon.js +++ b/src/assets/DynamicDimensionIcon.js @@ -3,49 +3,24 @@ import React from 'react' const DynamicDimensionIcon = () => { return ( - - - - - - - - - - - - - + + ) } diff --git a/src/assets/FormulaIcon.js b/src/assets/FormulaIcon.js new file mode 100644 index 000000000..7c71c02ad --- /dev/null +++ b/src/assets/FormulaIcon.js @@ -0,0 +1,30 @@ +import React from 'react' + +const FormulaIcon = () => { + return ( + + + + + + + + + + + + ) +} + +export default FormulaIcon diff --git a/src/components/AboutAOUnit/AboutAOUnit.js b/src/components/AboutAOUnit/AboutAOUnit.js index ca0893011..cb4a65cb7 100644 --- a/src/components/AboutAOUnit/AboutAOUnit.js +++ b/src/components/AboutAOUnit/AboutAOUnit.js @@ -1,5 +1,8 @@ -import { useDataQuery, useDataMutation } from '@dhis2/app-runtime' -import { Parser as RichTextParser } from '@dhis2/d2-ui-rich-text' +import { + useDataQuery, + useDataMutation, + useTimeZoneConversion, +} from '@dhis2/app-runtime' import { Button, CircularLoader, @@ -25,6 +28,7 @@ import React, { } from 'react' import i18n from '../../locales/index.js' import { formatList } from '../../modules/list.js' +import { RichTextParser } from '../RichText/index.js' import styles from './styles/AboutAOUnit.style.js' import { getTranslatedString, AOTypeMap } from './utils.js' @@ -57,6 +61,7 @@ const getUnsubscribeMutation = (type, id) => ({ const AboutAOUnit = forwardRef(({ type, id, renderId }, ref) => { const [isExpanded, setIsExpanded] = useState(true) + const { fromServerDate } = useTimeZoneConversion() const queries = useMemo(() => getQueries(type), [type]) @@ -186,8 +191,9 @@ const AboutAOUnit = forwardRef(({ type, id, renderId }, ref) => { )} {data && (
-

@@ -196,9 +202,9 @@ const AboutAOUnit = forwardRef(({ type, id, renderId }, ref) => { {data.ao.displayDescription} ) : ( - i18n.t('No description') +

{i18n.t('No description')}

)} -

+

@@ -208,7 +214,7 @@ const AboutAOUnit = forwardRef(({ type, id, renderId }, ref) => { {i18n.t('Last updated {{time}}', { time: moment( - data.ao.lastUpdated + fromServerDate(data.ao.lastUpdated) ).fromNow(), })}

@@ -219,7 +225,9 @@ const AboutAOUnit = forwardRef(({ type, id, renderId }, ref) => { 'Created {{time}} by {{author}}', { time: moment( - data.ao.created + fromServerDate( + data.ao.created + ) ).fromNow(), author: data.ao.createdBy .displayName, @@ -227,7 +235,9 @@ const AboutAOUnit = forwardRef(({ type, id, renderId }, ref) => { ) : i18n.t('Created {{time}}', { time: moment( - data.ao.created + fromServerDate( + data.ao.created + ) ).fromNow(), })}

diff --git a/src/components/AboutAOUnit/styles/AboutAOUnit.style.js b/src/components/AboutAOUnit/styles/AboutAOUnit.style.js index fdabe3898..f95205a83 100644 --- a/src/components/AboutAOUnit/styles/AboutAOUnit.style.js +++ b/src/components/AboutAOUnit/styles/AboutAOUnit.style.js @@ -48,6 +48,10 @@ export default css` flex-shrink: 0; } + .description { + white-space: pre-line; + } + .noDescription { color: ${colors.grey600}; } diff --git a/src/components/AboutAOUnit/utils.js b/src/components/AboutAOUnit/utils.js index b5874a5c5..4cbaecb49 100644 --- a/src/components/AboutAOUnit/utils.js +++ b/src/components/AboutAOUnit/utils.js @@ -3,6 +3,8 @@ import i18n from '../../locales/index.js' export const AO_TYPE_VISUALIZATION = 'visualization' export const AO_TYPE_MAP = 'map' export const AO_TYPE_EVENT_VISUALIZATION = 'eventVisualization' +export const AO_TYPE_EVENT_CHART = 'eventChart' +export const AO_TYPE_EVENT_REPORT = 'eventReport' export const AOTypeMap = { [AO_TYPE_VISUALIZATION]: { @@ -14,6 +16,12 @@ export const AOTypeMap = { [AO_TYPE_EVENT_VISUALIZATION]: { apiEndpoint: 'eventVisualizations', }, + [AO_TYPE_EVENT_CHART]: { + apiEndpoint: 'eventCharts', + }, + [AO_TYPE_EVENT_REPORT]: { + apiEndpoint: 'eventReports', + }, } const NO_TYPE = 'NO_TYPE' @@ -28,6 +36,12 @@ const texts = { [AO_TYPE_VISUALIZATION]: { unitTitle: i18n.t('About this visualization'), }, + [AO_TYPE_EVENT_CHART]: { + unitTitle: i18n.t('About this event chart'), + }, + [AO_TYPE_EVENT_REPORT]: { + unitTitle: i18n.t('About this event report'), + }, [NO_TYPE]: { unitTitle: i18n.t('About this visualization'), }, diff --git a/src/components/CachedDataQueryProvider.js b/src/components/CachedDataQueryProvider.js index 32adc57d4..d1b8f542f 100644 --- a/src/components/CachedDataQueryProvider.js +++ b/src/components/CachedDataQueryProvider.js @@ -6,7 +6,12 @@ import i18n from '../locales/index.js' const CachedDataQueryCtx = createContext({}) -const CachedDataQueryProvider = ({ query, dataTransformation, children }) => { +const CachedDataQueryProvider = ({ + query, + dataTransformation, + children, + translucent = true, +}) => { const { data: rawData, ...rest } = useDataQuery(query) const { error, loading } = rest const data = @@ -14,7 +19,7 @@ const CachedDataQueryProvider = ({ query, dataTransformation, children }) => { if (loading) { return ( - + @@ -43,6 +48,7 @@ CachedDataQueryProvider.propTypes = { children: PropTypes.node.isRequired, query: PropTypes.object.isRequired, dataTransformation: PropTypes.func, + translucent: PropTypes.bool, } const useCachedDataQuery = () => useContext(CachedDataQueryCtx) diff --git a/src/components/DataDimension/Calculation/CalculationModal.js b/src/components/DataDimension/Calculation/CalculationModal.js new file mode 100644 index 000000000..6fdcf8119 --- /dev/null +++ b/src/components/DataDimension/Calculation/CalculationModal.js @@ -0,0 +1,492 @@ +import { useAlert, useDataMutation, useDataQuery } from '@dhis2/app-runtime' +import { + Button, + Modal, + ModalTitle, + ModalContent, + ModalActions, + ButtonStrip, + InputField, +} from '@dhis2/ui' +import cx from 'classnames' +import PropTypes from 'prop-types' +import React, { useEffect, useState } from 'react' +import { + createCalculationMutation, + deleteCalculationMutation, + updateCalculationMutation, + validateExpressionMutation, +} from '../../../api/expression.js' +import i18n from '../../../locales/index.js' +import { + parseExpressionToArray, + parseArrayToExpression, + validateExpression, + EXPRESSION_TYPE_DATA, + EXPRESSION_TYPE_NUMBER, + INVALID_EXPRESSION, + VALID_EXPRESSION, + getItemIdsFromExpression, +} from '../../../modules/expressions.js' +import { OfflineTooltip as Tooltip } from '../../OfflineTooltip.js' +import DataElementSelector from './DataElementSelector.js' +import DndContext, { OPTIONS_PANEL } from './DndContext.js' +import FormulaField, { + LAST_DROPZONE_ID, + FORMULA_BOX_ID, +} from './FormulaField.js' +import MathOperatorSelector from './MathOperatorSelector.js' +import styles from './styles/CalculationModal.style.js' + +const FIRST_POSITION = 0 +const LAST_POSITION = -1 + +const CalculationModal = ({ + calculation, + onSave, + onClose, + onDelete, + displayNameProp, +}) => { + const { show: showError } = useAlert((error) => error, { critical: true }) + const mutationParams = { onError: (error) => showError(error) } + const [createCalculation, { loading: isCreatingCalculation }] = + useDataMutation(createCalculationMutation, mutationParams) + const [updateCalculation, { loading: isUpdatingCalculation }] = + useDataMutation(updateCalculationMutation, mutationParams) + const [deleteCalculation, { loading: isDeletingCalculation }] = + useDataMutation(deleteCalculationMutation, mutationParams) + const [doBackendValidation, { loading: isValidating }] = useDataMutation( + validateExpressionMutation, + { + onError: (error) => showError(error), + } + ) + + const query = { + dataElements: { + resource: 'dataElements', + params: ({ ids = [] }) => ({ + fields: `id,${displayNameProp}~rename(name)`, + filter: `id:in:[${ids.join(',')}]`, + paging: false, + }), + }, + dataElementOperands: { + resource: 'dataElementOperands', + params: ({ ids = [] }) => ({ + fields: `id,${displayNameProp}~rename(name)`, + filter: `id:in:[${ids.join(',')}]`, + paging: false, + }), + }, + } + + const { data, refetch } = useDataQuery(query, { + lazy: true, + }) + + useEffect(() => { + const ids = getItemIdsFromExpression(calculation.expression) + + // only fetch data if there are ids + if (ids?.length) { + refetch({ ids }) + } else { + setExpressionArray( + parseExpressionToArray(calculation.expression).map( + (item, i) => ({ + ...item, + id: `${item.type}-${-i}`, + }) + ) + ) + } + }, [refetch, calculation.expression]) + + useEffect(() => { + if (data) { + const metadata = [ + ...(data.dataElements?.dataElements || []), + ...(data.dataElementOperands?.dataElementOperands || []), + ] + + setExpressionArray( + parseExpressionToArray(calculation.expression, metadata).map( + (item, i) => ({ + ...item, + id: `${item.type}-${-i}`, + }) + ) + ) + } + }, [data, calculation.expression]) + + const [newIdCount, setNewIdCount] = useState(1) + + const [validationOutput, setValidationOutput] = useState(null) + const [expressionArray, setExpressionArray] = useState() + const [name, setName] = useState(calculation.name) + const [showDeletePrompt, setShowDeletePrompt] = useState(false) + const [isSavingCalculation, setIsSavingCalculation] = useState() + + const [focusItemId, setFocusItemId] = useState(null) + const [selectedItemId, setSelectedItemId] = useState(null) + + const expressionStatus = validationOutput?.status + + const selectItem = (itemId) => + setSelectedItemId((prevSelected) => + prevSelected !== itemId ? itemId : null + ) + + const isLoading = + isCreatingCalculation || + isUpdatingCalculation || + isDeletingCalculation || + isSavingCalculation || + isValidating + + const addItem = ({ label, value, type, destIndex = LAST_POSITION }) => { + if (isLoading) { + return null + } + setValidationOutput() + + const newItem = { + id: `${type}-${newIdCount}`, + value: type === EXPRESSION_TYPE_DATA ? `#{${value}}` : value, + label, + type, + } + + setNewIdCount(newIdCount + 1) + + if (destIndex === LAST_POSITION) { + setExpressionArray((prevArray) => prevArray.concat([newItem])) + } else if (destIndex === FIRST_POSITION) { + setExpressionArray((prevArray) => [newItem].concat(prevArray)) + } else { + const items = Array.from(expressionArray) + const newFormulaItems = [ + ...items.slice(0, destIndex), + newItem, + ...items.slice(destIndex), + ] + setExpressionArray(newFormulaItems) + } + + if (newItem.type === EXPRESSION_TYPE_NUMBER) { + setFocusItemId(newItem.id) + } + } + + const moveItem = ({ sourceIndex, destIndex }) => { + if (isLoading) { + return null + } + setValidationOutput() + const sourceList = Array.from(expressionArray) + const [moved] = sourceList.splice(sourceIndex, 1) + sourceList.splice(destIndex, 0, moved) + setExpressionArray(sourceList) + } + + const setItemValue = ({ itemId, value }) => { + const updatedItems = expressionArray.map((item) => + item.id === itemId ? Object.assign({}, item, { value }) : item + ) + setExpressionArray(updatedItems) + } + + const removeItem = (itemId) => { + if (!isLoading && itemId !== null) { + setValidationOutput() + const index = expressionArray.findIndex( + (item) => item.id === itemId + ) + const sourceList = Array.from(expressionArray) + sourceList.splice(index, 1) + setExpressionArray(sourceList) + setSelectedItemId(null) + } + } + + const addOrMoveDraggedItem = ({ item, destination }) => { + const destContainerId = destination.containerId + + let destIndex = FIRST_POSITION + if (item.sourceContainerId === OPTIONS_PANEL) { + if (destContainerId === LAST_DROPZONE_ID) { + destIndex = LAST_POSITION + } else if (destContainerId === FORMULA_BOX_ID) { + destIndex = destination.index + 1 + } + + addItem({ ...item.data, destIndex }) + } else { + if (destContainerId === LAST_DROPZONE_ID) { + destIndex = expressionArray.length + } else if (destContainerId === FORMULA_BOX_ID) { + destIndex = destination.index + } + + moveItem({ sourceIndex: item.sourceIndex, destIndex }) + } + } + + const validate = async () => { + setValidationOutput() + const expression = parseArrayToExpression(expressionArray) + let result = validateExpression(expression) + if (!result) { + result = await doBackendValidation({ + expression, + }) + } + setValidationOutput(result) + + return result?.status + } + + const onSaveClick = async () => { + setIsSavingCalculation(true) + let status = expressionStatus + + if (status !== VALID_EXPRESSION) { + status = await validate() + } + + if (status === VALID_EXPRESSION) { + let response + const expression = parseArrayToExpression(expressionArray) + + if (calculation.id) { + response = await updateCalculation({ + id: calculation.id, + name, + expression, + }) + } else { + response = await createCalculation({ + name, + expression, + }) + } + + onSave({ + id: calculation.id || response?.response.uid, + name, + isNew: !calculation.id, + expression, + }) + } + setIsSavingCalculation(false) + } + + const onDeleteClick = async () => { + setShowDeletePrompt() + await deleteCalculation({ id: calculation.id }) + onDelete({ + id: calculation.id, + }) + } + + return ( + <> + + + {calculation.id + ? i18n.t('Data / Edit calculation') + : i18n.t('Data / New calculation')} + + + setFocusItemId(null)} + onDragEnd={addOrMoveDraggedItem} + > +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + {validationOutput?.message} + +
+ + setName(value.substr(0, 50)) + } + value={name} + dataTest="calculation-label" + dense + /> +
+
+
+
+
+
+ + + {calculation.id && ( +
+ +
+ )} + + + + +
+
+
+ {showDeletePrompt && ( + + {i18n.t('Delete calculation')} + + {i18n.t( + 'Are you sure you want to delete this calculation? It may be used by other visualizations.' + )} + + + + + + + + + + )} + + + ) +} + +CalculationModal.propTypes = { + displayNameProp: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, + onDelete: PropTypes.func.isRequired, + onSave: PropTypes.func.isRequired, + calculation: PropTypes.shape({ + expression: PropTypes.string, + id: PropTypes.string, + name: PropTypes.string, + }), +} + +CalculationModal.defaultProps = { + calculation: {}, +} + +export default CalculationModal diff --git a/src/components/DataDimension/Calculation/DataElementOption.js b/src/components/DataDimension/Calculation/DataElementOption.js new file mode 100644 index 000000000..7743ff3b3 --- /dev/null +++ b/src/components/DataDimension/Calculation/DataElementOption.js @@ -0,0 +1,51 @@ +import { useSortable } from '@dnd-kit/sortable' +import { CSS } from '@dnd-kit/utilities' +import PropTypes from 'prop-types' +import React from 'react' +import { DIMENSION_TYPE_DATA_ELEMENT } from '../../../modules/dataTypes.js' +import { getIcon } from '../../../modules/dimensionListItem.js' +import { EXPRESSION_TYPE_DATA } from '../../../modules/expressions.js' +import styles from './styles/DataElementOption.style.js' + +const DataElementOption = ({ label, value, onDoubleClick }) => { + const data = { label, value, type: EXPRESSION_TYPE_DATA } + const { attributes, listeners, setNodeRef, transform } = useSortable({ + id: value, + data, + }) + const style = { + transform: CSS.Translate.toString(transform), + } + + return ( +
+
+
onDoubleClick(data)} + data-test="data-element-option" + > + + {getIcon(DIMENSION_TYPE_DATA_ELEMENT)} + + {label} +
+
+ +
+ ) +} + +DataElementOption.propTypes = { + label: PropTypes.string, + value: PropTypes.string, + onDoubleClick: PropTypes.func, +} + +export default DataElementOption diff --git a/src/components/DataDimension/Calculation/DataElementSelector.js b/src/components/DataDimension/Calculation/DataElementSelector.js new file mode 100644 index 000000000..123fe20fd --- /dev/null +++ b/src/components/DataDimension/Calculation/DataElementSelector.js @@ -0,0 +1,324 @@ +import { useDataEngine } from '@dhis2/app-runtime' +import { + CircularLoader, + InputField, + IntersectionDetector, + SingleSelectField, + SingleSelectOption, +} from '@dhis2/ui' +import { useSortable } from '@dnd-kit/sortable' +import { useDebounceCallback } from '@react-hook/debounce' +import cx from 'classnames' +import PropTypes from 'prop-types' +import React, { useEffect, useRef, useState } from 'react' +import { apiFetchOptions, apiFetchGroups } from '../../../api/dimensions.js' +import i18n from '../../../locales/index.js' +import { + TOTALS, + DETAIL, + DIMENSION_TYPE_ALL, + DIMENSION_TYPE_DATA_ELEMENT, + dataTypeMap as dataTypes, +} from '../../../modules/dataTypes.js' +import DataElementOption from './DataElementOption.js' +import styles from './styles/DataElementSelector.style.js' + +const getOptions = () => ({ + [TOTALS]: i18n.t('Totals only'), + [DETAIL]: i18n.t('Details only'), +}) + +const GroupSelector = ({ currentValue, onChange, displayNameProp }) => { + const dataEngine = useDataEngine() + + const [loading, setLoading] = useState(true) + const [groups, setGroups] = useState([]) + + const defaultGroup = dataTypes[DIMENSION_TYPE_DATA_ELEMENT]?.defaultGroup + + useEffect(() => { + const fetchGroups = async () => { + setLoading(true) + + const result = await apiFetchGroups( + dataEngine, + DIMENSION_TYPE_DATA_ELEMENT, + displayNameProp + ) + + setGroups(result) + + setLoading(false) + } + + fetchGroups() + }, [dataEngine, displayNameProp]) + + return ( +
+ onChange(ref.selected)} + dense + loading={loading} + loadingText={i18n.t('Loading')} + dataTest={'data-element-group-select'} + > + {defaultGroup ? ( + + ) : null} + {!loading + ? groups.map((group) => ( + + )) + : null} + + +
+ ) +} + +GroupSelector.propTypes = { + currentValue: PropTypes.string.isRequired, + displayNameProp: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired, +} + +const DisaggregationSelector = ({ currentValue, onChange }) => { + const options = getOptions() + return ( +
+ onChange(ref.selected)} + dense + dataTest={'data-element-disaggregation-select'} + > + {Object.entries(options).map((option) => ( + + ))} + + +
+ ) +} + +DisaggregationSelector.propTypes = { + currentValue: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired, +} + +const DataElementSelector = ({ displayNameProp, onDoubleClick }) => { + const dataEngine = useDataEngine() + + const [searchTerm, setSearchTerm] = useState('') + const [group, setGroup] = useState(DIMENSION_TYPE_ALL) + const [subGroup, setSubGroup] = useState(TOTALS) + const [options, setOptions] = useState([]) + const [loading, setLoading] = useState(true) + + const { isSorting } = useSortable({}) + + const rootRef = useRef() + const hasNextPageRef = useRef(false) + const searchTermRef = useRef(searchTerm) + const pageRef = useRef(0) + const filterRef = useRef({ + dataType: DIMENSION_TYPE_DATA_ELEMENT, + group, + subGroup, + }) + + const fetchData = async (scrollToTop) => { + try { + setLoading(true) + + const result = await apiFetchOptions({ + dataEngine, + nameProp: displayNameProp, + filter: filterRef.current, + searchTerm: searchTermRef.current, + page: pageRef.current, + }) + + if (result?.dimensionItems) { + const newOptions = result.dimensionItems.map((item) => ({ + label: item.name, + value: item.id, + type: item.dimensionItemType, + expression: item.expression, + })) + + setOptions((prevOptions) => + pageRef.current > 1 + ? [...prevOptions, ...newOptions] + : newOptions + ) + + setLoading(false) + } + + hasNextPageRef.current = result?.nextPage ? true : false + } catch (error) { + // TODO handle errors + console.log('apiFetchOptions error: ', error) + } finally { + if (scrollToTop) { + rootRef.current.scrollTo({ + top: 0, + }) + } + } + } + + const debouncedFetchData = useDebounceCallback((newSearchTerm) => { + hasNextPageRef.current = false + pageRef.current = 1 + searchTermRef.current = newSearchTerm + + fetchData(true) + }, 500) + + const onSearchChange = ({ value }) => { + const newSearchTerm = value + + setSearchTerm(newSearchTerm) + + // debounce the fetch + debouncedFetchData(newSearchTerm) + } + + const onFilterChange = (newFilter) => { + if (newFilter.group) { + setGroup(newFilter.group) + + filterRef.current.group = newFilter.group + } + + if (newFilter.subGroup) { + setSubGroup(newFilter.subGroup) + filterRef.current.subGroup = newFilter.subGroup + } + + hasNextPageRef.current = false + pageRef.current = 1 + + fetchData(true) + } + + const onEndReached = ({ isIntersecting }) => { + if (isIntersecting) { + // if hasNextPage is set it means at least 1 request already happened and there is + // another page, fetch the next page + if (hasNextPageRef.current) { + pageRef.current += 1 + + fetchData() + } else if (pageRef.current === 0) { + // this is for fetching the initial page + pageRef.current = 1 + + fetchData() + } + } + } + + return ( + <> +
+

{i18n.t('Data elements')}

+ +
+ onFilterChange({ group })} + displayNameProp={displayNameProp} + /> + onFilterChange({ subGroup })} + /> +
+
+
+ {loading && ( +
+ +
+ )} +
{ + if (isSorting) { + rootRef.current.scrollTo({ + top: 0, + }) + } + }} + > +
+ {Boolean(options.length) && + options.map(({ label, value }) => ( + + ))} + {!loading && !options.length && ( +
+ {searchTermRef.current + ? i18n.t( + 'No data elements found for "{{- searchTerm}}"', + { searchTerm: searchTermRef.current } + ) + : i18n.t('No data elements found')} +
+ )} +
+ +
+
+
+
+ + + ) +} + +DataElementSelector.propTypes = { + displayNameProp: PropTypes.string.isRequired, + onDoubleClick: PropTypes.func.isRequired, +} + +export default DataElementSelector diff --git a/src/components/DataDimension/Calculation/DndContext.js b/src/components/DataDimension/Calculation/DndContext.js new file mode 100644 index 000000000..846835894 --- /dev/null +++ b/src/components/DataDimension/Calculation/DndContext.js @@ -0,0 +1,192 @@ +import { + DndContext, + DragOverlay, + useSensor, + useSensors, + PointerSensor as DndKitPointerSensor, +} from '@dnd-kit/core' +import PropTypes from 'prop-types' +import React, { useState } from 'react' +import DraggingItem from './DraggingItem.js' + +export const OPTIONS_PANEL = 'Sortable' + +const getIntersectionRatio = (entry, target) => { + const top = Math.max(target.top, entry.top) + const left = Math.max(target.left, entry.left) + const right = Math.min(target.left + target.width, entry.left + entry.width) + const bottom = Math.min( + target.top + target.height, + entry.top + entry.height + ) + const width = right - left + const height = bottom - top + + if (left < right && top < bottom) { + const targetArea = target.width * target.height + const entryArea = entry.width * entry.height + const intersectionArea = width * height + const intersectionRatio = + intersectionArea / (targetArea + entryArea - intersectionArea) + return Number(intersectionRatio.toFixed(4)) + } // Rectangles do not overlap, or overlap has an area of zero (edge/corner overlap) + + return 0 +} +const sortCollisionsDesc = ({ data: { value: a } }, { data: { value: b } }) => { + return b - a +} + +const rectIntersectionCustom = ({ + pointerCoordinates, + droppableContainers, +}) => { + // create a rect around the pointerCoords for calculating the intersection + + const pointerRectWidth = 40 + const pointerRectHeight = 40 + const pointerRect = { + width: pointerRectWidth, + height: pointerRectHeight, + top: pointerCoordinates.y - pointerRectHeight / 2, + bottom: pointerCoordinates.y + pointerRectHeight / 2, + left: pointerCoordinates.x - pointerRectWidth / 2, + right: pointerCoordinates.x + pointerRectWidth / 2, + } + const collisions = [] + + for (const droppableContainer of droppableContainers) { + const { + id, + rect: { current: rect }, + } = droppableContainer + + if (rect) { + const intersectionRatio = getIntersectionRatio(rect, pointerRect) + + if (intersectionRatio > 0) { + collisions.push({ + id, + data: { + droppableContainer, + value: intersectionRatio, + }, + }) + } + } + } + + return collisions.sort(sortCollisionsDesc) +} + +const isInteractiveElement = (el) => { + const interactiveElements = [ + 'button', + 'input', + 'textarea', + 'select', + 'option', + ] + + if (interactiveElements.includes(el.tagName.toLowerCase())) { + return true + } + + return false +} + +// disable dragging if user is in an input +class PointerSensor extends DndKitPointerSensor { + static activators = [ + { + eventName: 'onPointerDown', + handler: ({ nativeEvent: event }) => { + if ( + !event.isPrimary || + event.button !== 0 || + isInteractiveElement(event.target) + ) { + return false + } + + return true + }, + }, + ] +} + +const OuterDndContext = ({ children, onDragEnd, onDragStart }) => { + const [draggingItem, setDraggingItem] = useState(null) + const sensor = useSensor(PointerSensor, { + activationConstraint: { + distance: 15, + }, + }) + const sensors = useSensors(sensor) + + const handleDragStart = ({ active }) => { + setDraggingItem(active.data.current) + onDragStart && onDragStart() + } + + const handleDragCancel = () => { + setDraggingItem(null) + } + + const handleDragEnd = ({ active, over }) => { + if ( + !over?.id || + over?.data?.current?.sortable?.containerId === OPTIONS_PANEL || + !active.data.current + ) { + // dropped over non-droppable or over options panel + handleDragCancel() + return + } + + const item = { + id: active.id, + sourceContainerId: active.data.current.sortable.containerId, + sourceIndex: active.data.current.sortable.index, + data: { + label: active.data.current.label, + value: active.data.current.value, + type: active.data.current.type, + }, + } + const destination = { + containerId: over.data.current?.sortable.containerId || over.id, + index: over.data.current?.sortable.index, + } + + onDragEnd({ item, destination }) + setDraggingItem(null) + } + + return ( + + {children} + + {draggingItem ? ( + + + + ) : null} + + + ) +} + +OuterDndContext.propTypes = { + onDragEnd: PropTypes.func.isRequired, + children: PropTypes.node, + onDragStart: PropTypes.func, +} + +export default OuterDndContext diff --git a/src/components/DataDimension/Calculation/DragHandleIcon.js b/src/components/DataDimension/Calculation/DragHandleIcon.js new file mode 100644 index 000000000..e68b1f0f4 --- /dev/null +++ b/src/components/DataDimension/Calculation/DragHandleIcon.js @@ -0,0 +1,16 @@ +import React from 'react' + +export default ( + + + +) diff --git a/src/components/DataDimension/Calculation/DraggingItem.js b/src/components/DataDimension/Calculation/DraggingItem.js new file mode 100644 index 000000000..8463f10da --- /dev/null +++ b/src/components/DataDimension/Calculation/DraggingItem.js @@ -0,0 +1,46 @@ +import cx from 'classnames' +import PropTypes from 'prop-types' +import React from 'react' +import { DIMENSION_TYPE_DATA_ELEMENT } from '../../../modules/dataTypes.js' +import { getIcon } from '../../../modules/dimensionListItem.js' +import { + EXPRESSION_TYPE_DATA, + EXPRESSION_TYPE_NUMBER, + EXPRESSION_TYPE_OPERATOR, +} from '../../../modules/expressions.js' +import styles from './styles/DraggingItem.style.js' +import formulaItemStyles from './styles/FormulaItem.style.js' + +const DraggingItem = ({ label, type, value }) => { + const displayLabel = + type === EXPRESSION_TYPE_NUMBER ? value || label : label + + return ( + <> +
+ {type === EXPRESSION_TYPE_DATA && ( + + {getIcon(DIMENSION_TYPE_DATA_ELEMENT)} + + )} + {displayLabel} +
+ + + + ) +} + +DraggingItem.propTypes = { + label: PropTypes.string, + type: PropTypes.string, + value: PropTypes.string, +} + +export default DraggingItem diff --git a/src/components/DataDimension/Calculation/DropZone.js b/src/components/DataDimension/Calculation/DropZone.js new file mode 100644 index 000000000..2cfa69281 --- /dev/null +++ b/src/components/DataDimension/Calculation/DropZone.js @@ -0,0 +1,38 @@ +import { useDroppable } from '@dnd-kit/core' +import cx from 'classnames' +import PropTypes from 'prop-types' +import React from 'react' +import styles from './styles/DropZone.style.js' + +const DropZone = ({ firstElementId, overLastDropZone }) => { + const { isOver, setNodeRef, active } = useDroppable({ + id: 'firstdropzone', + }) + + let draggingOver = false + if (overLastDropZone && !firstElementId) { + draggingOver = true + } else { + draggingOver = firstElementId === active?.id ? false : isOver + } + + return ( + <> +
+ + + ) +} + +DropZone.propTypes = { + firstElementId: PropTypes.string, + overLastDropZone: PropTypes.bool, +} + +export default DropZone diff --git a/src/components/DataDimension/Calculation/FormulaField.js b/src/components/DataDimension/Calculation/FormulaField.js new file mode 100644 index 000000000..388394deb --- /dev/null +++ b/src/components/DataDimension/Calculation/FormulaField.js @@ -0,0 +1,106 @@ +import i18n from '@dhis2/d2-i18n' +import { Center, CircularLoader } from '@dhis2/ui' +import { useDroppable } from '@dnd-kit/core' +import { SortableContext } from '@dnd-kit/sortable' +import PropTypes from 'prop-types' +import React from 'react' +import FormulaIcon from '../../../assets/FormulaIcon.js' +import DropZone from './DropZone.js' +import FormulaItem from './FormulaItem.js' +import styles from './styles/FormulaField.style.js' + +export const LAST_DROPZONE_ID = 'lastdropzone' +export const FORMULA_BOX_ID = 'formulabox' + +const Placeholder = () => ( +
+ + + {i18n.t( + 'Drag items here, or double click in the list, to start building a calculation formula' + )} + + +
+) + +const FormulaField = ({ + items = [], + selectedItemId, + focusItemId, + onChange, + onClick, + onDoubleClick, + loading, +}) => { + const { over, setNodeRef: setLastDropzoneRef } = useDroppable({ + id: LAST_DROPZONE_ID, + }) + + const itemIds = items.map((item) => item.id) + + const overLastDropZone = over?.id === LAST_DROPZONE_ID + + return ( +
+
+
+ {loading && ( +
+ +
+ )} + {!loading && itemIds && ( + + + {!items.length && } + {Boolean(items.length) && + items.map(({ id, label, type, value }, index) => ( + + ))} + + )} +
+ +
+ ) +} + +FormulaField.propTypes = { + onChange: PropTypes.func.isRequired, + onClick: PropTypes.func.isRequired, + onDoubleClick: PropTypes.func.isRequired, + focusItemId: PropTypes.string, + items: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.string, + label: PropTypes.string, + type: PropTypes.string, + value: PropTypes.string, + }) + ), + loading: PropTypes.bool, + selectedItemId: PropTypes.string, +} + +export default FormulaField diff --git a/src/components/DataDimension/Calculation/FormulaItem.js b/src/components/DataDimension/Calculation/FormulaItem.js new file mode 100644 index 000000000..45e1a1f88 --- /dev/null +++ b/src/components/DataDimension/Calculation/FormulaItem.js @@ -0,0 +1,223 @@ +import { Tooltip } from '@dhis2/ui' +import { useSortable } from '@dnd-kit/sortable' +import { CSS } from '@dnd-kit/utilities' +import cx from 'classnames' +import PropTypes from 'prop-types' +import React, { useState, useRef, useEffect } from 'react' +import { DIMENSION_TYPE_DATA_ELEMENT } from '../../../modules/dataTypes.js' +import { getIcon } from '../../../modules/dimensionListItem.js' +import { + EXPRESSION_TYPE_NUMBER, + EXPRESSION_TYPE_DATA, +} from '../../../modules/expressions.js' +import DragHandleIcon from './DragHandleIcon.js' +import styles from './styles/FormulaItem.style.js' + +const BEFORE = 'BEFORE' +const AFTER = 'AFTER' + +const maxMsBetweenClicks = 300 + +const TAG_INPUT = 'INPUT' + +const FormulaItem = ({ + id, + label, + value = '', + type, + isLast, + isHighlighted, + overLastDropZone, + onChange, + onClick, + onDoubleClick, + hasFocus, +}) => { + const { + attributes, + listeners, + index, + isDragging, + over, + active, + setNodeRef, + transform, + transition, + } = useSortable({ + id, + data: { label, type, value }, + }) + + const inputRef = useRef(null) + + const [clickTimeoutId, setClickTimeoutId] = useState(null) + + useEffect(() => { + if (hasFocus && inputRef.current) { + // setTimeout seems to be needed in order for the cursor + // to remain in the input. Without it, the cursor disappears + // even though the input still has the focus. + setTimeout(() => { + inputRef.current.focus() + }, 50) + } + }, [inputRef, hasFocus]) + + const activeIndex = active?.data.current.sortable.index || -1 + + const style = transform + ? { + transform: active + ? undefined + : CSS.Translate.toString({ + x: transform.x, + y: transform.y, + scaleX: 1, + scaleY: 1, + }), + transition, + } + : undefined + + let insertPosition + if (over?.id === id) { + // This item is being hovered over by the item being dragged + if (activeIndex === -1) { + //The item being dragged came from the expression options + // so we will insert after + insertPosition = AFTER + } else { + // The item being dragged is being moved in the formula + // so if the item is before the item being dragged, use the + // BEFORE position. Otherwise use the AFTER position + insertPosition = index > activeIndex ? AFTER : BEFORE + } + } else if (isLast && overLastDropZone) { + insertPosition = AFTER + } + + const handleClick = (e) => { + const tagname = e.target.tagName + clearTimeout(clickTimeoutId) + const to = setTimeout(function () { + if (tagname !== TAG_INPUT) { + onClick(id) + } else { + inputRef.current && inputRef.current.focus() + } + }, maxMsBetweenClicks) + setClickTimeoutId(to) + } + + const handleDoubleClick = (e) => { + clearTimeout(clickTimeoutId) + setClickTimeoutId(null) + if (e.target.tagName !== TAG_INPUT) { + onDoubleClick(id) + } else { + inputRef.current && inputRef.current.focus() + } + } + + const handleChange = (e) => onChange({ itemId: id, value: e.target.value }) + + const getContent = () => { + if (type === EXPRESSION_TYPE_NUMBER) { + return ( +
+ {DragHandleIcon} + + + + + +
+ ) + } + + if (type === EXPRESSION_TYPE_DATA) { + return ( + +
+ + {getIcon(DIMENSION_TYPE_DATA_ELEMENT)} + + {label} + +
+
+ ) + } + + return ( +
+ {label} + +
+ ) + } + + return ( + <> +
+
+ {getContent()} +
+
+ + + ) +} + +FormulaItem.propTypes = { + id: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + type: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired, + onClick: PropTypes.func.isRequired, + onDoubleClick: PropTypes.func.isRequired, + hasFocus: PropTypes.bool, + isHighlighted: PropTypes.bool, + isLast: PropTypes.bool, + overLastDropZone: PropTypes.bool, + value: PropTypes.string, +} + +export default FormulaItem diff --git a/src/components/DataDimension/Calculation/MathOperatorSelector.js b/src/components/DataDimension/Calculation/MathOperatorSelector.js new file mode 100644 index 000000000..d87689f6a --- /dev/null +++ b/src/components/DataDimension/Calculation/MathOperatorSelector.js @@ -0,0 +1,33 @@ +import PropTypes from 'prop-types' +import React from 'react' +import i18n from '../../../locales/index.js' +import { getOperators } from '../../../modules/expressions.js' +import DraggableOperator from './Operator.js' +import styles from './styles/MathOperatorSelector.style.js' + +const MathOperatorSelector = ({ onDoubleClick }) => ( + <> +
+

{i18n.t('Math operators')}

+
+ {getOperators().map(({ label, value, type }, index) => ( + + ))} +
+
+ + +) + +MathOperatorSelector.propTypes = { + onDoubleClick: PropTypes.func.isRequired, +} + +export default MathOperatorSelector diff --git a/src/components/DataDimension/Calculation/Operator.js b/src/components/DataDimension/Calculation/Operator.js new file mode 100644 index 000000000..2bd46479b --- /dev/null +++ b/src/components/DataDimension/Calculation/Operator.js @@ -0,0 +1,48 @@ +import { useSortable } from '@dnd-kit/sortable' +import { CSS } from '@dnd-kit/utilities' +import cx from 'classnames' +import PropTypes from 'prop-types' +import React from 'react' +import { + EXPRESSION_TYPE_NUMBER, + EXPRESSION_TYPE_OPERATOR, +} from '../../../modules/expressions.js' +import formulaItemStyles from './styles/FormulaItem.style.js' +import styles from './styles/Operator.style.js' + +const Operator = ({ label, value, type, onDoubleClick }) => { + const data = { label, value, type } + const { attributes, listeners, setNodeRef, transform } = useSortable({ + id: `operator-${label}`, + data, + }) + const style = { + transform: CSS.Translate.toString(transform), + } + + return ( +
+
onDoubleClick(data)} + > + {label} +
+ + +
+ ) +} + +Operator.propTypes = { + label: PropTypes.string.isRequired, + type: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + onDoubleClick: PropTypes.func.isRequired, +} + +export default Operator diff --git a/src/components/DataDimension/Calculation/styles/CalculationModal.style.js b/src/components/DataDimension/Calculation/styles/CalculationModal.style.js new file mode 100644 index 000000000..a15c19c14 --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/CalculationModal.style.js @@ -0,0 +1,68 @@ +import { colors, spacers } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .header { + background: ${colors.grey200}; + padding: ${spacers.dp16}; + font-weight: normal; + } + + .header-icon { + padding: 0 ${spacers.dp8}; + vertical-align: text-bottom; + line-height: 14px; + } + + .actions-wrapper { + margin-top: ${spacers.dp16}; + margin-bottom: ${spacers.dp16}; + margin-left: ${spacers.dp4}; + } + + .button-container { + display: inline-flex; + } + + .validate-button { + margin-bottom: ${spacers.dp4}; + } + + .remove-button { + margin-right: ${spacers.dp8}; + } + + .delete-button { + margin-right: ${spacers.dp8}; + } + + .content { + display: flex; + } + + .left-section { + width: 45%; + } + + .right-section { + width: 55%; + padding-left: ${spacers.dp8}; + font-size: 14px; + } + + .validation-message { + margin-left: ${spacers.dp8}; + } + + .validation-error { + color: ${colors.red500}; + } + + .validation-success { + color: ${colors.green500}; + } + + .name-input { + margin-top: ${spacers.dp12}; + } +` diff --git a/src/components/DataDimension/Calculation/styles/DataElementOption.style.js b/src/components/DataDimension/Calculation/styles/DataElementOption.style.js new file mode 100644 index 000000000..f3333d726 --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/DataElementOption.style.js @@ -0,0 +1,41 @@ +import { spacers, colors } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .wrapper { + margin-top: ${spacers.dp4}; + } + + .wrapper:last-child { + margin-bottom: ${spacers.dp4}; + } + .draggable-item { + cursor: pointer; + display: inline-flex; + } + + .chip { + display: inline-flex; + background: ${colors.grey200}; + font-size: 14px; + padding: 2px ${spacers.dp8} 2px 2px; + border-radius: 3px; + user-select: none; + } + + .chip:hover { + background: ${colors.grey300}; + } + + .icon, + .label { + line-height: 18px; + } + + .icon { + margin-right: 2px; + display: inline-flex; + vertical-align: text-bottom; + padding-top: 1px; + } +` diff --git a/src/components/DataDimension/Calculation/styles/DataElementSelector.style.js b/src/components/DataDimension/Calculation/styles/DataElementSelector.style.js new file mode 100644 index 000000000..f3f5211bd --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/DataElementSelector.style.js @@ -0,0 +1,79 @@ +import { colors, spacers } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .dimension-list-container { + position: relative; + } + + .dimension-list-scrollbox { + position: relative; + width: 100%; + height: 337px; + overflow: hidden; + overflow-y: auto; + border: 1px solid ${colors.grey400}; + } + + .dimension-list-scroller { + position: relative; + min-height: 1px; + padding: 0 ${spacers.dp4}; + } + + .dimension-list-scroller.loading { + filter: blur(2px); + } + + .scroll-detector { + boxsizing: border-box; + width: 100%; + height: 100px; + position: absolute; + bottom: 0; + left: 0; + z-index: -1; + } + + .dimension-list-overlay { + position: absolute; + width: 100%; + height: 100%; + z-index: 2; + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + } + + .filter-wrapper { + padding: ${spacers.dp8}; + border: 1px solid ${colors.grey400}; + border-bottom: 0; + } + + .selector-wrapper { + display: flex; + gap: ${spacers.dp4}; + } + + .sub-header { + font-size: 14px; + font-weight: normal; + margin: 0 0 ${spacers.dp4}; + } + + .group-select { + width: 50%; + margin-top: ${spacers.dp4}; + } + + .empty-list { + text-align: center; + font-size: 14px; + line-height: 16px; + margin: ${spacers.dp24} 0 0; + color: ${colors.grey700}; + } +` diff --git a/src/components/DataDimension/Calculation/styles/DraggingItem.style.js b/src/components/DataDimension/Calculation/styles/DraggingItem.style.js new file mode 100644 index 000000000..60ed94da3 --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/DraggingItem.style.js @@ -0,0 +1,13 @@ +import { colors, spacers } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .dragging { + border: 2px solid ${colors.blue500}; + cursor: grab; + } + + .number { + padding: 0 ${spacers.dp8}; + } +` diff --git a/src/components/DataDimension/Calculation/styles/DropZone.style.js b/src/components/DataDimension/Calculation/styles/DropZone.style.js new file mode 100644 index 000000000..3e21fbc12 --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/DropZone.style.js @@ -0,0 +1,52 @@ +import { colors } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .first-dropzone { + position: absolute; + top: 0; + left: 0; + z-index: -1; + width: 24px; + height: 28px; + background-color: transparent; + } + + .dragging-over { + z-index: 100; + } + + .empty { + position: relative; + flex-grow: 1; + z-index: 100; + margin-left: -10px; + margin-top: -4px; + } + + .dragging-over::before, + .dragging-over::after { + content: ''; + position: absolute; + } + + /* the vertical line */ + .dragging-over::before { + top: 10px; + width: 4px; + left: 4px; + height: 18px; + background-color: ${colors.blue500}; + } + + /* the circle */ + .dragging-over::after { + top: 0; + left: 0; + width: 12px; + height: 12px; + border: 4px solid ${colors.blue500}; + background: transparent; + border-radius: 12px; + } +` diff --git a/src/components/DataDimension/Calculation/styles/FormulaField.style.js b/src/components/DataDimension/Calculation/styles/FormulaField.style.js new file mode 100644 index 000000000..24b120ec5 --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/FormulaField.style.js @@ -0,0 +1,51 @@ +import { colors, spacers } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .formula-field { + border-right: 2px solid ${colors.grey200}; + height: 180px; + overflow: auto; + padding: 6px 12px; + position: relative; + display: flex; + align-items: flex-start; + align-content: flex-start; + flex-wrap: wrap; + gap: ${spacers.dp4} ${spacers.dp8}; + width: 100%; + } + + .container { + position: relative; + } + + .border { + position: absolute; + top: 0; + left: 6px; + height: 180px; + width: calc(100% - 6px); + border-left: 2px solid ${colors.grey200}; + border-top: 2px solid ${colors.grey200}; + border-bottom: 2px solid ${colors.grey200}; + } + + .placeholder { + height: 100%; + display: flex; + flex-direction: column; + gap: ${spacers.dp8}; + align-items: center; + justify-content: center; + margin-top: -28px; + padding: 0 ${spacers.dp32}; + } + + .help-text { + color: ${colors.grey600}; + font-size: 14px; + line-height: 19px; + user-select: none; + } +` diff --git a/src/components/DataDimension/Calculation/styles/FormulaItem.style.js b/src/components/DataDimension/Calculation/styles/FormulaItem.style.js new file mode 100644 index 000000000..6b0998960 --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/FormulaItem.style.js @@ -0,0 +1,149 @@ +import { colors, spacers, theme } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .formula-item { + position: relative; + display: flex; + align-items: center; + width: fit-content; + } + + .formula-item:not(.inactive) { + opacity: 0.5; + } + + .content { + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + user-select: none; + height: 24px; + font-size: 14px; + border-radius: 3px; + background: ${colors.grey200}; + } + + .icon { + display: inline-flex; + margin-right: 2px; + } + + .operator { + padding: 0; + width: 24px; + } + + .data, + .number { + padding: 0 ${spacers.dp8} 0 2px; + } + + .operator .label { + margin-bottom: 1px; + } + + .data .label { + max-width: 280px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + + /* number input */ + + .number-positioner { + position: relative; + line-height: 18px; + } + + .number-width { + /* Add extra space for number spinner */ + padding: 0 24px 0 0; + visibility: hidden; + } + + .input { + position: absolute; + width: 100%; + left: 0; + background-color: transparent; + border: 1px dashed #a0adba; + padding: 0 0 0 2px; + } + + .input:hover, + .input:focus { + background: white; + border: 1px solid rgba(0, 0, 0, 0.2); + } + + /* highlighted items */ + + .highlighted { + background: ${theme.secondary800}; + color: ${colors.white}; + } + + .highlighted .input { + color: ${colors.white}; + } + + .highlighted .input:hover, + .highlighted .input:active, + .highlighted .input:focus { + color: ${colors.grey900}; + } + + .highlighted :global(.icon path) { + fill: ${colors.white}; + } + + /* DND markers */ + + .inactive.insertBefore .content::before, + .inactive.insertAfter .content::before, + .inactive.insertBefore .content::after, + .inactive.insertAfter .content::after { + content: ''; + position: absolute; + z-index: 100; + } + + /* the vertical line */ + .content::before { + top: 6px; + bottom: 0; + width: 4px; + background-color: ${colors.blue500}; + } + + /* the circle */ + .content::after { + top: -4px; + width: 12px; + height: 12px; + border: 4px solid ${colors.blue500}; + background: transparent; + border-radius: 12px; + } + + .last-item { + flex: 1; + } + + .insertBefore .content::before { + left: -6px; + } + .insertBefore .content::after { + left: -10px; + } + + .insertAfter .content::before { + right: -6px; + } + .insertAfter .content::after { + right: -10px; + } +` diff --git a/src/components/DataDimension/Calculation/styles/MathOperatorSelector.style.js b/src/components/DataDimension/Calculation/styles/MathOperatorSelector.style.js new file mode 100644 index 000000000..98c2214ee --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/MathOperatorSelector.style.js @@ -0,0 +1,23 @@ +import { colors, spacers } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .wrapper { + border: 1px solid ${colors.grey400}; + margin-top: ${spacers.dp8}; + } + + .operators { + display: flex; + flex-wrap: wrap; + gap: ${spacers.dp4}; + padding: ${spacers.dp4}; + border-top: 1px solid ${colors.grey400}; + } + + .sub-header { + font-size: 14px; + font-weight: normal; + margin: ${spacers.dp4} ${spacers.dp8}; + } +` diff --git a/src/components/DataDimension/Calculation/styles/Operator.style.js b/src/components/DataDimension/Calculation/styles/Operator.style.js new file mode 100644 index 000000000..71cb46519 --- /dev/null +++ b/src/components/DataDimension/Calculation/styles/Operator.style.js @@ -0,0 +1,13 @@ +import { colors, spacers } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export default css` + .number { + padding: 0 ${spacers.dp8}; + } + + .operator:hover, + .number:hover { + background: ${colors.grey300}; + } +` diff --git a/src/components/DataDimension/DataDimension.js b/src/components/DataDimension/DataDimension.js index 400c7bced..2ed618b35 100644 --- a/src/components/DataDimension/DataDimension.js +++ b/src/components/DataDimension/DataDimension.js @@ -1,14 +1,47 @@ +import { useConfig } from '@dhis2/app-runtime' import PropTypes from 'prop-types' -import React from 'react' +import React, { + createContext, + useContext, + useCallback, + useEffect, + useState, +} from 'react' +import { + dataTypeMap, + DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, +} from '../../modules/dataTypes.js' import { DIMENSION_ID_DATA } from '../../modules/predefinedDimensions.js' import ItemSelector from './ItemSelector.js' +const DataDimensionCtx = createContext({}) + const DataDimension = ({ onSelect, selectedDimensions, displayNameProp, + enabledDataTypes, infoBoxMessage, + onCalculationSave, + visType, }) => { + const { serverVersion } = useConfig() + + const filterDataTypesByVersion = useCallback( + (dataTypes) => + dataTypes.filter( + ({ id }) => + // Calculations only available from 2.40 + id !== DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM || + serverVersion.minor >= 40 + ), + [serverVersion.minor] + ) + + const [dataTypes, setDataTypes] = useState( + filterDataTypesByVersion(enabledDataTypes || Object.values(dataTypeMap)) + ) + const onSelectItems = (selectedItem) => onSelect({ dimensionId: DIMENSION_ID_DATA, @@ -16,22 +49,36 @@ const DataDimension = ({ id: item.value, name: item.label, type: item.type, + expression: item.expression, })), }) + useEffect( + () => + enabledDataTypes && + setDataTypes(filterDataTypesByVersion(enabledDataTypes)), + [enabledDataTypes, filterDataTypesByVersion] + ) + return ( - ({ - value: item.id, - label: item.name, - isActive: item.isActive, - type: item.type, - }))} - onSelect={onSelectItems} - displayNameProp={displayNameProp} - infoBoxMessage={infoBoxMessage} - dataTest={'data-dimension'} - /> + + ({ + value: item.id, + label: item.name, + isActive: item.isActive, + type: item.type, + expression: item.expression, + access: item.access, + }))} + onSelect={onSelectItems} + displayNameProp={displayNameProp} + infoBoxMessage={infoBoxMessage} + dataTest={'data-dimension'} + dataTypes={dataTypes} + onEDISave={onCalculationSave} + /> + ) } @@ -39,12 +86,18 @@ DataDimension.propTypes = { displayNameProp: PropTypes.string.isRequired, selectedDimensions: PropTypes.arrayOf( PropTypes.shape({ + expression: PropTypes.string, id: PropTypes.string, + isActive: PropTypes.bool, name: PropTypes.string, + type: PropTypes.string, }) ).isRequired, onSelect: PropTypes.func.isRequired, + enabledDataTypes: PropTypes.array, infoBoxMessage: PropTypes.string, + visType: PropTypes.string, + onCalculationSave: PropTypes.func, } DataDimension.defaultProps = { @@ -52,4 +105,6 @@ DataDimension.defaultProps = { onSelect: Function.prototype, } +export const useDataDimensionContext = () => useContext(DataDimensionCtx) + export default DataDimension diff --git a/src/components/DataDimension/DataTypeSelector.js b/src/components/DataDimension/DataTypeSelector.js index e63db1e9c..62d273097 100644 --- a/src/components/DataDimension/DataTypeSelector.js +++ b/src/components/DataDimension/DataTypeSelector.js @@ -2,44 +2,88 @@ import { SingleSelectField, SingleSelectOption } from '@dhis2/ui' import PropTypes from 'prop-types' import React from 'react' import i18n from '../../locales/index.js' -import { - DIMENSION_TYPE_ALL, - dataTypeMap as dataTypes, -} from '../../modules/dataTypes.js' +import { DIMENSION_TYPE_ALL, dataTypeMap } from '../../modules/dataTypes.js' +import { getDisplayNameByVisType } from '../../modules/visTypes.js' +import { useDataDimensionContext } from './DataDimension.js' import styles from './styles/DataTypeSelector.style.js' -const DataTypeSelector = ({ currentDataType, onChange, dataTest }) => ( -
- onChange(ref.selected)} - dense - > - - {Object.values(dataTypes).map((type) => ( - - ))} - - -
-) +const DataTypeSelector = ({ + currentDataType, + dataTypes, + onChange, + dataTest, +}) => { + const { visType } = useDataDimensionContext() + const label = i18n.t('Data Type') + + return ( +
+ {dataTypes.length === 1 ? ( + onChange(ref.selected)} + dense + disabled={true} + helpText={ + visType + ? i18n.t( + 'Only {{dataType}} can be used in {{visType}}', + { + dataType: + dataTypeMap[ + dataTypes[0].id + ].getName(), + visType: getDisplayNameByVisType(visType), + } + ) + : '' + } + > + {dataTypes.map((type) => ( + + ))} + + ) : ( + onChange(ref.selected)} + dense + > + + {dataTypes.map((type) => ( + + ))} + + )} + +
+ ) +} DataTypeSelector.propTypes = { currentDataType: PropTypes.string.isRequired, onChange: PropTypes.func.isRequired, dataTest: PropTypes.string, + dataTypes: PropTypes.array, } export default DataTypeSelector diff --git a/src/components/DataDimension/GroupSelector.js b/src/components/DataDimension/GroupSelector.js index 7b6173b42..d20fd866c 100644 --- a/src/components/DataDimension/GroupSelector.js +++ b/src/components/DataDimension/GroupSelector.js @@ -28,20 +28,20 @@ const GroupSelector = ({ const defaultGroup = dataTypes[dataType]?.defaultGroup const subGroupType = dataTypes[dataType]?.subGroup - const fetchGroups = async () => { - setIsLoading(true) - const result = await apiFetchGroups( - dataEngine, - dataType, - displayNameProp - ) - setGroups(result) - setIsLoading(false) - } - useEffect(() => { + const fetchGroups = async () => { + setIsLoading(true) + const result = await apiFetchGroups( + dataEngine, + dataType, + displayNameProp + ) + setGroups(result) + setIsLoading(false) + } + fetchGroups() - }, [dataType]) + }, [dataEngine, dataType, displayNameProp]) return (
diff --git a/src/components/DataDimension/ItemSelector.js b/src/components/DataDimension/ItemSelector.js index e02d14fb8..5c36b478a 100644 --- a/src/components/DataDimension/ItemSelector.js +++ b/src/components/DataDimension/ItemSelector.js @@ -1,33 +1,21 @@ import { useDataEngine } from '@dhis2/app-runtime' -import { - Transfer, - InputField, - IconInfo16, - IconDimensionDataSet16, - IconDimensionIndicator16, - IconDimensionEventDataItem16, - IconDimensionProgramIndicator16, -} from '@dhis2/ui' +import { Transfer, InputField, IconInfo16, Button, IconAdd24 } from '@dhis2/ui' import PropTypes from 'prop-types' import React, { useState } from 'react' import { apiFetchOptions } from '../../api/dimensions.js' -import DataElementIcon from '../../assets/DimensionItemIcons/DataElementIcon.js' -import GenericIcon from '../../assets/DimensionItemIcons/GenericIcon.js' import i18n from '../../locales/index.js' import { DATA_SETS_CONSTANTS, REPORTING_RATE } from '../../modules/dataSets.js' import { - dataTypeMap as dataTypes, DIMENSION_TYPE_ALL, DIMENSION_TYPE_DATA_ELEMENT, - DIMENSION_TYPE_DATA_ELEMENT_OPERAND, DIMENSION_TYPE_DATA_SET, DIMENSION_TYPE_EVENT_DATA_ITEM, DIMENSION_TYPE_PROGRAM_INDICATOR, DIMENSION_TYPE_INDICATOR, TOTALS, - DIMENSION_TYPE_PROGRAM_DATA_ELEMENT, - DIMENSION_TYPE_PROGRAM_ATTRIBUTE, + DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, } from '../../modules/dataTypes.js' +import { getIcon, getTooltipText } from '../../modules/dimensionListItem.js' import { TRANSFER_HEIGHT, TRANSFER_OPTIONS_WIDTH, @@ -36,6 +24,7 @@ import { import { useDebounce, useDidUpdateEffect } from '../../modules/utils.js' import styles from '../styles/DimensionSelector.style.js' import { TransferOption } from '../TransferOption.js' +import CalculationModal from './Calculation/CalculationModal.js' import DataTypeSelector from './DataTypeSelector.js' import GroupSelector from './GroupSelector.js' @@ -43,12 +32,14 @@ const LeftHeader = ({ searchTerm, setSearchTerm, dataType, + dataTypes, setDataType, group, setGroup, subGroup, setSubGroup, displayNameProp, + dataTest, }) => ( <> @@ -66,8 +57,12 @@ const LeftHeader = ({ currentDataType={dataType} onChange={setDataType} dataTest={`${dataTest}-data-types-select-field`} + dataTypes={dataTypes} /> - {dataTypes[dataType] && ( + {![ + DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, + DIMENSION_TYPE_ALL, + ].includes(dataType) && ( ( ) -const RightHeader = ({ infoText }) => ( + +const RightHeader = ({ infoBoxMessage }) => ( <>

{i18n.t('Selected Items')}

- {infoText && ( + {infoBoxMessage && (
- {infoText} + {infoBoxMessage}
)} ) + RightHeader.propTypes = { - infoText: PropTypes.string, + infoBoxMessage: PropTypes.string, } + const SourceEmptyPlaceholder = ({ loading, searchTerm, @@ -148,6 +147,9 @@ const SourceEmptyPlaceholder = ({ case DIMENSION_TYPE_PROGRAM_INDICATOR: message = i18n.t('No program indicators found') break + case DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM: + message = i18n.t('No calculations found') + break default: message = i18n.t('No data') break @@ -157,41 +159,43 @@ const SourceEmptyPlaceholder = ({ switch (dataType) { case DIMENSION_TYPE_INDICATOR: message = i18n.t('No indicators found for "{{- searchTerm}}"', { - searchTerm: searchTerm, + searchTerm, }) break case DIMENSION_TYPE_DATA_ELEMENT: message = i18n.t( 'No data elements found for "{{- searchTerm}}"', { - searchTerm: searchTerm, + searchTerm, } ) break case DIMENSION_TYPE_DATA_SET: message = i18n.t('No data sets found for "{{- searchTerm}}"', { - searchTerm: searchTerm, + searchTerm, }) break case DIMENSION_TYPE_EVENT_DATA_ITEM: message = i18n.t( 'No event data items found for "{{- searchTerm}}"', - { - searchTerm: searchTerm, - } + { searchTerm } ) break case DIMENSION_TYPE_PROGRAM_INDICATOR: message = i18n.t( 'No program indicators found for "{{- searchTerm}}"', - { - searchTerm: searchTerm, - } + { searchTerm } + ) + break + case DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM: + message = i18n.t( + 'No calculations found for "{{- searchTerm}}"', + { searchTerm } ) break default: message = i18n.t('Nothing found for "{{- searchTerm}}"', { - searchTerm: searchTerm, + searchTerm, }) break } @@ -224,24 +228,42 @@ const ItemSelector = ({ rightFooter, displayNameProp, infoBoxMessage, + dataTypes, dataTest, + onEDISave, }) => { const [state, setState] = useState({ searchTerm: '', + dataTypes, filter: { - dataType: DIMENSION_TYPE_ALL, + dataType: + dataTypes.length === 1 ? dataTypes[0].id : DIMENSION_TYPE_ALL, + group: null, + subGroup: + dataTypes.length === 1 && + dataTypes[0].id === DIMENSION_TYPE_DATA_ELEMENT + ? TOTALS + : null, }, options: [], loading: true, nextPage: 1, + supportsEDI: dataTypes + .map(({ id }) => id) + .includes(DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM), }) + const [currentCalculation, setCurrentCalculation] = useState() const dataEngine = useDataEngine() const setSearchTerm = (searchTerm) => setState((state) => ({ ...state, searchTerm })) - const setFilter = (filter) => setState((state) => ({ ...state, filter })) - const debouncedSearchTerm = useDebounce(state.searchTerm, 200) + const debouncedSearchTerm = useDebounce(state.searchTerm, 500) + const fetchItems = async (page) => { - setState((state) => ({ ...state, loading: true })) + setState((state) => ({ + ...state, + nextPage: page === 1 ? 1 : state.nextPage, + loading: true, + })) const result = await apiFetchOptions({ dataEngine, nameProp: displayNameProp, @@ -264,6 +286,7 @@ const ItemSelector = ({ value: `${item.id}.${metric.id}`, disabled: item.disabled, type: item.dimensionItemType, + expression: item.expression, }) } else { DATA_SETS_CONSTANTS.forEach((metric) => { @@ -272,6 +295,7 @@ const ItemSelector = ({ value: `${item.id}.${metric.id}`, disabled: item.disabled, type: item.dimensionItemType, + expression: item.expression, }) }) } @@ -281,6 +305,7 @@ const ItemSelector = ({ value: item.id, disabled: item.disabled, type: item.dimensionItemType, + expression: item.expression, }) } }) @@ -290,11 +315,11 @@ const ItemSelector = ({ options: page > 1 ? [...state.options, ...newOptions] : newOptions, nextPage: result.nextPage, })) - /* The following handles a very specific edge-case where the user can select all items from a - page and then reopen the modal. Usually Transfer triggers the onEndReached when the end of - the page is reached (scrolling down) or if too few items are on the left side (e.g. selecting - 49 items from page 1, leaving only 1 item on the left side). However, due to the way Transfer - works, if 0 items are available, more items are fetched, but all items are already selected + /* The following handles a very specific edge-case where the user can select all items from a + page and then reopen the modal. Usually Transfer triggers the onEndReached when the end of + the page is reached (scrolling down) or if too few items are on the left side (e.g. selecting + 49 items from page 1, leaving only 1 item on the left side). However, due to the way Transfer + works, if 0 items are available, more items are fetched, but all items are already selected (leaving 0 items on the left side still), the onReachedEnd won't trigger. Hence the code below: IF there is a next page AND some options were just fetched AND you have the same or more selected items than fetched items AND all fetched items are already selected -> fetch more! @@ -314,13 +339,9 @@ const ItemSelector = ({ } useDidUpdateEffect(() => { - setState((state) => ({ - ...state, - loading: true, - nextPage: 1, - })) fetchItems(1) }, [debouncedSearchTerm, state.filter]) + const onChange = (newSelected) => { onSelect( newSelected.map((value) => { @@ -331,6 +352,9 @@ const ItemSelector = ({ value, label: matchingItem.label, type: matchingItem.type, + ...(matchingItem.expression + ? { expression: matchingItem.expression } + : {}), } }) ) @@ -348,116 +372,173 @@ const ItemSelector = ({ [...state.options, ...selectedItems].find( (item) => item.value === value )?.type - const getTooltipText = (itemType) => { - switch (itemType) { - case DIMENSION_TYPE_DATA_ELEMENT_OPERAND: - return dataTypes[DIMENSION_TYPE_DATA_ELEMENT].getItemName() - case REPORTING_RATE: - return dataTypes[DIMENSION_TYPE_DATA_SET].getItemName() - case DIMENSION_TYPE_PROGRAM_DATA_ELEMENT: - case DIMENSION_TYPE_PROGRAM_ATTRIBUTE: - return dataTypes[DIMENSION_TYPE_EVENT_DATA_ITEM].getItemName() - default: - return dataTypes[itemType]?.getItemName() + + const onSaveCalculation = async ({ id, name, expression, isNew }) => { + onEDISave({ + id, + name, + expression, + type: DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, + }) + + // close the modal + setCurrentCalculation() + + // reload the list of options + fetchItems(1) + + if (isNew) { + // select the new calculation + onSelect([ + ...selectedItems, + { + value: id, + label: name, + expression, + type: DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, + }, + ]) } } - const getIcon = (itemType) => { - switch (itemType) { - case DIMENSION_TYPE_INDICATOR: - return - case DIMENSION_TYPE_DATA_ELEMENT_OPERAND: - case DIMENSION_TYPE_DATA_ELEMENT: - return DataElementIcon - case REPORTING_RATE: - return - case DIMENSION_TYPE_EVENT_DATA_ITEM: - case DIMENSION_TYPE_PROGRAM_DATA_ELEMENT: - case DIMENSION_TYPE_PROGRAM_ATTRIBUTE: - return - case DIMENSION_TYPE_PROGRAM_INDICATOR: - return - default: - return GenericIcon - } + + const onDeleteCalculation = ({ id }) => { + // close the modal + setCurrentCalculation() + + // reload the list of options + fetchItems(1) + + // unselect the deleted calculation + onSelect([...selectedItems.filter((item) => item.value !== id)]) } + + const onSetGroup = (group) => + setState((state) => ({ + ...state, + nextPage: 1, + filter: { + ...state.filter, + group, + }, + })) + + const onSetSubGroup = (subGroup) => + setState((state) => ({ + ...state, + nextPage: 1, + filter: { + ...state.filter, + subGroup, + }, + })) + + const onSetDataType = (dataType) => + setState((state) => ({ + ...state, + nextPage: 1, + filter: { + ...state.filter, + dataType, + group: null, + subGroup: + dataType === DIMENSION_TYPE_DATA_ELEMENT ? TOTALS : null, + }, + })) + return ( - onChange(selected)} - selected={selectedItems.map((item) => item.value)} - options={[...state.options, ...selectedItems]} - loading={state.loading} - loadingPicked={state.loading} - sourceEmptyPlaceholder={ - - } - onEndReached={onEndReached} - leftHeader={ - { - setFilter({ - ...state.filter, - dataType, - group: null, - subGroup: - dataType === DIMENSION_TYPE_DATA_ELEMENT - ? TOTALS - : null, - }) - }} - group={state.filter.group} - setGroup={(group) => { - setFilter({ ...state.filter, group }) - }} - subGroup={state.filter.subGroup} - setSubGroup={(subGroup) => { - setFilter({ ...state.filter, subGroup }) - }} - searchTerm={state.searchTerm} - setSearchTerm={setSearchTerm} + <> + onChange(selected)} + selected={selectedItems.map((item) => item.value)} + options={[...state.options, ...selectedItems]} + loading={state.loading} + loadingPicked={state.loading} + sourceEmptyPlaceholder={ + + } + onEndReached={onEndReached} + leftHeader={ + + } + leftFooter={ + state.supportsEDI ? ( +
+ +
+ ) : undefined + } + enableOrderChange + height={TRANSFER_HEIGHT} + optionsWidth={TRANSFER_OPTIONS_WIDTH} + selectedWidth={TRANSFER_SELECTED_WIDTH} + selectedEmptyComponent={} + rightHeader={} + rightFooter={rightFooter} + renderOption={(props) => ( + + setCurrentCalculation({ + id: props.value, + name: props.label, + expression: props.expression, + }) + : undefined + } + /* eslint-enable react/prop-types */ + /> + )} + dataTest={`${dataTest}-transfer`} + /> + {currentCalculation && state.supportsEDI && ( + setCurrentCalculation()} + onDelete={onDeleteCalculation} displayNameProp={displayNameProp} - dataTest={`${dataTest}-left-header`} - /> - } - enableOrderChange - height={TRANSFER_HEIGHT} - optionsWidth={TRANSFER_OPTIONS_WIDTH} - selectedWidth={TRANSFER_SELECTED_WIDTH} - selectedEmptyComponent={} - rightHeader={} - rightFooter={rightFooter} - renderOption={(props) => ( - )} - dataTest={`${dataTest}-transfer`} - /> + + ) } @@ -465,6 +546,7 @@ ItemSelector.propTypes = { displayNameProp: PropTypes.string.isRequired, onSelect: PropTypes.func.isRequired, dataTest: PropTypes.string, + dataTypes: PropTypes.array, infoBoxMessage: PropTypes.string, noItemsMessage: PropTypes.string, rightFooter: PropTypes.node, @@ -474,8 +556,10 @@ ItemSelector.propTypes = { value: PropTypes.string.isRequired, isActive: PropTypes.bool, type: PropTypes.string, + expression: PropTypes.string, }) ), + onEDISave: PropTypes.func, } ItemSelector.defaultProps = { diff --git a/src/components/DimensionsPanel/List/DimensionItem.js b/src/components/DimensionsPanel/List/DimensionItem.js index 5b3f58ec3..8f9e09933 100644 --- a/src/components/DimensionsPanel/List/DimensionItem.js +++ b/src/components/DimensionsPanel/List/DimensionItem.js @@ -1,12 +1,15 @@ -import { IconLock16 } from '@dhis2/ui' +import { CssVariables } from '@dhis2/ui' +import cx from 'classnames' import PropTypes from 'prop-types' import React, { Component, createRef } from 'react' import DynamicDimensionIcon from '../../../assets/DynamicDimensionIcon.js' -import { getPredefinedDimensionProp } from '../../../modules/predefinedDimensions.js' -import DimensionLabel from './DimensionLabel.js' +import { + DIMENSION_PROP_NO_ITEMS, + getPredefinedDimensionProp, +} from '../../../modules/predefinedDimensions.js' import OptionsButton from './OptionsButton.js' import RecommendedIcon from './RecommendedIcon.js' -import { styles } from './styles/DimensionItem.style.js' +import styles from './styles/DimensionItem.style.js' class DimensionItem extends Component { state = { mouseOver: false } @@ -25,26 +28,16 @@ class DimensionItem extends Component { getDimensionIcon = () => { const Icon = getPredefinedDimensionProp(this.props.id, 'icon') return Icon ? ( - + ) : ( - + ) } getDimensionType = () => { - const { id, name, isDeactivated } = this.props + const { id, name } = this.props - return ( - - {name} - - ) + return {name} } render() { @@ -57,64 +50,99 @@ class DimensionItem extends Component { onClick, onOptionsClick, innerRef, - style, dataTest, + className, ...rest } = this.props const Icon = this.getDimensionIcon() const Label = this.getDimensionType() - const itemStyle = - isSelected && !isDeactivated - ? { ...styles.item, ...styles.selected } - : styles.item const optionsRef = createRef() - return ( -
  • - -
    {Icon}
    -
    - {Label} - +
    + + -
    - {isLocked && ( -
    - -
    + +
    + + + ) + + const onLabelClick = () => { + if ( + !isDeactivated && + !getPredefinedDimensionProp(id, DIMENSION_PROP_NO_ITEMS) + ) { + onClick(id) + } + } + + return ( + <> + +
  • - {onOptionsClick ? ( + data-test={dataTest} + onClick={onLabelClick} + {...rest} + >
    - {this.state.mouseOver && !isDeactivated && !isLocked ? ( - {Icon}
    +
    + {Label} + - ) : null} +
  • - ) : null} - + {onOptionsClick && !isDeactivated && !isLocked ? ( +
    + {this.state.mouseOver ? ( + + ) : null} +
    + ) : null} + {isLocked && LockIcon} + + + ) } } @@ -123,12 +151,12 @@ DimensionItem.propTypes = { id: PropTypes.string.isRequired, isSelected: PropTypes.bool.isRequired, // XXX name: PropTypes.string.isRequired, + className: PropTypes.string, dataTest: PropTypes.string, innerRef: PropTypes.func, isDeactivated: PropTypes.bool, isLocked: PropTypes.bool, isRecommended: PropTypes.bool, - style: PropTypes.object, onClick: PropTypes.func, onOptionsClick: PropTypes.func, } diff --git a/src/components/DimensionsPanel/List/DimensionLabel.js b/src/components/DimensionsPanel/List/DimensionLabel.js deleted file mode 100644 index a2a3f5128..000000000 --- a/src/components/DimensionsPanel/List/DimensionLabel.js +++ /dev/null @@ -1,49 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { - getPredefinedDimensionProp, - DIMENSION_PROP_NO_ITEMS, -} from '../../../modules/predefinedDimensions.js' -import { styles } from './styles/DimensionLabel.style.js' - -class DimensionLabel extends Component { - static propTypes = { - id: PropTypes.string.isRequired, - isDeactivated: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, - children: PropTypes.array, - dataTest: PropTypes.string, - } - - onLabelClick = () => { - if ( - !this.props.isDeactivated && - !getPredefinedDimensionProp(this.props.id, DIMENSION_PROP_NO_ITEMS) - ) { - this.props.onClick(this.props.id) - } - } - - onKeyPress = (event) => { - if (event.key === 'Enter' && event.ctrlKey === false) { - this.onLabelClick() - } - } - - render() { - return ( -
    - {this.props.children} -
    - ) - } -} - -export default DimensionLabel diff --git a/src/components/DimensionsPanel/List/OptionsButton.js b/src/components/DimensionsPanel/List/OptionsButton.js index 0686000a2..b7200ddcf 100644 --- a/src/components/DimensionsPanel/List/OptionsButton.js +++ b/src/components/DimensionsPanel/List/OptionsButton.js @@ -2,14 +2,36 @@ import { IconMore16 } from '@dhis2/ui' import PropTypes from 'prop-types' import React from 'react' -const OptionsButton = ({ style, onClick }) => ( - +const OptionsButton = ({ onClick }) => ( + <> + + + ) OptionsButton.propTypes = { - style: PropTypes.object, onClick: PropTypes.func, } diff --git a/src/components/DimensionsPanel/List/RecommendedIcon.js b/src/components/DimensionsPanel/List/RecommendedIcon.js index 3a8b75dc9..12609d3a7 100644 --- a/src/components/DimensionsPanel/List/RecommendedIcon.js +++ b/src/components/DimensionsPanel/List/RecommendedIcon.js @@ -9,7 +9,6 @@ const RecommendedIcon = ({ isRecommended, dataTest }) =>
    diff --git a/src/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap b/src/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap index 1bc57e958..f58b07faa 100644 --- a/src/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +++ b/src/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap @@ -1,375 +1,283 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`DimensionItem matches the snapshot 1`] = ` -
  • - + +
  • - -
    -
    - - Period - - + +
    +
    + + + Period + + + +
  • - - + + -
    - -
    + <> - {menuIsOpen && ( - - - - } - onClick={() => { - toggleMenu() - onNew() - }} - dataTest="file-menu-new" - /> - - } - onClick={onMenuItemClick('open')} - dataTest="file-menu-open" - /> - - } - disabled={ + + + } + onClick={onNew} + dataTest="file-menu-new" + /> + + } + onClick={onMenuItemClick('open')} + dataTest="file-menu-open" + /> + { - toggleMenu() - onSave() - } - : onMenuItemClick('saveas') - } - dataTest="file-menu-save" /> - + } + disabled={ + !onSave || + !(!fileObject?.id || fileObject?.access?.update) + } + onClick={ + fileObject?.id ? onSave : onMenuItemClick('saveas') + } + dataTest="file-menu-save" + /> + - - } - disabled={ - !( - fileObject?.id && - fileObject?.access?.update - ) + } + disabled={!(onSaveAs && fileObject?.id)} + onClick={onMenuItemClick('saveas')} + dataTest="file-menu-saveas" + /> + - - } - disabled={ - !( - fileObject?.id && - fileObject?.access?.update - ) + } + disabled={ + !(fileObject?.id && fileObject?.access?.update) + } + onClick={onMenuItemClick('rename')} + dataTest="file-menu-rename" + /> + - - - } - disabled={ - !( - fileObject?.id && - fileObject?.access?.manage - ) + } + disabled={ + !(fileObject?.id && fileObject?.access?.update) + } + onClick={onMenuItemClick('translate')} + dataTest="file-menu-translate" + /> + + - + } + disabled={ + !(fileObject?.id && fileObject?.access?.manage) + } + onClick={onMenuItemClick('sharing')} + dataTest="file-menu-sharing" + /> + - - - } - disabled={ - !( - fileObject?.id && - fileObject?.access?.delete - ) + } + disabled={!fileObject?.id} + onClick={onMenuItemClick('getlink')} + dataTest="file-menu-getlink" + /> + + - - - - )} + } + disabled={ + !(fileObject?.id && fileObject?.access?.delete) + } + onClick={onMenuItemClick('delete')} + dataTest="file-menu-delete" + /> + + {renderDialog()} -
    + ) } diff --git a/src/components/FileMenu/FileMenu.styles.js b/src/components/FileMenu/FileMenu.styles.js index de46487c4..68d3929ad 100644 --- a/src/components/FileMenu/FileMenu.styles.js +++ b/src/components/FileMenu/FileMenu.styles.js @@ -42,3 +42,11 @@ export const fileMenuStyles = css` outline: none; } ` + +export const modalStyles = css` + .modal-content { + display: flex; + flex-direction: column; + gap: ${spacers.dp12}; + } +` diff --git a/src/components/FileMenu/GetLinkDialog.js b/src/components/FileMenu/GetLinkDialog.js index d78212456..c1c1a0cf1 100644 --- a/src/components/FileMenu/GetLinkDialog.js +++ b/src/components/FileMenu/GetLinkDialog.js @@ -1,27 +1,41 @@ +import { useConfig } from '@dhis2/app-runtime' import { Modal, ModalContent, ModalActions, ButtonStrip, Button, + IconCopy24, } from '@dhis2/ui' import PropTypes from 'prop-types' import React from 'react' import i18n from '../../locales/index.js' +import { styles } from './GetLinkDialog.styles.js' import { supportedFileTypes, appPathFor } from './utils.js' export const GetLinkDialog = ({ type, id, onClose }) => { + const { baseUrl } = useConfig() + // TODO simply use href from the visualization object? - const appUrl = new URL( - appPathFor(type, id), - `${window.location.origin}${window.location.pathname}` - ) + const appBaseUrl = new URL(baseUrl, self.location.href) + + const appUrl = new URL(appPathFor(type, id), appBaseUrl) return ( +

    {i18n.t('Open in this app')}

    - {appUrl.href} +
    + {appUrl.href} +
    diff --git a/src/components/FileMenu/GetLinkDialog.styles.js b/src/components/FileMenu/GetLinkDialog.styles.js new file mode 100644 index 000000000..65bfd8932 --- /dev/null +++ b/src/components/FileMenu/GetLinkDialog.styles.js @@ -0,0 +1,10 @@ +import { spacers } from '@dhis2/ui' +import css from 'styled-jsx/css' + +export const styles = css` + .link-container { + display: flex; + align-items: center; + gap: ${spacers.dp12}; + } +` diff --git a/src/components/FileMenu/RenameDialog.js b/src/components/FileMenu/RenameDialog.js index 10e0b19f7..fe8f64328 100644 --- a/src/components/FileMenu/RenameDialog.js +++ b/src/components/FileMenu/RenameDialog.js @@ -12,25 +12,39 @@ import { import PropTypes from 'prop-types' import React, { useMemo, useState } from 'react' import i18n from '../../locales/index.js' +import { modalStyles } from './FileMenu.styles.js' import { supportedFileTypes, endpointFromFileType, labelForFileType, } from './utils.js' +const formatPayload = (name, description) => { + const payload = [{ op: 'add', path: '/name', value: name }] + + if (description) { + payload.push({ + op: 'add', + path: '/description', + value: description, + }) + } + + return payload +} + const getMutation = (type) => ({ resource: endpointFromFileType(type), id: ({ id }) => id, - type: 'update', - partial: true, - data: ({ name, description }) => ({ name, description }), + type: 'json-patch', + data: ({ name, description }) => formatPayload(name, description), }) export const RenameDialog = ({ type, object, onClose, onRename, onError }) => { const [name, setName] = useState(object.name) const [description, setDescription] = useState(object.description) - const mutation = useMemo(() => getMutation(type), []) + const mutation = useMemo(() => getMutation(type), [type]) const [mutate, { loading }] = useDataMutation(mutation, { onError: (error) => { onError(error) @@ -51,34 +65,49 @@ export const RenameDialog = ({ type, object, onClose, onRename, onError }) => { } return ( - + + {i18n.t('Rename {{fileType}}', { fileType: labelForFileType(type), })} - setName(value)} - /> - setDescription(value)} - /> +
    + setName(value)} + dataTest="file-menu-rename-modal-name" + /> + setDescription(value)} + dataTest="file-menu-rename-modal-description" + /> +
    - - diff --git a/src/components/FileMenu/SaveAsDialog.js b/src/components/FileMenu/SaveAsDialog.js index 2a05a7e0c..26a7f2894 100644 --- a/src/components/FileMenu/SaveAsDialog.js +++ b/src/components/FileMenu/SaveAsDialog.js @@ -11,6 +11,7 @@ import { import PropTypes from 'prop-types' import React, { useState } from 'react' import i18n from '../../locales/index.js' +import { modalStyles } from './FileMenu.styles.js' import { supportedFileTypes, labelForFileType } from './utils.js' const NAME_MAXLENGTH = 230 @@ -18,7 +19,7 @@ const NAME_MAXLENGTH = 230 export const SaveAsDialog = ({ type, object, onClose, onSaveAs }) => { const [name, setName] = useState( object?.displayName || object?.name - ? i18n.t('{{objectName}} (copy)', { + ? i18n.t('{{- objectName}} (copy)', { objectName: object.name, }) : '' @@ -37,28 +38,30 @@ export const SaveAsDialog = ({ type, object, onClose, onSaveAs }) => { return ( + {i18n.t('Save {{fileType}} as', { fileType: labelForFileType(type), })} - - setName(value.substring(0, NAME_MAXLENGTH)) - } - dataTest="file-menu-saveas-modal-name" - /> - setDescription(value)} - dataTest="file-menu-saveas-modal-description" - /> +
    + + setName(value.substring(0, NAME_MAXLENGTH)) + } + dataTest="file-menu-saveas-modal-name" + /> + setDescription(value)} + dataTest="file-menu-saveas-modal-description" + /> +
    diff --git a/src/components/FileMenu/__tests__/FileMenu.spec.js b/src/components/FileMenu/__tests__/FileMenu.spec.js index 3e56fdacc..fefe5b5a3 100644 --- a/src/components/FileMenu/__tests__/FileMenu.spec.js +++ b/src/components/FileMenu/__tests__/FileMenu.spec.js @@ -1,18 +1,24 @@ -import { SharingDialog } from '@dhis2/ui' -import { shallow } from 'enzyme' +import { CustomDataProvider } from '@dhis2/app-runtime' +import { render, fireEvent, screen, getByText } from '@testing-library/react' +import '@testing-library/jest-dom' import React from 'react' -import { OpenFileDialog } from '../../OpenFileDialog/OpenFileDialog.js' -import { TranslationDialog } from '../../TranslationDialog/index.js' -import { DeleteDialog } from '../DeleteDialog.js' +import { HoverMenuBar } from '../../Toolbar/index.js' import { FileMenu } from '../FileMenu.js' -import { GetLinkDialog } from '../GetLinkDialog.js' -import { RenameDialog } from '../RenameDialog.js' -import { SaveAsDialog } from '../SaveAsDialog.js' -describe('The FileMenu component ', () => { - let shallowFileMenu - let props +jest.mock( + '../../TranslationDialog/TranslationModal/useTranslationsResults.js', + () => ({ + /* This will keep the translation dialog in + * a loading state, which prevents it from + * throwing other errors */ + useTranslationsResults: () => ({ + translationsData: undefined, + fetching: true, + }), + }) +) +describe('The FileMenu component ', () => { const onDelete = jest.fn() const onError = jest.fn() const onNew = jest.fn() @@ -23,308 +29,317 @@ describe('The FileMenu component ', () => { const onShare = jest.fn() const onTranslate = jest.fn() - const getFileMenuComponent = (props) => { - if (!shallowFileMenu) { - shallowFileMenu = shallow() - } - return shallowFileMenu + const baseProps = { + currentUser: { id: 'u1', displayName: 'Test user' }, + fileType: 'visualization', + fileObject: undefined, + onDelete, + onError, + onNew, + onOpen, + onRename, + onSave, + onSaveAs, + onShare, + onTranslate, } - beforeEach(() => { - shallowFileMenu = undefined - props = { - currentUser: { id: 'u1', displayName: 'Test user' }, - fileType: 'visualization', - fileObject: undefined, - onDelete, - onError, - onNew, - onOpen, - onRename, - onSave, - onSaveAs, - onShare, - onTranslate, - } - }) - - it('renders a button', () => { - expect(getFileMenuComponent(props).find('button')).toHaveLength(1) - }) - - it('renders some enabled buttons regardless of the access settings', () => { - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') - - const buttonLabels = ['New', 'Open…'] - - buttonLabels.forEach((buttonLabel) => - expect( - fileMenuComponent - .findWhere((n) => n.prop('label') === buttonLabel) - .prop('disabled') - ).toBe(undefined) - ) - }) - - it('renders some disabled buttons when no fileObject is present', () => { - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') - - const buttonLabels = [ - 'Save as…', - 'Rename…', - 'Translate…', - 'Share…', - 'Get link…', - 'Delete', - ] - - buttonLabels.forEach((buttonLabel) => - expect( - fileMenuComponent - .findWhere((n) => n.prop('label') === buttonLabel) - .prop('disabled') - ).toBe(true) - ) - }) - - it('renders some enabled buttons when update access is granted', () => { - props.fileObject = { + const fullAccessProps = { + fileObject: { id: 'test', access: { - delete: false, - manage: false, + delete: true, + manage: true, update: true, }, + href: 'http://dhis2.org', + }, + } + + const renderFileMenu = (customProps = {}) => { + const props = { ...baseProps, ...customProps } + const providerData = { + translations: { + translations: {}, + }, + sharing: { + meta: { + allowPublicAccess: true, + }, + object: { + userAccesses: [], + userGroupAccesses: [], + }, + }, } - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + return render( + + + + + + ) + } - const buttonLabels = ['Save', 'Rename…', 'Translate…'] + const openDropdown = async () => { + fireEvent.click(screen.getByTestId('dhis2-analytics-hovermenudropdown')) + expect(await screen.findByTestId('file-menu-container')).toBeVisible() + } - buttonLabels.forEach((buttonLabel) => - expect( - fileMenuComponent - .findWhere((n) => n.prop('label') === buttonLabel) - .prop('disabled') - ).toBe(false) - ) - }) + const MENU_ITEMS = { + NEW: { testId: 'file-menu-new', text: 'New' }, + OPEN: { testId: 'file-menu-open', text: 'Open…' }, + SAVE: { testId: 'file-menu-save', text: 'Save' }, + SAVE_AS: { testId: 'file-menu-saveas', text: 'Save as…' }, + RENAME: { testId: 'file-menu-rename', text: 'Rename…' }, + TRANSLATE: { testId: 'file-menu-translate', text: 'Translate…' }, + SHARE: { testId: 'file-menu-sharing', text: 'Share…' }, + GET_LINK: { testId: 'file-menu-getlink', text: 'Get link…' }, + DELETE: { testId: 'file-menu-delete', text: 'Delete' }, + } - it('renders enabled Delete button when delete access is granted', () => { - props.fileObject = { - id: 'test', - access: { - delete: true, - manage: false, - update: false, - }, - } + const assertMenuItemsDisabledState = (menuItems) => { + for (const menuTitem of menuItems) { + const li = screen.getByTestId(menuTitem.testId) + expect(getByText(li, menuTitem.text)).toBeVisible() - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + if (menuTitem.disabled) { + expect(li).toHaveClass('disabled') + } else { + expect(li).not.toHaveClass('disabled') + } + } + } + it('renders a button', () => { + renderFileMenu() expect( - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Delete') - .prop('disabled') - ).toBe(false) - }) + screen.getAllByTestId('dhis2-analytics-hovermenudropdown') + ).toHaveLength(1) - it('renders enabled Share button when manage access is granted', () => { - props.fileObject = { - id: 'test', - access: { - delete: false, - manage: true, - update: false, - }, - } + const button = screen.getByTestId('dhis2-analytics-hovermenudropdown') + expect(button).toBeVisible() + expect(button).toHaveTextContent('File') + }) - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + it('opens when clicking the button', async () => { + renderFileMenu() expect( - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Share…') - .prop('disabled') - ).toBe(false) + screen.queryByTestId('file-menu-container') + ).not.toBeInTheDocument() + + await openDropdown() + + expect(await screen.findByTestId('file-menu-container')).toBeVisible() }) - it('renders the OpenFileDialog component when the Open button is clicked', () => { - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + it('renders some enabled buttons regardless of the access settings', async () => { + renderFileMenu() + await openDropdown() - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Open…') - .simulate('click') + assertMenuItemsDisabledState([ + { ...MENU_ITEMS.NEW, disabled: false }, + { ...MENU_ITEMS.OPEN, disabled: false }, + ]) + }) - expect(fileMenuComponent.find(OpenFileDialog)).toHaveLength(1) + it('renders some disabled buttons when no fileObject is present', async () => { + renderFileMenu() + await openDropdown() + + assertMenuItemsDisabledState([ + { ...MENU_ITEMS.SAVE_AS, disabled: true }, + { ...MENU_ITEMS.RENAME, disabled: true }, + { ...MENU_ITEMS.TRANSLATE, disabled: true }, + { ...MENU_ITEMS.SHARE, disabled: true }, + { ...MENU_ITEMS.GET_LINK, disabled: true }, + { ...MENU_ITEMS.DELETE, disabled: true }, + ]) }) - it('renders the RenameDialog when the Rename button is clicked', () => { - props.fileObject = { - id: 'test', - access: { - delete: true, - manage: true, - update: true, + it('renders some enabled buttons when update access is granted', async () => { + const customProps = { + fileObject: { + id: 'test', + access: { + delete: false, + manage: false, + update: true, + }, }, } - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + renderFileMenu(customProps) + await openDropdown() - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Rename…') - .simulate('click') - - expect(fileMenuComponent.find(RenameDialog)).toHaveLength(1) + assertMenuItemsDisabledState([ + { ...MENU_ITEMS.SAVE, disabled: false }, + { ...MENU_ITEMS.RENAME, disabled: false }, + { ...MENU_ITEMS.TRANSLATE, disabled: false }, + ]) }) - it('renders the TranslationDialog when the Translate button is clicked', () => { - props.fileObject = { - id: 'test', - access: { - delete: true, - manage: true, - update: true, + it('renders enabled Delete button when delete access is granted', async () => { + const customProps = { + fileObject: { + id: 'test', + access: { + delete: true, + manage: false, + update: false, + }, }, } - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') - - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Translate…') - .simulate('click') + renderFileMenu(customProps) + await openDropdown() - expect(fileMenuComponent.find(TranslationDialog)).toHaveLength(1) + assertMenuItemsDisabledState([ + { ...MENU_ITEMS.DELETE, disabled: false }, + ]) }) - it('renders the SharingDialog when the Share button is clicked', () => { - props.fileObject = { - id: 'test', - access: { - delete: true, - manage: true, - update: true, + it('renders enabled Share button when manage access is granted', async () => { + const customProps = { + fileObject: { + id: 'test', + access: { + delete: false, + manage: true, + update: false, + }, }, } - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + renderFileMenu(customProps) + await openDropdown() + + assertMenuItemsDisabledState([{ ...MENU_ITEMS.SHARE, disabled: false }]) + }) - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Share…') - .simulate('click') + it('renders the OpenFileDialog component when the Open button is clicked', async () => { + renderFileMenu() + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.OPEN.testId)) - expect(fileMenuComponent.find(SharingDialog)).toHaveLength(1) + expect( + await screen.findByText('Open a visualization', { selector: 'h1' }) + ).toBeVisible() }) - it('renders the GetLinkDialog when the Get link button is clicked', () => { - props.fileObject = { - id: 'test', - access: { - delete: true, - manage: true, - update: true, - }, - } + it('renders the RenameDialog when the Rename button is clicked', async () => { + renderFileMenu(fullAccessProps) + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.RENAME.testId)) - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + expect( + await screen.findByText('Rename visualization', { selector: 'h1' }) + ).toBeVisible() + }) - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Get link…') - .simulate('click') + it('renders the TranslationDialog when the Translate button is clicked', async () => { + renderFileMenu(fullAccessProps) + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.TRANSLATE.testId)) - expect(fileMenuComponent.find(GetLinkDialog)).toHaveLength(1) + expect( + await screen.findByText('Translate', { + exact: false, + selector: 'h1', + }) + ).toBeVisible() }) - it('renders the DeleteDialog when the Delete button is clicked', () => { - props.fileObject = { - id: 'delete-test', - access: { - delete: true, - manage: true, - update: true, - }, - } + it('renders the SharingDialog when the Share button is clicked', async () => { + renderFileMenu(fullAccessProps) + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.SHARE.testId)) - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + expect( + await screen.findByText('Sharing and access', { selector: 'h1' }) + ).toBeVisible() + }) - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Delete') - .simulate('click') + it('renders the GetLinkDialog when the Get link button is clicked', async () => { + const url = 'http://localhost/dhis-web-data-visualizer/#/test' - expect(fileMenuComponent.find(DeleteDialog)).toHaveLength(1) + renderFileMenu(fullAccessProps) + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.GET_LINK.testId)) + + expect(await screen.findByTestId('dhis2-uicore-modal')).toBeVisible() + expect(screen.getByRole('link', { name: url })).toHaveAttribute( + 'href', + url + ) }) - it('renders the SaveAsDialog when the Save as… button is clicked', () => { - props.fileObject = { - id: 'test', - access: { - delete: true, - manage: true, - update: true, + it('renders the DeleteDialog when the Delete button is clicked', async () => { + const customProps = { + fileObject: { + id: 'delete-test', + access: { + delete: true, + manage: true, + update: true, + }, }, } - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') - - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Save as…') - .simulate('click') + renderFileMenu(customProps) + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.DELETE.testId)) - expect(fileMenuComponent.find(SaveAsDialog)).toHaveLength(1) + expect( + await screen.findByText('Delete visualization', { selector: 'h1' }) + ).toBeVisible() }) - it('renders the SaveAsDialog when the Save… button is clicked but no fileObject is present', () => { - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') - - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Save…') - .simulate('click') + it('renders the SaveAsDialog when the Save as… button is clicked', async () => { + renderFileMenu(fullAccessProps) + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.SAVE_AS.testId)) - expect(fileMenuComponent.find(SaveAsDialog)).toHaveLength(1) + expect( + await screen.findByText('Save visualization as', { selector: 'h1' }) + ).toBeVisible() }) - it('calls the onSave callback when the Save button is clicked and a fileObject is present', () => { - props.fileObject = { - id: 'test', - access: { - delete: true, - manage: true, - update: true, + it('renders the SaveAsDialog when the Save… button is clicked but no fileObject is present', async () => { + const customProps = { + fileObject: { + // NOTE: no `id` field + access: { + update: true, + }, }, } + renderFileMenu(customProps) + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.SAVE.testId)) - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') + expect( + await screen.findByText('Save visualization as', { selector: 'h1' }) + ).toBeVisible() + }) - fileMenuComponent - .findWhere((n) => n.prop('label') === 'Save') - .simulate('click') + it('calls the onSave callback when the Save button is clicked and a fileObject is present', async () => { + renderFileMenu(fullAccessProps) + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.SAVE.testId)) - expect(fileMenuComponent.find(OpenFileDialog).prop('open')).toBe(false) - expect(onSave).toHaveBeenCalled() + expect(screen.queryByText('Open a visualization')).not.toBeVisible() + expect(onSave).toHaveBeenCalledTimes(1) }) - it('calls the onNew callback when the New button is clicked', () => { - const fileMenuComponent = getFileMenuComponent(props) - fileMenuComponent.find('button').simulate('click') - - fileMenuComponent - .findWhere((n) => n.prop('label') === 'New') - .simulate('click') + it('calls the onNew callback when the New button is clicked', async () => { + renderFileMenu() + await openDropdown() + fireEvent.click(screen.getByTestId(MENU_ITEMS.NEW.testId)) - expect(fileMenuComponent.find(OpenFileDialog).prop('open')).toBe(false) - expect(onNew).toHaveBeenCalled() + expect(screen.queryByText('Open a visualization')).not.toBeVisible() + expect(onNew).toHaveBeenCalledTimes(1) }) }) diff --git a/src/components/FileMenu/__tests__/GetLinkDialog.spec.js b/src/components/FileMenu/__tests__/GetLinkDialog.spec.js index 3192492f0..2435b866e 100644 --- a/src/components/FileMenu/__tests__/GetLinkDialog.spec.js +++ b/src/components/FileMenu/__tests__/GetLinkDialog.spec.js @@ -4,6 +4,12 @@ import React from 'react' import { GetLinkDialog } from '../GetLinkDialog.js' import { appPathFor } from '../utils.js' +const testBaseUrl = 'http://test.tld/test' + +jest.mock('@dhis2/app-runtime', () => ({ + useConfig: () => ({ baseUrl: testBaseUrl }), +})) + describe('The FileMenu - GetLinkDialog component', () => { let shallowGetLinkDialog let props @@ -33,11 +39,13 @@ describe('The FileMenu - GetLinkDialog component', () => { it('renders a tag containing the type and id props', () => { const href = getGetLinkDialogComponent(props).find('a').prop('href') - expect(href).toMatch(appPathFor(props.type, props.id)) + expect(href).toMatch( + new URL(appPathFor(props.type, props.id), testBaseUrl).href + ) }) it('calls the onClose callback when the Close button is clicked', () => { - getGetLinkDialogComponent(props).find(Button).first().simulate('click') + getGetLinkDialogComponent(props).find(Button).at(1).simulate('click') expect(onClose).toHaveBeenCalled() }) diff --git a/src/components/FileMenu/utils.js b/src/components/FileMenu/utils.js index a513289e7..ae95418cc 100644 --- a/src/components/FileMenu/utils.js +++ b/src/components/FileMenu/utils.js @@ -35,7 +35,18 @@ export const appPathFor = (fileType, id) => { return `dhis-web-data-visualizer/#/${id}` case FILE_TYPE_MAP: return `dhis-web-maps/index.html?id=${id}` + case FILE_TYPE_EVENT_VISUALIZATION: + return `api/apps/line-listing/#/${id}` default: return `${window.location.search}${window.location.hash}` } } + +export const preparePayloadForSaveAs = ({ ...visualization }) => { + delete visualization.id + delete visualization.created + delete visualization.createdBy + delete visualization.user + + return visualization +} diff --git a/src/components/Interpretations/InterpretationModal/Comment.js b/src/components/Interpretations/InterpretationModal/Comment.js index f00f761c5..22e1c49fc 100644 --- a/src/components/Interpretations/InterpretationModal/Comment.js +++ b/src/components/Interpretations/InterpretationModal/Comment.js @@ -2,7 +2,12 @@ import { IconEdit16 } from '@dhis2/ui' import PropTypes from 'prop-types' import React, { useState } from 'react' import i18n from '../../../locales/index.js' -import { Message, MessageIconButton, MessageStatsBar } from '../common/index.js' +import { + Message, + MessageIconButton, + MessageStatsBar, + getCommentAccess, +} from '../common/index.js' import { CommentDeleteButton } from './CommentDeleteButton.js' import { CommentUpdateForm } from './CommentUpdateForm.js' @@ -11,9 +16,12 @@ const Comment = ({ currentUser, interpretationId, onThreadUpdated, + canComment, }) => { const [isUpdateMode, setIsUpdateMode] = useState(false) + const commentAccess = getCommentAccess(comment, canComment, currentUser) + return isUpdateMode ? ( setIsUpdateMode(false)} @@ -29,22 +37,23 @@ const Comment = ({ created={comment.created} username={comment.createdBy.displayName} > - - {comment.access.update && ( + {commentAccess.edit && ( + setIsUpdateMode(true)} /> - )} - {comment.access.delete && ( - onThreadUpdated(true)} - /> - )} - + + {commentAccess.delete && ( + onThreadUpdated(true)} + /> + )} + + )} ) } @@ -54,6 +63,7 @@ Comment.propTypes = { currentUser: PropTypes.object.isRequired, interpretationId: PropTypes.string.isRequired, onThreadUpdated: PropTypes.func.isRequired, + canComment: PropTypes.bool, } export { Comment } diff --git a/src/components/Interpretations/InterpretationModal/CommentAddForm.js b/src/components/Interpretations/InterpretationModal/CommentAddForm.js index 8de0fc376..605993e27 100644 --- a/src/components/Interpretations/InterpretationModal/CommentAddForm.js +++ b/src/components/Interpretations/InterpretationModal/CommentAddForm.js @@ -3,8 +3,8 @@ import { Button } from '@dhis2/ui' import PropTypes from 'prop-types' import React, { useRef, useState } from 'react' import i18n from '../../../locales/index.js' +import { RichTextEditor } from '../../RichText/index.js' import { - RichTextEditor, MessageEditorContainer, MessageButtonStrip, MessageInput, diff --git a/src/components/Interpretations/InterpretationModal/CommentDeleteButton.js b/src/components/Interpretations/InterpretationModal/CommentDeleteButton.js index 6386c4bb7..76fa68df7 100644 --- a/src/components/Interpretations/InterpretationModal/CommentDeleteButton.js +++ b/src/components/Interpretations/InterpretationModal/CommentDeleteButton.js @@ -1,7 +1,7 @@ import { useDataMutation } from '@dhis2/app-runtime' -import { IconDelete16 } from '@dhis2/ui' +import { IconDelete16, colors } from '@dhis2/ui' import PropTypes from 'prop-types' -import React from 'react' +import React, { useState } from 'react' import i18n from '../../../locales/index.js' import { MessageIconButton } from '../common/index.js' @@ -13,17 +13,43 @@ const mutation = { } const CommentDeleteButton = ({ commentId, interpretationId, onComplete }) => { + const [deleteError, setDeleteError] = useState(null) const [remove, { loading }] = useDataMutation(mutation, { - onComplete, + onComplete: () => { + setDeleteError(null) + onComplete() + }, + onError: () => setDeleteError(i18n.t('Delete failed')), variables: { commentId, interpretationId }, }) + + const onDelete = () => { + setDeleteError(null) + remove() + } + return ( - +
    + + {deleteError && {deleteError}} + +
    ) } diff --git a/src/components/Interpretations/InterpretationModal/CommentUpdateForm.js b/src/components/Interpretations/InterpretationModal/CommentUpdateForm.js index 060e944ab..ac37d8bcc 100644 --- a/src/components/Interpretations/InterpretationModal/CommentUpdateForm.js +++ b/src/components/Interpretations/InterpretationModal/CommentUpdateForm.js @@ -3,11 +3,8 @@ import { Button, spacers, colors } from '@dhis2/ui' import PropTypes from 'prop-types' import React, { useState, useRef } from 'react' import i18n from '../../../locales/index.js' -import { - MessageEditorContainer, - RichTextEditor, - MessageButtonStrip, -} from '../common/index.js' +import { RichTextEditor } from '../../RichText/index.js' +import { MessageEditorContainer, MessageButtonStrip } from '../common/index.js' export const CommentUpdateForm = ({ interpretationId, @@ -33,9 +30,7 @@ export const CommentUpdateForm = ({ }, } ) - const errorText = error - ? error.message || i18n.t('Could not update comment') - : '' + const errorText = error ? i18n.t('Could not update comment') : '' return (
    diff --git a/src/components/Interpretations/InterpretationModal/InterpretationModal.js b/src/components/Interpretations/InterpretationModal/InterpretationModal.js index 59602f10f..6d2e7aaeb 100644 --- a/src/components/Interpretations/InterpretationModal/InterpretationModal.js +++ b/src/components/Interpretations/InterpretationModal/InterpretationModal.js @@ -13,7 +13,7 @@ import { } from '@dhis2/ui' import cx from 'classnames' import PropTypes from 'prop-types' -import React, { useEffect, useState } from 'react' +import React, { useEffect, useState, useMemo } from 'react' import css from 'styled-jsx/css' import i18n from '../../../locales/index.js' import { InterpretationThread } from './InterpretationThread.js' @@ -24,14 +24,14 @@ const modalCSS = css.resolve` max-width: calc(100vw - 128px) !important; max-height: calc(100vh - 128px) !important; width: auto !important; - height: auto !important; + height: calc(100vh - 128px) !important; overflow-y: hidden; } aside.hidden { display: none; } aside > :global(div) > :global(div) { - max-height: none; + height: 100%; } ` @@ -39,6 +39,7 @@ function getModalContentCSS(width) { return css.resolve` div { width: ${width}px; + overflow-y: visible; } ` } @@ -49,14 +50,14 @@ const query = { id: ({ id }) => id, params: { fields: [ - 'access', + 'access[write,manage]', 'id', 'text', 'created', - 'user[id,displayName]', + 'createdBy[id,displayName]', 'likes', 'likedBy', - 'comments[access,id,text,created,createdBy[id,displayName]]', + 'comments[id,text,created,createdBy[id,displayName]]', ], }, }, @@ -82,7 +83,7 @@ const InterpretationModal = ({ }) const interpretation = data?.interpretation const shouldRenderModalContent = !error && interpretation - const shouldCssHideModal = loading || isVisualizationLoading + const loadingInProgress = loading || isVisualizationLoading const handleClose = () => { if (isDirty) { onInterpretationUpdate() @@ -96,6 +97,13 @@ const InterpretationModal = ({ } refetch({ id: interpretationId }) } + + const onLikeToggled = ({ likedBy }) => { + setIsDirty(true) + interpretation.likedBy = likedBy + interpretation.likes = likedBy.length + } + const onInterpretationDeleted = () => { setIsDirty(false) onInterpretationUpdate() @@ -108,9 +116,15 @@ const InterpretationModal = ({ } }, [interpretationId, refetch]) + const filters = useMemo(() => { + return { + relativePeriodDate: interpretation?.created, + } + }, [interpretation?.created]) + return ( <> - {shouldCssHideModal && ( + {loadingInProgress && ( @@ -121,7 +135,7 @@ const InterpretationModal = ({ fluid onClose={handleClose} className={cx(modalCSS.className, { - hidden: shouldCssHideModal, + hidden: loadingInProgress, })} dataTest="interpretation-modal" > @@ -155,10 +169,7 @@ const InterpretationModal = ({
    @@ -182,6 +194,7 @@ const InterpretationModal = ({ downloadMenuComponent={ downloadMenuComponent } + onLikeToggled={onLikeToggled} />
    @@ -216,12 +229,14 @@ const InterpretationModal = ({ .container { display: flex; flex-direction: column; + height: 100%; } .row { display: flex; flex-direction: row; gap: 16px; + height: 100%; } .visualisation-wrap { @@ -233,7 +248,6 @@ const InterpretationModal = ({ padding-right: ${spacers.dp4}; flex-basis: 300px; flex-shrink: 0; - overflow-y: auto; } `} diff --git a/src/components/Interpretations/InterpretationModal/InterpretationThread.js b/src/components/Interpretations/InterpretationModal/InterpretationThread.js index cf352317b..eb5a3a6d3 100644 --- a/src/components/Interpretations/InterpretationModal/InterpretationThread.js +++ b/src/components/Interpretations/InterpretationModal/InterpretationThread.js @@ -1,9 +1,10 @@ +import { useTimeZoneConversion } from '@dhis2/app-runtime' import { IconClock16, colors } from '@dhis2/ui' import cx from 'classnames' import moment from 'moment' import PropTypes from 'prop-types' import React, { useRef, useEffect } from 'react' -import { Interpretation } from '../common/index.js' +import { Interpretation, getInterpretationAccess } from '../common/index.js' import { Comment } from './Comment.js' import { CommentAddForm } from './CommentAddForm.js' @@ -12,10 +13,13 @@ const InterpretationThread = ({ fetching, interpretation, onInterpretationDeleted, + onLikeToggled, initialFocus, onThreadUpdated, downloadMenuComponent: DownloadMenu, + dashboardRedirectUrl, }) => { + const { fromServerDate } = useTimeZoneConversion() const focusRef = useRef() useEffect(() => { @@ -26,56 +30,84 @@ const InterpretationThread = ({ } }, [initialFocus]) + const interpretationAccess = getInterpretationAccess( + interpretation, + currentUser + ) + return ( -
    -
    -
    - - {moment(interpretation.created).format('LLL')} -
    - {DownloadMenu && ( - - )} -
    - focusRef.current?.focus()} - onUpdated={() => onThreadUpdated(true)} - onDeleted={onInterpretationDeleted} - /> -
    - {interpretation.comments.map((comment) => ( - - ))} -
    - onThreadUpdated(true)} - focusRef={focusRef} - /> +
    +
    + + {moment(fromServerDate(interpretation.created)).format('LLL')} +
    + {DownloadMenu && ( + + )} +
    + focusRef.current?.focus() + : null + } + onUpdated={() => onThreadUpdated(true)} + onDeleted={onInterpretationDeleted} + dashboardRedirectUrl={dashboardRedirectUrl} + isInThread={true} + /> +
    + {interpretation.comments.map((comment) => ( + + ))}
    + {interpretationAccess.comment && ( + onThreadUpdated(true)} + focusRef={focusRef} + /> + )} - -) + .footer { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: ${spacers.dp8}; + } + `} + + ) +} Message.propTypes = { children: PropTypes.node.isRequired, diff --git a/src/components/Interpretations/common/Message/MessageEditorContainer.js b/src/components/Interpretations/common/Message/MessageEditorContainer.js index b4c7ff338..4de5bec5d 100644 --- a/src/components/Interpretations/common/Message/MessageEditorContainer.js +++ b/src/components/Interpretations/common/Message/MessageEditorContainer.js @@ -19,6 +19,7 @@ const MessageEditorContainer = ({ children, currentUser, dataTest }) => ( } .editor { flex-grow: 1; + height: 100%; } `}
    diff --git a/src/components/Interpretations/common/Message/MessageIconButton.js b/src/components/Interpretations/common/Message/MessageIconButton.js index 79054e7c5..bbe0e87b0 100644 --- a/src/components/Interpretations/common/Message/MessageIconButton.js +++ b/src/components/Interpretations/common/Message/MessageIconButton.js @@ -1,4 +1,4 @@ -import { Tooltip, colors, spacers } from '@dhis2/ui' +import { Tooltip, colors, spacers, theme } from '@dhis2/ui' import cx from 'classnames' import PropTypes from 'prop-types' import React from 'react' @@ -11,6 +11,7 @@ const MessageIconButton = ({ count, iconComponent: Icon, dataTest, + viewOnly, }) => ( {({ ref, onMouseOver, onMouseOut }) => ( @@ -25,7 +26,7 @@ const MessageIconButton = ({ event.stopPropagation() onClick() }} - className={cx('button', { selected })} + className={cx('button', { selected, viewOnly })} disabled={disabled} data-test={dataTest} > @@ -49,6 +50,10 @@ const MessageIconButton = ({ color: ${colors.grey700}; } + .viewOnly { + cursor: default; + } + .button.selected { color: ${colors.teal600}; font-weight: 500; @@ -69,6 +74,15 @@ const MessageIconButton = ({ .button.selected:hover :global(svg) { color: ${colors.teal700}; } + + .button:disabled { + color: ${theme.disabled}; + cursor: not-allowed; + } + + .button:disabled :global(svg) { + color: ${theme.disabled}; + } `} )} @@ -83,6 +97,7 @@ MessageIconButton.propTypes = { dataTest: PropTypes.string, disabled: PropTypes.bool, selected: PropTypes.bool, + viewOnly: PropTypes.bool, onClick: PropTypes.func, } diff --git a/src/components/Interpretations/common/RichTextEditor/index.js b/src/components/Interpretations/common/RichTextEditor/index.js deleted file mode 100644 index 31c0113ca..000000000 --- a/src/components/Interpretations/common/RichTextEditor/index.js +++ /dev/null @@ -1 +0,0 @@ -export { RichTextEditor } from './RichTextEditor.js' diff --git a/src/components/Interpretations/common/__tests__/getInterpretationAccess.spec.js b/src/components/Interpretations/common/__tests__/getInterpretationAccess.spec.js new file mode 100644 index 000000000..3dc62633f --- /dev/null +++ b/src/components/Interpretations/common/__tests__/getInterpretationAccess.spec.js @@ -0,0 +1,436 @@ +import { + getInterpretationAccess, + getCommentAccess, +} from '../getInterpretationAccess.js' + +const superuserD2CurrentUser = { + id: 'iamsuper', + authorities: new Set(['ALL']), +} + +const userJoeD2CurrentUser = { + id: 'johndoe', + authorities: new Set(['Some']), +} + +const userJaneD2CurrentUser = { + id: 'jane', + authorities: new Set(['Some']), +} + +const superuser = { + id: 'iamsuper', + authorities: ['ALL'], +} + +const userJoe = { + id: 'johndoe', + authorities: ['Some'], +} + +const userJane = { + id: 'jane', + authorities: ['Some'], +} + +describe('interpretation and comment access', () => { + describe('getInterpretationAccess', () => { + it('returns true for all accesses for superuser', () => { + const interpretation = { + access: { + write: true, + manage: true, + }, + createdBy: userJoe, + } + + expect( + getInterpretationAccess(interpretation, superuser) + ).toMatchObject({ + share: true, + comment: true, + edit: true, + delete: true, + }) + }) + it('returns true for all accesses for creator', () => { + const interpretation = { + access: { + write: true, + manage: true, + }, + createdBy: userJoe, + } + + expect( + getInterpretationAccess(interpretation, userJoe) + ).toMatchObject({ + share: true, + comment: true, + edit: true, + delete: true, + }) + }) + + it('returns false for edit/delete if user is not creator/superuser', () => { + const interpretation = { + access: { + write: true, + manage: true, + }, + createdBy: userJane, + } + + expect( + getInterpretationAccess(interpretation, userJoe) + ).toMatchObject({ + share: true, + comment: true, + edit: false, + delete: false, + }) + }) + + it('returns false for comment/edit/delete if user is not creator/superuser and no write access', () => { + const interpretation = { + access: { + write: false, + manage: true, + }, + createdBy: userJane, + } + + expect( + getInterpretationAccess(interpretation, userJoe) + ).toMatchObject({ + share: true, + comment: false, + edit: false, + delete: false, + }) + }) + + it('returns false for share/comment/edit/delete if user is not creator/superuser and no write or manage access', () => { + const interpretation = { + access: { + write: false, + manage: false, + }, + createdBy: userJane, + } + + expect( + getInterpretationAccess(interpretation, userJoe) + ).toMatchObject({ + share: false, + comment: false, + edit: false, + delete: false, + }) + }) + + it('throws an error for all accesses when no currentUser provided', () => { + const interpretation = { + access: { + write: false, + manage: false, + }, + createdBy: userJane, + } + + expect(() => getInterpretationAccess(interpretation)).toThrow( + '"hasAuthority" requires "authorities" to be an array or set of authorities (strings)' + ) + }) + + it('throws an error when currentUser is missing authorities', () => { + const interpretation = { + access: { + write: false, + manage: false, + }, + createdBy: userJane, + } + + expect(() => + getInterpretationAccess(interpretation, { + id: 'usernoauthorties', + }) + ).toThrow( + '"hasAuthority" requires "authorities" to be an array or set of authorities (strings)' + ) + }) + }) + + describe('getInterpretationAccess using D2.currentUser', () => { + it('returns true for all accesses for superuser', () => { + const interpretation = { + access: { + write: true, + manage: true, + }, + createdBy: userJoeD2CurrentUser, + } + + expect( + getInterpretationAccess(interpretation, superuserD2CurrentUser) + ).toMatchObject({ + share: true, + comment: true, + edit: true, + delete: true, + }) + }) + it('returns true for all accesses for creator', () => { + const interpretation = { + access: { + write: true, + manage: true, + }, + createdBy: userJoeD2CurrentUser, + } + + expect( + getInterpretationAccess(interpretation, userJoeD2CurrentUser) + ).toMatchObject({ + share: true, + comment: true, + edit: true, + delete: true, + }) + }) + + it('returns false for edit/delete if user is not creator/superuser', () => { + const interpretation = { + access: { + write: true, + manage: true, + }, + createdBy: userJaneD2CurrentUser, + } + + expect( + getInterpretationAccess(interpretation, userJoeD2CurrentUser) + ).toMatchObject({ + share: true, + comment: true, + edit: false, + delete: false, + }) + }) + + it('returns false for comment/edit/delete if user is not creator/superuser and no write access', () => { + const interpretation = { + access: { + write: false, + manage: true, + }, + createdBy: userJaneD2CurrentUser, + } + + expect( + getInterpretationAccess(interpretation, userJoeD2CurrentUser) + ).toMatchObject({ + share: true, + comment: false, + edit: false, + delete: false, + }) + }) + + it('returns false for share/comment/edit/delete if user is not creator/superuser and no write or manage access', () => { + const interpretation = { + access: { + write: false, + manage: false, + }, + createdBy: userJaneD2CurrentUser, + } + + expect( + getInterpretationAccess(interpretation, userJoeD2CurrentUser) + ).toMatchObject({ + share: false, + comment: false, + edit: false, + delete: false, + }) + }) + }) + + describe('getCommentAccess using D2.currentUser', () => { + it('returns true for all accesses for superuser', () => { + const interpretation = { + access: { + write: true, + }, + } + + const comment = { + createdBy: userJoeD2CurrentUser, + } + + expect( + getCommentAccess( + comment, + interpretation.access.write, + superuserD2CurrentUser + ) + ).toMatchObject({ + edit: true, + delete: true, + }) + }) + + it('returns true for all accesses for creator when interpretation has write access', () => { + const interpretation = { + access: { + write: true, + }, + } + + const comment = { + createdBy: userJoeD2CurrentUser, + } + + expect( + getCommentAccess( + comment, + interpretation.access.write, + userJoeD2CurrentUser + ) + ).toMatchObject({ + edit: true, + delete: true, + }) + }) + + it('returns true for edit and false for delete for creator when interpretation does not have write access', () => { + const interpretation = { + access: { + write: false, + }, + } + + const comment = { + createdBy: userJoeD2CurrentUser, + } + + expect( + getCommentAccess( + comment, + interpretation.access.write, + userJoeD2CurrentUser + ) + ).toMatchObject({ + edit: true, + delete: false, + }) + }) + + it('returns false for edit/delete for user who is not creator or superuser', () => { + const interpretation = { + access: { + write: true, + }, + } + + const comment = { + createdBy: userJaneD2CurrentUser, + } + + expect( + getCommentAccess( + comment, + interpretation.access.write, + userJoeD2CurrentUser + ) + ).toMatchObject({ + edit: false, + delete: false, + }) + }) + }) + + describe('getCommentAccess', () => { + it('returns true for all accesses for superuser', () => { + const interpretation = { + access: { + write: true, + }, + } + + const comment = { + createdBy: userJoe, + } + + expect( + getCommentAccess( + comment, + interpretation.access.write, + superuser + ) + ).toMatchObject({ + edit: true, + delete: true, + }) + }) + + it('returns true for all accesses for creator when interpretation has write access', () => { + const interpretation = { + access: { + write: true, + }, + } + + const comment = { + createdBy: userJoe, + } + + expect( + getCommentAccess(comment, interpretation.access.write, userJoe) + ).toMatchObject({ + edit: true, + delete: true, + }) + }) + + it('returns true for edit and false for delete for creator when interpretation does not have write access', () => { + const interpretation = { + access: { + write: false, + }, + } + + const comment = { + createdBy: userJoe, + } + + expect( + getCommentAccess(comment, interpretation.access.write, userJoe) + ).toMatchObject({ + edit: true, + delete: false, + }) + }) + + it('returns false for edit/delete for user who is not creator or superuser', () => { + const interpretation = { + access: { + write: true, + }, + } + + const comment = { + createdBy: userJane, + } + + expect( + getCommentAccess(comment, interpretation.access.write, userJoe) + ).toMatchObject({ + edit: false, + delete: false, + }) + }) + }) +}) diff --git a/src/components/Interpretations/common/getInterpretationAccess.js b/src/components/Interpretations/common/getInterpretationAccess.js new file mode 100644 index 000000000..11123bc63 --- /dev/null +++ b/src/components/Interpretations/common/getInterpretationAccess.js @@ -0,0 +1,50 @@ +// For backwards compatibility +// accept both Set (from the old d2.currentUser object) and array +const hasAuthority = (authorities, authority) => { + if (!authority || typeof authority !== 'string') { + throw new Error( + `"hasAuthority" requires "authority" to be a populated string but received ${authority}` + ) + } + if ( + !(Array.isArray(authorities) || typeof authorities?.has === 'function') + ) { + throw new Error( + `"hasAuthority" requires "authorities" to be an array or set of authorities (strings)` + ) + } + + return Array.isArray(authorities) + ? authorities.includes(authority) + : authorities.has(authority) +} + +const isSuperuser = (authorities) => hasAuthority(authorities, 'ALL') + +const isCreator = (object, currentUser) => + object?.createdBy.id === currentUser?.id + +export const getInterpretationAccess = (interpretation, currentUser) => { + const canEditDelete = + isCreator(interpretation, currentUser) || + isSuperuser(currentUser?.authorities) + return { + share: interpretation.access.manage, + comment: interpretation.access.write, + edit: canEditDelete, + delete: canEditDelete, + } +} + +export const getCommentAccess = ( + comment, + hasInterpretationReplyAccess, + currentUser +) => { + const canEditDelete = + isCreator(comment, currentUser) || isSuperuser(currentUser?.authorities) + return { + edit: canEditDelete, + delete: canEditDelete && hasInterpretationReplyAccess, + } +} diff --git a/src/components/Interpretations/common/index.js b/src/components/Interpretations/common/index.js index 0565ea3b2..d3473298f 100644 --- a/src/components/Interpretations/common/index.js +++ b/src/components/Interpretations/common/index.js @@ -1,3 +1,3 @@ export * from './Interpretation/index.js' export * from './Message/index.js' -export * from './RichTextEditor/index.js' +export * from './getInterpretationAccess.js' diff --git a/src/components/LegendKey/LegendKey.js b/src/components/LegendKey/LegendKey.js index 873a95a2b..05104bf8b 100644 --- a/src/components/LegendKey/LegendKey.js +++ b/src/components/LegendKey/LegendKey.js @@ -5,7 +5,7 @@ import styles from './styles/LegendKey.style.js' const LegendKey = ({ legendSets }) => { return legendSets.length ? ( -
    +
    {legendSets.map((legendSet, index) => (
    { - const { offline } = useOnlineStatus() + const { isDisconnected: offline } = useDhis2ConnectionStatus() const notAllowed = disabled || (disabledWhenOffline && offline) diff --git a/src/components/OpenFileDialog/CustomSelectOption.js b/src/components/OpenFileDialog/CustomSelectOption.js index f1dab7e5b..d5dcd8fcb 100644 --- a/src/components/OpenFileDialog/CustomSelectOption.js +++ b/src/components/OpenFileDialog/CustomSelectOption.js @@ -39,11 +39,11 @@ export const CustomSelectOption = (props) => ) CustomSelectOption.propTypes = { - icon: PropTypes.element.isRequired, label: PropTypes.string.isRequired, value: PropTypes.string.isRequired, active: PropTypes.bool, disabled: PropTypes.bool, + icon: PropTypes.element, onClick: PropTypes.func, } diff --git a/src/components/OpenFileDialog/OpenFileDialog.js b/src/components/OpenFileDialog/OpenFileDialog.js index a59dfeb7a..ccc521624 100644 --- a/src/components/OpenFileDialog/OpenFileDialog.js +++ b/src/components/OpenFileDialog/OpenFileDialog.js @@ -46,7 +46,7 @@ const getQuery = (type) => ({ resource: AOTypeMap[type].apiEndpoint, params: ({ sortField = 'displayName', - sortDirection = 'asc', + sortDirection = 'iasc', page = 1, filters, }) => { @@ -134,8 +134,21 @@ export const OpenFileDialog = ({ return queryFilters }, [currentUser, filters]) + const formatSortDirection = useCallback(() => { + if (sortField === 'displayName' && sortDirection !== 'default') { + return `i${sortDirection}` + } + + return sortDirection + }, [sortField, sortDirection]) + const { loading, error, data, refetch } = useDataQuery(filesQuery, { lazy: true, + onComplete: (response) => { + if (page !== response.files.pager.page) { + setPage(response.files.pager.page) + } + }, }) const resetFilters = () => { @@ -161,11 +174,19 @@ export const OpenFileDialog = ({ refetch({ page, sortField, - sortDirection, + sortDirection: formatSortDirection(), filters: formatFilters(), }) } - }, [open, page, sortField, sortDirection, filters, refetch, formatFilters]) + }, [ + open, + page, + sortField, + filters, + refetch, + formatFilters, + formatSortDirection, + ]) const headers = [ { @@ -404,7 +425,7 @@ export const OpenFileDialog = ({ 0 && (
    diff --git a/src/components/Options/VisualizationOptions.js b/src/components/Options/VisualizationOptions.js index 4a86a9ac8..02e76be2b 100644 --- a/src/components/Options/VisualizationOptions.js +++ b/src/components/Options/VisualizationOptions.js @@ -18,6 +18,7 @@ import { modalContent, tabSection, tabSectionTitle, + tabSectionTitleDisabled, tabSectionTitleMargin, tabSectionOption, tabSectionOptionItem, @@ -30,8 +31,13 @@ import { tabSectionOptionIcon, } from './styles/VisualizationOptions.style.js' -const VisualizationOptions = ({ optionsConfig, onClose, onUpdate }) => { - const [activeTabKey, setActiveTabKey] = useState() +const VisualizationOptions = ({ + initiallyActiveTabKey, + optionsConfig, + onClose, + onUpdate, +}) => { + const [activeTabKey, setActiveTabKey] = useState(initiallyActiveTabKey) const generateTabContent = (sections) => sections.map(({ key, label, content, helpText }) => ( @@ -90,6 +96,7 @@ const VisualizationOptions = ({ optionsConfig, onClose, onUpdate }) => { {tabContent.styles} {tabSection.styles} {tabSectionTitle.styles} + {tabSectionTitleDisabled.styles} {tabSectionTitleMargin.styles} {tabSectionOption.styles} {tabSectionOptionItem.styles} @@ -144,6 +151,7 @@ const VisualizationOptions = ({ optionsConfig, onClose, onUpdate }) => { VisualizationOptions.propTypes = { optionsConfig: PropTypes.array.isRequired, + initiallyActiveTabKey: PropTypes.string, onClose: PropTypes.func, onUpdate: PropTypes.func, } diff --git a/src/components/Options/styles/VisualizationOptions.style.js b/src/components/Options/styles/VisualizationOptions.style.js index bcd74f517..61c87803f 100644 --- a/src/components/Options/styles/VisualizationOptions.style.js +++ b/src/components/Options/styles/VisualizationOptions.style.js @@ -51,6 +51,12 @@ export const tabSectionTitle = css.resolve` } ` +export const tabSectionTitleDisabled = css.resolve` + span { + color: ${colors.grey600}; + } +` + export const tabSectionTitleMargin = css.resolve` span { margin-top: ${spacers.dp8}; diff --git a/src/components/OrgUnitDimension/OrgUnitDimension.js b/src/components/OrgUnitDimension/OrgUnitDimension.js index e72372256..5d2d7115a 100644 --- a/src/components/OrgUnitDimension/OrgUnitDimension.js +++ b/src/components/OrgUnitDimension/OrgUnitDimension.js @@ -5,6 +5,8 @@ import { MultiSelect, MultiSelectOption, Button, + IconWarningFilled16, + colors, } from '@dhis2/ui' import cx from 'classnames' import PropTypes from 'prop-types' @@ -30,7 +32,16 @@ const DYNAMIC_ORG_UNITS = [ USER_ORG_UNIT_GRANDCHILDREN, ] -const OrgUnitDimension = ({ roots, selected, onSelect }) => { +const OrgUnitDimension = ({ + roots, + selected, + onSelect, + hideGroupSelect, + hideLevelSelect, + hideUserOrgUnits, + warning, + displayNameProp, +}) => { const [ouLevels, setOuLevels] = useState([]) const [ouGroups, setOuGroups] = useState([]) const dataEngine = useDataEngine() @@ -69,13 +80,16 @@ const OrgUnitDimension = ({ roots, selected, onSelect }) => { setOuLevels(result) } const doFetchOuGroups = async () => { - const result = await apiFetchOrganisationUnitGroups(dataEngine) + const result = await apiFetchOrganisationUnitGroups( + dataEngine, + displayNameProp + ) setOuGroups(result) } - doFetchOuLevels() - doFetchOuGroups() - }, [dataEngine]) + !hideLevelSelect && doFetchOuLevels() + !hideGroupSelect && doFetchOuGroups() + }, [dataEngine, hideLevelSelect, hideGroupSelect, displayNameProp]) const onLevelChange = (ids) => { const items = ids.map((id) => ({ @@ -176,48 +190,52 @@ const OrgUnitDimension = ({ roots, selected, onSelect }) => { return (
    -
    - item.id === USER_ORG_UNIT)} - onChange={({ checked }) => - onSelectItems({ - id: USER_ORG_UNIT, - checked, - displayName: i18n.t('User organisation unit'), - }) - } - dense - /> - item.id === USER_ORG_UNIT_CHILDREN - )} - onChange={({ checked }) => - onSelectItems({ - id: USER_ORG_UNIT_CHILDREN, - checked, - displayName: i18n.t('User sub-units'), - }) - } - dense - /> - item.id === USER_ORG_UNIT_GRANDCHILDREN - )} - onChange={({ checked }) => - onSelectItems({ - id: USER_ORG_UNIT_GRANDCHILDREN, - checked, - displayName: i18n.t('User sub-x2-units'), - }) - } - dense - /> -
    + {!hideUserOrgUnits && ( +
    + item.id === USER_ORG_UNIT + )} + onChange={({ checked }) => + onSelectItems({ + id: USER_ORG_UNIT, + checked, + displayName: i18n.t('User organisation unit'), + }) + } + dense + /> + item.id === USER_ORG_UNIT_CHILDREN + )} + onChange={({ checked }) => + onSelectItems({ + id: USER_ORG_UNIT_CHILDREN, + checked, + displayName: i18n.t('User sub-units'), + }) + } + dense + /> + item.id === USER_ORG_UNIT_GRANDCHILDREN + )} + onChange={({ checked }) => + onSelectItems({ + id: USER_ORG_UNIT_GRANDCHILDREN, + checked, + displayName: i18n.t('User sub-x2-units'), + }) + } + dense + /> +
    + )}
    @@ -261,65 +279,77 @@ const OrgUnitDimension = ({ roots, selected, onSelect }) => { disabled: selected.some((item) => DYNAMIC_ORG_UNITS.includes(item.id) ), + hidden: hideLevelSelect && hideGroupSelect, })} > - - ouIdHelper.hasLevelPrefix(item.id) - ) - .map((item) => - ouIdHelper.removePrefix(item.id) - ) - : [] - } - onChange={({ selected }) => onLevelChange(selected)} - placeholder={i18n.t('Select a level')} - loading={!ouLevels.length} - dense - dataTest={'org-unit-level-select'} - > - {ouLevels.map((level) => ( - - ))} - - - ouIdHelper.hasGroupPrefix(item.id) - ) - .map((item) => - ouIdHelper.removePrefix(item.id) - ) - : [] - } - onChange={({ selected }) => onGroupChange(selected)} - placeholder={i18n.t('Select a group')} - loading={!ouGroups.length} - dense - dataTest={'org-unit-group-select'} - > - {ouGroups.map((group) => ( - - ))} - + {!hideLevelSelect && ( + + ouIdHelper.hasLevelPrefix(item.id) + ) + .map((item) => + ouIdHelper.removePrefix(item.id) + ) + : [] + } + onChange={({ selected }) => onLevelChange(selected)} + placeholder={i18n.t('Select a level')} + loading={!ouLevels.length} + dense + dataTest={'org-unit-level-select'} + > + {ouLevels.map((level) => ( + + ))} + + )} + {!hideGroupSelect && ( + + ouIdHelper.hasGroupPrefix(item.id) + ) + .map((item) => + ouIdHelper.removePrefix(item.id) + ) + : [] + } + onChange={({ selected }) => onGroupChange(selected)} + placeholder={i18n.t('Select a group')} + loading={!ouGroups.length} + dense + dataTest={'org-unit-group-select'} + > + {ouGroups.map((group) => ( + + ))} + + )}
    - {getSummary()} + {warning ? ( +
    + + {warning} +
    + ) : ( + {getSummary()} + )}
    ) } + +OrgUnitDimension.defaultProps = { + hideGroupSelect: false, + hideLevelSelect: false, + hideUserOrgUnits: false, +} + OrgUnitDimension.propTypes = { + displayNameProp: PropTypes.string, + hideGroupSelect: PropTypes.bool, + hideLevelSelect: PropTypes.bool, + hideUserOrgUnits: PropTypes.bool, roots: PropTypes.arrayOf(PropTypes.string), selected: PropTypes.arrayOf( PropTypes.shape({ @@ -344,6 +385,7 @@ OrgUnitDimension.propTypes = { path: PropTypes.string, }) ), + warning: PropTypes.string, onSelect: PropTypes.func, } diff --git a/src/components/OrgUnitDimension/styles/OrgUnitDimension.style.js b/src/components/OrgUnitDimension/styles/OrgUnitDimension.style.js index b9a31f8e6..99f8e8a00 100644 --- a/src/components/OrgUnitDimension/styles/OrgUnitDimension.style.js +++ b/src/components/OrgUnitDimension/styles/OrgUnitDimension.style.js @@ -45,14 +45,32 @@ export default css` margin-top: ${spacers.dp12}; } + .selectsWrapper.hidden { + display: none; + } + .selectsWrapper > :global(*) { width: 50%; } .summaryWrapper { + display: inline-flex; + align-items: center; margin-top: ${spacers.dp8}; } + .warningWrapper { + display: inline-flex; + align-items: center; + } + + .warningText { + margin-left: ${spacers.dp8}; + font-size: 14px; + line-height: 18px; + color: ${colors.red600}; + } + .summaryText { font-size: 14px; line-height: 18px; diff --git a/src/components/PeriodDimension/PeriodDimension.js b/src/components/PeriodDimension/PeriodDimension.js index 09592ccd8..7e20dbc6e 100644 --- a/src/components/PeriodDimension/PeriodDimension.js +++ b/src/components/PeriodDimension/PeriodDimension.js @@ -1,14 +1,33 @@ +import { useConfig, useDataQuery } from '@dhis2/app-runtime' import PropTypes from 'prop-types' import React from 'react' import { DIMENSION_ID_PERIOD } from '../../modules/predefinedDimensions.js' import PeriodTransfer from './PeriodTransfer.js' +const userSettingsQuery = { + userSettings: { + resource: 'userSettings', + params: { + key: ['keyUiLocale'], + }, + }, +} + const PeriodDimension = ({ onSelect, selectedPeriods, rightFooter, excludedPeriodTypes, + infoBoxMessage, }) => { + const { systemInfo } = useConfig() + const result = useDataQuery(userSettingsQuery) + + const { calendar = 'gregory' } = systemInfo + const { data: { userSettings: { keyUiLocale: locale } = {} } = {} } = result + + const periodsSettings = { calendar, locale } + const selectPeriods = (periods) => { onSelect({ dimensionId: DIMENSION_ID_PERIOD, @@ -18,10 +37,12 @@ const PeriodDimension = ({ return ( ) } @@ -29,6 +50,7 @@ const PeriodDimension = ({ PeriodDimension.propTypes = { onSelect: PropTypes.func.isRequired, excludedPeriodTypes: PropTypes.arrayOf(PropTypes.string), + infoBoxMessage: PropTypes.string, rightFooter: PropTypes.node, selectedPeriods: PropTypes.array, } diff --git a/src/components/PeriodDimension/PeriodTransfer.js b/src/components/PeriodDimension/PeriodTransfer.js index 4f105df83..cd4095484 100644 --- a/src/components/PeriodDimension/PeriodTransfer.js +++ b/src/components/PeriodDimension/PeriodTransfer.js @@ -1,4 +1,5 @@ -import { TabBar, Tab, Transfer } from '@dhis2/ui' +import { getNowInCalendar } from '@dhis2/multi-calendar-dates' +import { IconInfo16, TabBar, Tab, Transfer } from '@dhis2/ui' import PropTypes from 'prop-types' import React, { useState } from 'react' import PeriodIcon from '../../assets/DimensionItemIcons/PeriodIcon.js' //TODO: Reimplement the icon.js @@ -16,20 +17,46 @@ import { getFixedPeriodsOptionsById } from './utils/fixedPeriods.js' import { MONTHLY, QUARTERLY } from './utils/index.js' import { getRelativePeriodsOptionsById } from './utils/relativePeriods.js' +const RightHeader = ({ infoBoxMessage }) => ( + <> +

    {i18n.t('Selected Periods')}

    + {infoBoxMessage && ( +
    +
    + +
    + {infoBoxMessage} +
    + )} + + +) + +RightHeader.propTypes = { + infoBoxMessage: PropTypes.string, +} + const PeriodTransfer = ({ onSelect, dataTest, - initialSelectedPeriods, + selectedItems, rightFooter, excludedPeriodTypes, + periodsSettings, + infoBoxMessage, }) => { const defaultRelativePeriodType = excludedPeriodTypes.includes(MONTHLY) ? getRelativePeriodsOptionsById(QUARTERLY) : getRelativePeriodsOptionsById(MONTHLY) const defaultFixedPeriodType = excludedPeriodTypes.includes(MONTHLY) - ? getFixedPeriodsOptionsById(QUARTERLY) - : getFixedPeriodsOptionsById(MONTHLY) - const defaultFixedPeriodYear = new Date().getFullYear() + ? getFixedPeriodsOptionsById(QUARTERLY, periodsSettings) + : getFixedPeriodsOptionsById(MONTHLY, periodsSettings) + + const now = getNowInCalendar(periodsSettings.calendar) + // use ".eraYear" rather than ".year" because in Ethiopian calendar, eraYear is what our users expect to see (for other calendars, it doesn't matter) + // there is still a pending decision in Temporal regarding which era to use by default: https://github.com/js-temporal/temporal-polyfill/blob/9350ee7dd0d29f329fc097debf923a517c32f813/lib/calendar.ts#L1964 + const defaultFixedPeriodYear = now.eraYear || now.year + const fixedPeriodConfig = (year) => ({ offset: year - defaultFixedPeriodYear, filterFuturePeriods: false, @@ -39,9 +66,6 @@ const PeriodTransfer = ({ const [allPeriods, setAllPeriods] = useState( defaultRelativePeriodType.getPeriods() ) - const [selectedPeriods, setSelectedPeriods] = useState( - initialSelectedPeriods - ) const [isRelative, setIsRelative] = useState(true) const [relativeFilter, setRelativeFilter] = useState({ periodType: defaultRelativePeriodType.id, @@ -51,6 +75,11 @@ const PeriodTransfer = ({ year: defaultFixedPeriodYear.toString(), }) + const isActive = (value) => { + const item = selectedItems.find((item) => item.id === value) + return !item || item.isActive + } + const onIsRelativeClick = (state) => { if (state !== isRelative) { setIsRelative(state) @@ -60,7 +89,8 @@ const PeriodTransfer = ({ relativeFilter.periodType ).getPeriods() : getFixedPeriodsOptionsById( - fixedFilter.periodType + fixedFilter.periodType, + periodsSettings ).getPeriods(fixedPeriodConfig(Number(fixedFilter.year))) ) } @@ -124,20 +154,20 @@ const PeriodTransfer = ({ ) - const renderRightHeader = () => ( - <> -

    {i18n.t('Selected Periods')}

    - - - ) - const onSelectFixedPeriods = (filter) => { setFixedFilter(filter) - setAllPeriods( - getFixedPeriodsOptionsById(filter.periodType).getPeriods( - fixedPeriodConfig(Number(filter.year)) + + if (filter.year.match(/[0-9]{4}/)) { + setAllPeriods( + getFixedPeriodsOptionsById( + filter.periodType, + periodsSettings + ).getPeriods( + fixedPeriodConfig(Number(filter.year)), + periodsSettings + ) ) - ) + } } const renderEmptySelection = () => ( @@ -150,33 +180,37 @@ const PeriodTransfer = ({ return ( { - const formattedItems = selected.map((id) => ({ - id, - name: [...allPeriods, ...selectedPeriods].find( + const formattedItems = selected.map((id) => { + const matchingItem = [...allPeriods, ...selectedItems].find( (item) => item.id === id - ).name, - })) - setSelectedPeriods(formattedItems) + ) + + return { + id, + name: matchingItem.name, + isActive: matchingItem.isActive, + } + }) onSelect(formattedItems) }} - selected={selectedPeriods.map((period) => period.id)} + selected={selectedItems.map((period) => period.id)} leftHeader={renderLeftHeader()} enableOrderChange height={TRANSFER_HEIGHT} optionsWidth={TRANSFER_OPTIONS_WIDTH} selectedWidth={TRANSFER_SELECTED_WIDTH} selectedEmptyComponent={renderEmptySelection()} - rightHeader={renderRightHeader()} + rightHeader={} rightFooter={rightFooter} - options={[...allPeriods, ...selectedPeriods].map( - ({ id, name }) => ({ - label: name, - value: id, - }) - )} - renderOption={(props) => ( + options={[...allPeriods, ...selectedItems].map(({ id, name }) => ({ + label: name, + value: id, + }))} + renderOption={({ value, ...props }) => ( @@ -187,21 +221,31 @@ const PeriodTransfer = ({ } PeriodTransfer.defaultProps = { - initialSelectedPeriods: [], + selectedItems: [], excludedPeriodTypes: [], + periodsSettings: { + calendar: 'gregory', + locale: 'en', + }, } PeriodTransfer.propTypes = { onSelect: PropTypes.func.isRequired, dataTest: PropTypes.string, excludedPeriodTypes: PropTypes.arrayOf(PropTypes.string), - initialSelectedPeriods: PropTypes.arrayOf( + infoBoxMessage: PropTypes.string, + periodsSettings: PropTypes.shape({ + calendar: PropTypes.string, + locale: PropTypes.string, + }), + rightFooter: PropTypes.node, + selectedItems: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.string, + isActive: PropTypes.bool, name: PropTypes.string, }) ), - rightFooter: PropTypes.node, } export default PeriodTransfer diff --git a/src/components/PeriodDimension/__tests__/PeriodDimension.spec.js b/src/components/PeriodDimension/__tests__/PeriodDimension.spec.js index a6081018c..8a10c9518 100644 --- a/src/components/PeriodDimension/__tests__/PeriodDimension.spec.js +++ b/src/components/PeriodDimension/__tests__/PeriodDimension.spec.js @@ -2,6 +2,13 @@ import { shallow } from 'enzyme' import React from 'react' import PeriodDimension from '../PeriodDimension.js' +jest.mock('@dhis2/app-runtime', () => ({ + useConfig: () => ({ systemInfo: {} }), + useDataQuery: () => ({ data: { userSettings: { keyUiLocale: 'en' } } }), +})) + +afterEach(jest.clearAllMocks) + describe('The Period Dimension component', () => { let props let shallowPeriodDimension diff --git a/src/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap b/src/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap index c7c95c7f7..4ad9ab073 100644 --- a/src/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +++ b/src/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap @@ -4,8 +4,14 @@ exports[`The Period Dimension component matches the snapshot 1`] = ` } + selectedItems={Array []} /> `; diff --git a/src/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap b/src/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap index fa5dbe8d4..d13930874 100644 --- a/src/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +++ b/src/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap @@ -77,18 +77,7 @@ exports[`The Period Selector component matches the snapshot 1`] = ` optionsWidth="420px" renderOption={[Function]} rightFooter={} - rightHeader={ - -

    - Selected Periods -

    - -
    - } + rightHeader={} selected={Array []} selectedEmptyComponent={ diff --git a/src/components/PeriodDimension/__tests__/__snapshots__/fixedPeriods.spec.js.snap b/src/components/PeriodDimension/__tests__/__snapshots__/fixedPeriods.spec.js.snap index be670cf0c..69aaa2343 100644 --- a/src/components/PeriodDimension/__tests__/__snapshots__/fixedPeriods.spec.js.snap +++ b/src/components/PeriodDimension/__tests__/__snapshots__/fixedPeriods.spec.js.snap @@ -6,185 +6,237 @@ Object { "name": "Bi-weekly", "options": Array [ Object { + "displayName": "Bi-Week 1 - 2013-12-30 - 2014-01-12", "endDate": "2014-01-12", "id": "2014BiW1", "iso": "2014BiW1", "name": "Bi-Week 1 - 2013-12-30 - 2014-01-12", + "periodType": "BIWEEKLY", "startDate": "2013-12-30", }, Object { + "displayName": "Bi-Week 2 - 2014-01-13 - 2014-01-26", "endDate": "2014-01-26", "id": "2014BiW2", "iso": "2014BiW2", "name": "Bi-Week 2 - 2014-01-13 - 2014-01-26", + "periodType": "BIWEEKLY", "startDate": "2014-01-13", }, Object { + "displayName": "Bi-Week 3 - 2014-01-27 - 2014-02-09", "endDate": "2014-02-09", "id": "2014BiW3", "iso": "2014BiW3", "name": "Bi-Week 3 - 2014-01-27 - 2014-02-09", + "periodType": "BIWEEKLY", "startDate": "2014-01-27", }, Object { + "displayName": "Bi-Week 4 - 2014-02-10 - 2014-02-23", "endDate": "2014-02-23", "id": "2014BiW4", "iso": "2014BiW4", "name": "Bi-Week 4 - 2014-02-10 - 2014-02-23", + "periodType": "BIWEEKLY", "startDate": "2014-02-10", }, Object { + "displayName": "Bi-Week 5 - 2014-02-24 - 2014-03-09", "endDate": "2014-03-09", "id": "2014BiW5", "iso": "2014BiW5", "name": "Bi-Week 5 - 2014-02-24 - 2014-03-09", + "periodType": "BIWEEKLY", "startDate": "2014-02-24", }, Object { + "displayName": "Bi-Week 6 - 2014-03-10 - 2014-03-23", "endDate": "2014-03-23", "id": "2014BiW6", "iso": "2014BiW6", "name": "Bi-Week 6 - 2014-03-10 - 2014-03-23", + "periodType": "BIWEEKLY", "startDate": "2014-03-10", }, Object { + "displayName": "Bi-Week 7 - 2014-03-24 - 2014-04-06", "endDate": "2014-04-06", "id": "2014BiW7", "iso": "2014BiW7", "name": "Bi-Week 7 - 2014-03-24 - 2014-04-06", + "periodType": "BIWEEKLY", "startDate": "2014-03-24", }, Object { + "displayName": "Bi-Week 8 - 2014-04-07 - 2014-04-20", "endDate": "2014-04-20", "id": "2014BiW8", "iso": "2014BiW8", "name": "Bi-Week 8 - 2014-04-07 - 2014-04-20", + "periodType": "BIWEEKLY", "startDate": "2014-04-07", }, Object { + "displayName": "Bi-Week 9 - 2014-04-21 - 2014-05-04", "endDate": "2014-05-04", "id": "2014BiW9", "iso": "2014BiW9", "name": "Bi-Week 9 - 2014-04-21 - 2014-05-04", + "periodType": "BIWEEKLY", "startDate": "2014-04-21", }, Object { + "displayName": "Bi-Week 10 - 2014-05-05 - 2014-05-18", "endDate": "2014-05-18", "id": "2014BiW10", "iso": "2014BiW10", "name": "Bi-Week 10 - 2014-05-05 - 2014-05-18", + "periodType": "BIWEEKLY", "startDate": "2014-05-05", }, Object { + "displayName": "Bi-Week 11 - 2014-05-19 - 2014-06-01", "endDate": "2014-06-01", "id": "2014BiW11", "iso": "2014BiW11", "name": "Bi-Week 11 - 2014-05-19 - 2014-06-01", + "periodType": "BIWEEKLY", "startDate": "2014-05-19", }, Object { + "displayName": "Bi-Week 12 - 2014-06-02 - 2014-06-15", "endDate": "2014-06-15", "id": "2014BiW12", "iso": "2014BiW12", "name": "Bi-Week 12 - 2014-06-02 - 2014-06-15", + "periodType": "BIWEEKLY", "startDate": "2014-06-02", }, Object { + "displayName": "Bi-Week 13 - 2014-06-16 - 2014-06-29", "endDate": "2014-06-29", "id": "2014BiW13", "iso": "2014BiW13", "name": "Bi-Week 13 - 2014-06-16 - 2014-06-29", + "periodType": "BIWEEKLY", "startDate": "2014-06-16", }, Object { + "displayName": "Bi-Week 14 - 2014-06-30 - 2014-07-13", "endDate": "2014-07-13", "id": "2014BiW14", "iso": "2014BiW14", "name": "Bi-Week 14 - 2014-06-30 - 2014-07-13", + "periodType": "BIWEEKLY", "startDate": "2014-06-30", }, Object { + "displayName": "Bi-Week 15 - 2014-07-14 - 2014-07-27", "endDate": "2014-07-27", "id": "2014BiW15", "iso": "2014BiW15", "name": "Bi-Week 15 - 2014-07-14 - 2014-07-27", + "periodType": "BIWEEKLY", "startDate": "2014-07-14", }, Object { + "displayName": "Bi-Week 16 - 2014-07-28 - 2014-08-10", "endDate": "2014-08-10", "id": "2014BiW16", "iso": "2014BiW16", "name": "Bi-Week 16 - 2014-07-28 - 2014-08-10", + "periodType": "BIWEEKLY", "startDate": "2014-07-28", }, Object { + "displayName": "Bi-Week 17 - 2014-08-11 - 2014-08-24", "endDate": "2014-08-24", "id": "2014BiW17", "iso": "2014BiW17", "name": "Bi-Week 17 - 2014-08-11 - 2014-08-24", + "periodType": "BIWEEKLY", "startDate": "2014-08-11", }, Object { + "displayName": "Bi-Week 18 - 2014-08-25 - 2014-09-07", "endDate": "2014-09-07", "id": "2014BiW18", "iso": "2014BiW18", "name": "Bi-Week 18 - 2014-08-25 - 2014-09-07", + "periodType": "BIWEEKLY", "startDate": "2014-08-25", }, Object { + "displayName": "Bi-Week 19 - 2014-09-08 - 2014-09-21", "endDate": "2014-09-21", "id": "2014BiW19", "iso": "2014BiW19", "name": "Bi-Week 19 - 2014-09-08 - 2014-09-21", + "periodType": "BIWEEKLY", "startDate": "2014-09-08", }, Object { + "displayName": "Bi-Week 20 - 2014-09-22 - 2014-10-05", "endDate": "2014-10-05", "id": "2014BiW20", "iso": "2014BiW20", "name": "Bi-Week 20 - 2014-09-22 - 2014-10-05", + "periodType": "BIWEEKLY", "startDate": "2014-09-22", }, Object { + "displayName": "Bi-Week 21 - 2014-10-06 - 2014-10-19", "endDate": "2014-10-19", "id": "2014BiW21", "iso": "2014BiW21", "name": "Bi-Week 21 - 2014-10-06 - 2014-10-19", + "periodType": "BIWEEKLY", "startDate": "2014-10-06", }, Object { + "displayName": "Bi-Week 22 - 2014-10-20 - 2014-11-02", "endDate": "2014-11-02", "id": "2014BiW22", "iso": "2014BiW22", "name": "Bi-Week 22 - 2014-10-20 - 2014-11-02", + "periodType": "BIWEEKLY", "startDate": "2014-10-20", }, Object { + "displayName": "Bi-Week 23 - 2014-11-03 - 2014-11-16", "endDate": "2014-11-16", "id": "2014BiW23", "iso": "2014BiW23", "name": "Bi-Week 23 - 2014-11-03 - 2014-11-16", + "periodType": "BIWEEKLY", "startDate": "2014-11-03", }, Object { + "displayName": "Bi-Week 24 - 2014-11-17 - 2014-11-30", "endDate": "2014-11-30", "id": "2014BiW24", "iso": "2014BiW24", "name": "Bi-Week 24 - 2014-11-17 - 2014-11-30", + "periodType": "BIWEEKLY", "startDate": "2014-11-17", }, Object { + "displayName": "Bi-Week 25 - 2014-12-01 - 2014-12-14", "endDate": "2014-12-14", "id": "2014BiW25", "iso": "2014BiW25", "name": "Bi-Week 25 - 2014-12-01 - 2014-12-14", + "periodType": "BIWEEKLY", "startDate": "2014-12-01", }, Object { + "displayName": "Bi-Week 26 - 2014-12-15 - 2014-12-28", "endDate": "2014-12-28", "id": "2014BiW26", "iso": "2014BiW26", "name": "Bi-Week 26 - 2014-12-15 - 2014-12-28", + "periodType": "BIWEEKLY", "startDate": "2014-12-15", }, ], @@ -198,45 +250,57 @@ Object { "name": "Bi-monthly", "options": Array [ Object { + "displayName": "January - February 2014", "endDate": "2014-02-28", "id": "201401B", "iso": "201401B", "name": "January - February 2014", + "periodType": "BIMONTHLY", "startDate": "2014-01-01", }, Object { + "displayName": "March - April 2014", "endDate": "2014-04-30", "id": "201402B", "iso": "201402B", "name": "March - April 2014", + "periodType": "BIMONTHLY", "startDate": "2014-03-01", }, Object { + "displayName": "May - June 2014", "endDate": "2014-06-30", "id": "201403B", "iso": "201403B", "name": "May - June 2014", + "periodType": "BIMONTHLY", "startDate": "2014-05-01", }, Object { + "displayName": "July - August 2014", "endDate": "2014-08-31", "id": "201404B", "iso": "201404B", "name": "July - August 2014", + "periodType": "BIMONTHLY", "startDate": "2014-07-01", }, Object { + "displayName": "September - October 2014", "endDate": "2014-10-31", "id": "201405B", "iso": "201405B", "name": "September - October 2014", + "periodType": "BIMONTHLY", "startDate": "2014-09-01", }, Object { + "displayName": "November - December 2014", "endDate": "2014-12-31", "id": "201406B", "iso": "201406B", "name": "November - December 2014", + "periodType": "BIMONTHLY", "startDate": "2014-11-01", }, ], @@ -250,2558 +314,3288 @@ Object { "name": "Daily", "options": Array [ Object { + "displayName": "January 1, 2014", "endDate": "2014-01-01", "id": "20140101", "iso": "20140101", "name": "2014-01-01", + "periodType": "DAILY", "startDate": "2014-01-01", }, Object { + "displayName": "January 2, 2014", "endDate": "2014-01-02", "id": "20140102", "iso": "20140102", "name": "2014-01-02", + "periodType": "DAILY", "startDate": "2014-01-02", }, Object { + "displayName": "January 3, 2014", "endDate": "2014-01-03", "id": "20140103", "iso": "20140103", "name": "2014-01-03", + "periodType": "DAILY", "startDate": "2014-01-03", }, Object { + "displayName": "January 4, 2014", "endDate": "2014-01-04", "id": "20140104", "iso": "20140104", "name": "2014-01-04", + "periodType": "DAILY", "startDate": "2014-01-04", }, Object { + "displayName": "January 5, 2014", "endDate": "2014-01-05", "id": "20140105", "iso": "20140105", "name": "2014-01-05", + "periodType": "DAILY", "startDate": "2014-01-05", }, Object { + "displayName": "January 6, 2014", "endDate": "2014-01-06", "id": "20140106", "iso": "20140106", "name": "2014-01-06", + "periodType": "DAILY", "startDate": "2014-01-06", }, Object { + "displayName": "January 7, 2014", "endDate": "2014-01-07", "id": "20140107", "iso": "20140107", "name": "2014-01-07", + "periodType": "DAILY", "startDate": "2014-01-07", }, Object { + "displayName": "January 8, 2014", "endDate": "2014-01-08", "id": "20140108", "iso": "20140108", "name": "2014-01-08", + "periodType": "DAILY", "startDate": "2014-01-08", }, Object { + "displayName": "January 9, 2014", "endDate": "2014-01-09", "id": "20140109", "iso": "20140109", "name": "2014-01-09", + "periodType": "DAILY", "startDate": "2014-01-09", }, Object { + "displayName": "January 10, 2014", "endDate": "2014-01-10", "id": "20140110", "iso": "20140110", "name": "2014-01-10", + "periodType": "DAILY", "startDate": "2014-01-10", }, Object { + "displayName": "January 11, 2014", "endDate": "2014-01-11", "id": "20140111", "iso": "20140111", "name": "2014-01-11", + "periodType": "DAILY", "startDate": "2014-01-11", }, Object { + "displayName": "January 12, 2014", "endDate": "2014-01-12", "id": "20140112", "iso": "20140112", "name": "2014-01-12", + "periodType": "DAILY", "startDate": "2014-01-12", }, Object { + "displayName": "January 13, 2014", "endDate": "2014-01-13", "id": "20140113", "iso": "20140113", "name": "2014-01-13", + "periodType": "DAILY", "startDate": "2014-01-13", }, Object { + "displayName": "January 14, 2014", "endDate": "2014-01-14", "id": "20140114", "iso": "20140114", "name": "2014-01-14", + "periodType": "DAILY", "startDate": "2014-01-14", }, Object { + "displayName": "January 15, 2014", "endDate": "2014-01-15", "id": "20140115", "iso": "20140115", "name": "2014-01-15", + "periodType": "DAILY", "startDate": "2014-01-15", }, Object { + "displayName": "January 16, 2014", "endDate": "2014-01-16", "id": "20140116", "iso": "20140116", "name": "2014-01-16", + "periodType": "DAILY", "startDate": "2014-01-16", }, Object { + "displayName": "January 17, 2014", "endDate": "2014-01-17", "id": "20140117", "iso": "20140117", "name": "2014-01-17", + "periodType": "DAILY", "startDate": "2014-01-17", }, Object { + "displayName": "January 18, 2014", "endDate": "2014-01-18", "id": "20140118", "iso": "20140118", "name": "2014-01-18", + "periodType": "DAILY", "startDate": "2014-01-18", }, Object { + "displayName": "January 19, 2014", "endDate": "2014-01-19", "id": "20140119", "iso": "20140119", "name": "2014-01-19", + "periodType": "DAILY", "startDate": "2014-01-19", }, Object { + "displayName": "January 20, 2014", "endDate": "2014-01-20", "id": "20140120", "iso": "20140120", "name": "2014-01-20", + "periodType": "DAILY", "startDate": "2014-01-20", }, Object { + "displayName": "January 21, 2014", "endDate": "2014-01-21", "id": "20140121", "iso": "20140121", "name": "2014-01-21", + "periodType": "DAILY", "startDate": "2014-01-21", }, Object { + "displayName": "January 22, 2014", "endDate": "2014-01-22", "id": "20140122", "iso": "20140122", "name": "2014-01-22", + "periodType": "DAILY", "startDate": "2014-01-22", }, Object { + "displayName": "January 23, 2014", "endDate": "2014-01-23", "id": "20140123", "iso": "20140123", "name": "2014-01-23", + "periodType": "DAILY", "startDate": "2014-01-23", }, Object { + "displayName": "January 24, 2014", "endDate": "2014-01-24", "id": "20140124", "iso": "20140124", "name": "2014-01-24", + "periodType": "DAILY", "startDate": "2014-01-24", }, Object { + "displayName": "January 25, 2014", "endDate": "2014-01-25", "id": "20140125", "iso": "20140125", "name": "2014-01-25", + "periodType": "DAILY", "startDate": "2014-01-25", }, Object { + "displayName": "January 26, 2014", "endDate": "2014-01-26", "id": "20140126", "iso": "20140126", "name": "2014-01-26", + "periodType": "DAILY", "startDate": "2014-01-26", }, Object { + "displayName": "January 27, 2014", "endDate": "2014-01-27", "id": "20140127", "iso": "20140127", "name": "2014-01-27", + "periodType": "DAILY", "startDate": "2014-01-27", }, Object { + "displayName": "January 28, 2014", "endDate": "2014-01-28", "id": "20140128", "iso": "20140128", "name": "2014-01-28", + "periodType": "DAILY", "startDate": "2014-01-28", }, Object { + "displayName": "January 29, 2014", "endDate": "2014-01-29", "id": "20140129", "iso": "20140129", "name": "2014-01-29", + "periodType": "DAILY", "startDate": "2014-01-29", }, Object { + "displayName": "January 30, 2014", "endDate": "2014-01-30", "id": "20140130", "iso": "20140130", "name": "2014-01-30", + "periodType": "DAILY", "startDate": "2014-01-30", }, Object { + "displayName": "January 31, 2014", "endDate": "2014-01-31", "id": "20140131", "iso": "20140131", "name": "2014-01-31", + "periodType": "DAILY", "startDate": "2014-01-31", }, Object { + "displayName": "February 1, 2014", "endDate": "2014-02-01", "id": "20140201", "iso": "20140201", "name": "2014-02-01", + "periodType": "DAILY", "startDate": "2014-02-01", }, Object { + "displayName": "February 2, 2014", "endDate": "2014-02-02", "id": "20140202", "iso": "20140202", "name": "2014-02-02", + "periodType": "DAILY", "startDate": "2014-02-02", }, Object { + "displayName": "February 3, 2014", "endDate": "2014-02-03", "id": "20140203", "iso": "20140203", "name": "2014-02-03", + "periodType": "DAILY", "startDate": "2014-02-03", }, Object { + "displayName": "February 4, 2014", "endDate": "2014-02-04", "id": "20140204", "iso": "20140204", "name": "2014-02-04", + "periodType": "DAILY", "startDate": "2014-02-04", }, Object { + "displayName": "February 5, 2014", "endDate": "2014-02-05", "id": "20140205", "iso": "20140205", "name": "2014-02-05", + "periodType": "DAILY", "startDate": "2014-02-05", }, Object { + "displayName": "February 6, 2014", "endDate": "2014-02-06", "id": "20140206", "iso": "20140206", "name": "2014-02-06", + "periodType": "DAILY", "startDate": "2014-02-06", }, Object { + "displayName": "February 7, 2014", "endDate": "2014-02-07", "id": "20140207", "iso": "20140207", "name": "2014-02-07", + "periodType": "DAILY", "startDate": "2014-02-07", }, Object { + "displayName": "February 8, 2014", "endDate": "2014-02-08", "id": "20140208", "iso": "20140208", "name": "2014-02-08", + "periodType": "DAILY", "startDate": "2014-02-08", }, Object { + "displayName": "February 9, 2014", "endDate": "2014-02-09", "id": "20140209", "iso": "20140209", "name": "2014-02-09", + "periodType": "DAILY", "startDate": "2014-02-09", }, Object { + "displayName": "February 10, 2014", "endDate": "2014-02-10", "id": "20140210", "iso": "20140210", "name": "2014-02-10", + "periodType": "DAILY", "startDate": "2014-02-10", }, Object { + "displayName": "February 11, 2014", "endDate": "2014-02-11", "id": "20140211", "iso": "20140211", "name": "2014-02-11", + "periodType": "DAILY", "startDate": "2014-02-11", }, Object { + "displayName": "February 12, 2014", "endDate": "2014-02-12", "id": "20140212", "iso": "20140212", "name": "2014-02-12", + "periodType": "DAILY", "startDate": "2014-02-12", }, Object { + "displayName": "February 13, 2014", "endDate": "2014-02-13", "id": "20140213", "iso": "20140213", "name": "2014-02-13", + "periodType": "DAILY", "startDate": "2014-02-13", }, Object { + "displayName": "February 14, 2014", "endDate": "2014-02-14", "id": "20140214", "iso": "20140214", "name": "2014-02-14", + "periodType": "DAILY", "startDate": "2014-02-14", }, Object { + "displayName": "February 15, 2014", "endDate": "2014-02-15", "id": "20140215", "iso": "20140215", "name": "2014-02-15", + "periodType": "DAILY", "startDate": "2014-02-15", }, Object { + "displayName": "February 16, 2014", "endDate": "2014-02-16", "id": "20140216", "iso": "20140216", "name": "2014-02-16", + "periodType": "DAILY", "startDate": "2014-02-16", }, Object { + "displayName": "February 17, 2014", "endDate": "2014-02-17", "id": "20140217", "iso": "20140217", "name": "2014-02-17", + "periodType": "DAILY", "startDate": "2014-02-17", }, Object { + "displayName": "February 18, 2014", "endDate": "2014-02-18", "id": "20140218", "iso": "20140218", "name": "2014-02-18", + "periodType": "DAILY", "startDate": "2014-02-18", }, Object { + "displayName": "February 19, 2014", "endDate": "2014-02-19", "id": "20140219", "iso": "20140219", "name": "2014-02-19", + "periodType": "DAILY", "startDate": "2014-02-19", }, Object { + "displayName": "February 20, 2014", "endDate": "2014-02-20", "id": "20140220", "iso": "20140220", "name": "2014-02-20", + "periodType": "DAILY", "startDate": "2014-02-20", }, Object { + "displayName": "February 21, 2014", "endDate": "2014-02-21", "id": "20140221", "iso": "20140221", "name": "2014-02-21", + "periodType": "DAILY", "startDate": "2014-02-21", }, Object { + "displayName": "February 22, 2014", "endDate": "2014-02-22", "id": "20140222", "iso": "20140222", "name": "2014-02-22", + "periodType": "DAILY", "startDate": "2014-02-22", }, Object { + "displayName": "February 23, 2014", "endDate": "2014-02-23", "id": "20140223", "iso": "20140223", "name": "2014-02-23", + "periodType": "DAILY", "startDate": "2014-02-23", }, Object { + "displayName": "February 24, 2014", "endDate": "2014-02-24", "id": "20140224", "iso": "20140224", "name": "2014-02-24", + "periodType": "DAILY", "startDate": "2014-02-24", }, Object { + "displayName": "February 25, 2014", "endDate": "2014-02-25", "id": "20140225", "iso": "20140225", "name": "2014-02-25", + "periodType": "DAILY", "startDate": "2014-02-25", }, Object { + "displayName": "February 26, 2014", "endDate": "2014-02-26", "id": "20140226", "iso": "20140226", "name": "2014-02-26", + "periodType": "DAILY", "startDate": "2014-02-26", }, Object { + "displayName": "February 27, 2014", "endDate": "2014-02-27", "id": "20140227", "iso": "20140227", "name": "2014-02-27", + "periodType": "DAILY", "startDate": "2014-02-27", }, Object { + "displayName": "February 28, 2014", "endDate": "2014-02-28", "id": "20140228", "iso": "20140228", "name": "2014-02-28", + "periodType": "DAILY", "startDate": "2014-02-28", }, Object { + "displayName": "March 1, 2014", "endDate": "2014-03-01", "id": "20140301", "iso": "20140301", "name": "2014-03-01", + "periodType": "DAILY", "startDate": "2014-03-01", }, Object { + "displayName": "March 2, 2014", "endDate": "2014-03-02", "id": "20140302", "iso": "20140302", "name": "2014-03-02", + "periodType": "DAILY", "startDate": "2014-03-02", }, Object { + "displayName": "March 3, 2014", "endDate": "2014-03-03", "id": "20140303", "iso": "20140303", "name": "2014-03-03", + "periodType": "DAILY", "startDate": "2014-03-03", }, Object { + "displayName": "March 4, 2014", "endDate": "2014-03-04", "id": "20140304", "iso": "20140304", "name": "2014-03-04", + "periodType": "DAILY", "startDate": "2014-03-04", }, Object { + "displayName": "March 5, 2014", "endDate": "2014-03-05", "id": "20140305", "iso": "20140305", "name": "2014-03-05", + "periodType": "DAILY", "startDate": "2014-03-05", }, Object { + "displayName": "March 6, 2014", "endDate": "2014-03-06", "id": "20140306", "iso": "20140306", "name": "2014-03-06", + "periodType": "DAILY", "startDate": "2014-03-06", }, Object { + "displayName": "March 7, 2014", "endDate": "2014-03-07", "id": "20140307", "iso": "20140307", "name": "2014-03-07", + "periodType": "DAILY", "startDate": "2014-03-07", }, Object { + "displayName": "March 8, 2014", "endDate": "2014-03-08", "id": "20140308", "iso": "20140308", "name": "2014-03-08", + "periodType": "DAILY", "startDate": "2014-03-08", }, Object { + "displayName": "March 9, 2014", "endDate": "2014-03-09", "id": "20140309", "iso": "20140309", "name": "2014-03-09", + "periodType": "DAILY", "startDate": "2014-03-09", }, Object { + "displayName": "March 10, 2014", "endDate": "2014-03-10", "id": "20140310", "iso": "20140310", "name": "2014-03-10", + "periodType": "DAILY", "startDate": "2014-03-10", }, Object { + "displayName": "March 11, 2014", "endDate": "2014-03-11", "id": "20140311", "iso": "20140311", "name": "2014-03-11", + "periodType": "DAILY", "startDate": "2014-03-11", }, Object { + "displayName": "March 12, 2014", "endDate": "2014-03-12", "id": "20140312", "iso": "20140312", "name": "2014-03-12", + "periodType": "DAILY", "startDate": "2014-03-12", }, Object { + "displayName": "March 13, 2014", "endDate": "2014-03-13", "id": "20140313", "iso": "20140313", "name": "2014-03-13", + "periodType": "DAILY", "startDate": "2014-03-13", }, Object { + "displayName": "March 14, 2014", "endDate": "2014-03-14", "id": "20140314", "iso": "20140314", "name": "2014-03-14", + "periodType": "DAILY", "startDate": "2014-03-14", }, Object { + "displayName": "March 15, 2014", "endDate": "2014-03-15", "id": "20140315", "iso": "20140315", "name": "2014-03-15", + "periodType": "DAILY", "startDate": "2014-03-15", }, Object { + "displayName": "March 16, 2014", "endDate": "2014-03-16", "id": "20140316", "iso": "20140316", "name": "2014-03-16", + "periodType": "DAILY", "startDate": "2014-03-16", }, Object { + "displayName": "March 17, 2014", "endDate": "2014-03-17", "id": "20140317", "iso": "20140317", "name": "2014-03-17", + "periodType": "DAILY", "startDate": "2014-03-17", }, Object { + "displayName": "March 18, 2014", "endDate": "2014-03-18", "id": "20140318", "iso": "20140318", "name": "2014-03-18", + "periodType": "DAILY", "startDate": "2014-03-18", }, Object { + "displayName": "March 19, 2014", "endDate": "2014-03-19", "id": "20140319", "iso": "20140319", "name": "2014-03-19", + "periodType": "DAILY", "startDate": "2014-03-19", }, Object { + "displayName": "March 20, 2014", "endDate": "2014-03-20", "id": "20140320", "iso": "20140320", "name": "2014-03-20", + "periodType": "DAILY", "startDate": "2014-03-20", }, Object { + "displayName": "March 21, 2014", "endDate": "2014-03-21", "id": "20140321", "iso": "20140321", "name": "2014-03-21", + "periodType": "DAILY", "startDate": "2014-03-21", }, Object { + "displayName": "March 22, 2014", "endDate": "2014-03-22", "id": "20140322", "iso": "20140322", "name": "2014-03-22", + "periodType": "DAILY", "startDate": "2014-03-22", }, Object { + "displayName": "March 23, 2014", "endDate": "2014-03-23", "id": "20140323", "iso": "20140323", "name": "2014-03-23", + "periodType": "DAILY", "startDate": "2014-03-23", }, Object { + "displayName": "March 24, 2014", "endDate": "2014-03-24", "id": "20140324", "iso": "20140324", "name": "2014-03-24", + "periodType": "DAILY", "startDate": "2014-03-24", }, Object { + "displayName": "March 25, 2014", "endDate": "2014-03-25", "id": "20140325", "iso": "20140325", "name": "2014-03-25", + "periodType": "DAILY", "startDate": "2014-03-25", }, Object { + "displayName": "March 26, 2014", "endDate": "2014-03-26", "id": "20140326", "iso": "20140326", "name": "2014-03-26", + "periodType": "DAILY", "startDate": "2014-03-26", }, Object { + "displayName": "March 27, 2014", "endDate": "2014-03-27", "id": "20140327", "iso": "20140327", "name": "2014-03-27", + "periodType": "DAILY", "startDate": "2014-03-27", }, Object { + "displayName": "March 28, 2014", "endDate": "2014-03-28", "id": "20140328", "iso": "20140328", "name": "2014-03-28", + "periodType": "DAILY", "startDate": "2014-03-28", }, Object { + "displayName": "March 29, 2014", "endDate": "2014-03-29", "id": "20140329", "iso": "20140329", "name": "2014-03-29", + "periodType": "DAILY", "startDate": "2014-03-29", }, Object { + "displayName": "March 30, 2014", "endDate": "2014-03-30", "id": "20140330", "iso": "20140330", "name": "2014-03-30", + "periodType": "DAILY", "startDate": "2014-03-30", }, Object { + "displayName": "March 31, 2014", "endDate": "2014-03-31", "id": "20140331", "iso": "20140331", "name": "2014-03-31", + "periodType": "DAILY", "startDate": "2014-03-31", }, Object { + "displayName": "April 1, 2014", "endDate": "2014-04-01", "id": "20140401", "iso": "20140401", "name": "2014-04-01", + "periodType": "DAILY", "startDate": "2014-04-01", }, Object { + "displayName": "April 2, 2014", "endDate": "2014-04-02", "id": "20140402", "iso": "20140402", "name": "2014-04-02", + "periodType": "DAILY", "startDate": "2014-04-02", }, Object { + "displayName": "April 3, 2014", "endDate": "2014-04-03", "id": "20140403", "iso": "20140403", "name": "2014-04-03", + "periodType": "DAILY", "startDate": "2014-04-03", }, Object { + "displayName": "April 4, 2014", "endDate": "2014-04-04", "id": "20140404", "iso": "20140404", "name": "2014-04-04", + "periodType": "DAILY", "startDate": "2014-04-04", }, Object { + "displayName": "April 5, 2014", "endDate": "2014-04-05", "id": "20140405", "iso": "20140405", "name": "2014-04-05", + "periodType": "DAILY", "startDate": "2014-04-05", }, Object { + "displayName": "April 6, 2014", "endDate": "2014-04-06", "id": "20140406", "iso": "20140406", "name": "2014-04-06", + "periodType": "DAILY", "startDate": "2014-04-06", }, Object { + "displayName": "April 7, 2014", "endDate": "2014-04-07", "id": "20140407", "iso": "20140407", "name": "2014-04-07", + "periodType": "DAILY", "startDate": "2014-04-07", }, Object { + "displayName": "April 8, 2014", "endDate": "2014-04-08", "id": "20140408", "iso": "20140408", "name": "2014-04-08", + "periodType": "DAILY", "startDate": "2014-04-08", }, Object { + "displayName": "April 9, 2014", "endDate": "2014-04-09", "id": "20140409", "iso": "20140409", "name": "2014-04-09", + "periodType": "DAILY", "startDate": "2014-04-09", }, Object { + "displayName": "April 10, 2014", "endDate": "2014-04-10", "id": "20140410", "iso": "20140410", "name": "2014-04-10", + "periodType": "DAILY", "startDate": "2014-04-10", }, Object { + "displayName": "April 11, 2014", "endDate": "2014-04-11", "id": "20140411", "iso": "20140411", "name": "2014-04-11", + "periodType": "DAILY", "startDate": "2014-04-11", }, Object { + "displayName": "April 12, 2014", "endDate": "2014-04-12", "id": "20140412", "iso": "20140412", "name": "2014-04-12", + "periodType": "DAILY", "startDate": "2014-04-12", }, Object { + "displayName": "April 13, 2014", "endDate": "2014-04-13", "id": "20140413", "iso": "20140413", "name": "2014-04-13", + "periodType": "DAILY", "startDate": "2014-04-13", }, Object { + "displayName": "April 14, 2014", "endDate": "2014-04-14", "id": "20140414", "iso": "20140414", "name": "2014-04-14", + "periodType": "DAILY", "startDate": "2014-04-14", }, Object { + "displayName": "April 15, 2014", "endDate": "2014-04-15", "id": "20140415", "iso": "20140415", "name": "2014-04-15", + "periodType": "DAILY", "startDate": "2014-04-15", }, Object { + "displayName": "April 16, 2014", "endDate": "2014-04-16", "id": "20140416", "iso": "20140416", "name": "2014-04-16", + "periodType": "DAILY", "startDate": "2014-04-16", }, Object { + "displayName": "April 17, 2014", "endDate": "2014-04-17", "id": "20140417", "iso": "20140417", "name": "2014-04-17", + "periodType": "DAILY", "startDate": "2014-04-17", }, Object { + "displayName": "April 18, 2014", "endDate": "2014-04-18", "id": "20140418", "iso": "20140418", "name": "2014-04-18", + "periodType": "DAILY", "startDate": "2014-04-18", }, Object { + "displayName": "April 19, 2014", "endDate": "2014-04-19", "id": "20140419", "iso": "20140419", "name": "2014-04-19", + "periodType": "DAILY", "startDate": "2014-04-19", }, Object { + "displayName": "April 20, 2014", "endDate": "2014-04-20", "id": "20140420", "iso": "20140420", "name": "2014-04-20", + "periodType": "DAILY", "startDate": "2014-04-20", }, Object { + "displayName": "April 21, 2014", "endDate": "2014-04-21", "id": "20140421", "iso": "20140421", "name": "2014-04-21", + "periodType": "DAILY", "startDate": "2014-04-21", }, Object { + "displayName": "April 22, 2014", "endDate": "2014-04-22", "id": "20140422", "iso": "20140422", "name": "2014-04-22", + "periodType": "DAILY", "startDate": "2014-04-22", }, Object { + "displayName": "April 23, 2014", "endDate": "2014-04-23", "id": "20140423", "iso": "20140423", "name": "2014-04-23", + "periodType": "DAILY", "startDate": "2014-04-23", }, Object { + "displayName": "April 24, 2014", "endDate": "2014-04-24", "id": "20140424", "iso": "20140424", "name": "2014-04-24", + "periodType": "DAILY", "startDate": "2014-04-24", }, Object { + "displayName": "April 25, 2014", "endDate": "2014-04-25", "id": "20140425", "iso": "20140425", "name": "2014-04-25", + "periodType": "DAILY", "startDate": "2014-04-25", }, Object { + "displayName": "April 26, 2014", "endDate": "2014-04-26", "id": "20140426", "iso": "20140426", "name": "2014-04-26", + "periodType": "DAILY", "startDate": "2014-04-26", }, Object { + "displayName": "April 27, 2014", "endDate": "2014-04-27", "id": "20140427", "iso": "20140427", "name": "2014-04-27", + "periodType": "DAILY", "startDate": "2014-04-27", }, Object { + "displayName": "April 28, 2014", "endDate": "2014-04-28", "id": "20140428", "iso": "20140428", "name": "2014-04-28", + "periodType": "DAILY", "startDate": "2014-04-28", }, Object { + "displayName": "April 29, 2014", "endDate": "2014-04-29", "id": "20140429", "iso": "20140429", "name": "2014-04-29", + "periodType": "DAILY", "startDate": "2014-04-29", }, Object { + "displayName": "April 30, 2014", "endDate": "2014-04-30", "id": "20140430", "iso": "20140430", "name": "2014-04-30", + "periodType": "DAILY", "startDate": "2014-04-30", }, Object { + "displayName": "May 1, 2014", "endDate": "2014-05-01", "id": "20140501", "iso": "20140501", "name": "2014-05-01", + "periodType": "DAILY", "startDate": "2014-05-01", }, Object { + "displayName": "May 2, 2014", "endDate": "2014-05-02", "id": "20140502", "iso": "20140502", "name": "2014-05-02", + "periodType": "DAILY", "startDate": "2014-05-02", }, Object { + "displayName": "May 3, 2014", "endDate": "2014-05-03", "id": "20140503", "iso": "20140503", "name": "2014-05-03", + "periodType": "DAILY", "startDate": "2014-05-03", }, Object { + "displayName": "May 4, 2014", "endDate": "2014-05-04", "id": "20140504", "iso": "20140504", "name": "2014-05-04", + "periodType": "DAILY", "startDate": "2014-05-04", }, Object { + "displayName": "May 5, 2014", "endDate": "2014-05-05", "id": "20140505", "iso": "20140505", "name": "2014-05-05", + "periodType": "DAILY", "startDate": "2014-05-05", }, Object { + "displayName": "May 6, 2014", "endDate": "2014-05-06", "id": "20140506", "iso": "20140506", "name": "2014-05-06", + "periodType": "DAILY", "startDate": "2014-05-06", }, Object { + "displayName": "May 7, 2014", "endDate": "2014-05-07", "id": "20140507", "iso": "20140507", "name": "2014-05-07", + "periodType": "DAILY", "startDate": "2014-05-07", }, Object { + "displayName": "May 8, 2014", "endDate": "2014-05-08", "id": "20140508", "iso": "20140508", "name": "2014-05-08", + "periodType": "DAILY", "startDate": "2014-05-08", }, Object { + "displayName": "May 9, 2014", "endDate": "2014-05-09", "id": "20140509", "iso": "20140509", "name": "2014-05-09", + "periodType": "DAILY", "startDate": "2014-05-09", }, Object { + "displayName": "May 10, 2014", "endDate": "2014-05-10", "id": "20140510", "iso": "20140510", "name": "2014-05-10", + "periodType": "DAILY", "startDate": "2014-05-10", }, Object { + "displayName": "May 11, 2014", "endDate": "2014-05-11", "id": "20140511", "iso": "20140511", "name": "2014-05-11", + "periodType": "DAILY", "startDate": "2014-05-11", }, Object { + "displayName": "May 12, 2014", "endDate": "2014-05-12", "id": "20140512", "iso": "20140512", "name": "2014-05-12", + "periodType": "DAILY", "startDate": "2014-05-12", }, Object { + "displayName": "May 13, 2014", "endDate": "2014-05-13", "id": "20140513", "iso": "20140513", "name": "2014-05-13", + "periodType": "DAILY", "startDate": "2014-05-13", }, Object { + "displayName": "May 14, 2014", "endDate": "2014-05-14", "id": "20140514", "iso": "20140514", "name": "2014-05-14", + "periodType": "DAILY", "startDate": "2014-05-14", }, Object { + "displayName": "May 15, 2014", "endDate": "2014-05-15", "id": "20140515", "iso": "20140515", "name": "2014-05-15", + "periodType": "DAILY", "startDate": "2014-05-15", }, Object { + "displayName": "May 16, 2014", "endDate": "2014-05-16", "id": "20140516", "iso": "20140516", "name": "2014-05-16", + "periodType": "DAILY", "startDate": "2014-05-16", }, Object { + "displayName": "May 17, 2014", "endDate": "2014-05-17", "id": "20140517", "iso": "20140517", "name": "2014-05-17", + "periodType": "DAILY", "startDate": "2014-05-17", }, Object { + "displayName": "May 18, 2014", "endDate": "2014-05-18", "id": "20140518", "iso": "20140518", "name": "2014-05-18", + "periodType": "DAILY", "startDate": "2014-05-18", }, Object { + "displayName": "May 19, 2014", "endDate": "2014-05-19", "id": "20140519", "iso": "20140519", "name": "2014-05-19", + "periodType": "DAILY", "startDate": "2014-05-19", }, Object { + "displayName": "May 20, 2014", "endDate": "2014-05-20", "id": "20140520", "iso": "20140520", "name": "2014-05-20", + "periodType": "DAILY", "startDate": "2014-05-20", }, Object { + "displayName": "May 21, 2014", "endDate": "2014-05-21", "id": "20140521", "iso": "20140521", "name": "2014-05-21", + "periodType": "DAILY", "startDate": "2014-05-21", }, Object { + "displayName": "May 22, 2014", "endDate": "2014-05-22", "id": "20140522", "iso": "20140522", "name": "2014-05-22", + "periodType": "DAILY", "startDate": "2014-05-22", }, Object { + "displayName": "May 23, 2014", "endDate": "2014-05-23", "id": "20140523", "iso": "20140523", "name": "2014-05-23", + "periodType": "DAILY", "startDate": "2014-05-23", }, Object { + "displayName": "May 24, 2014", "endDate": "2014-05-24", "id": "20140524", "iso": "20140524", "name": "2014-05-24", + "periodType": "DAILY", "startDate": "2014-05-24", }, Object { + "displayName": "May 25, 2014", "endDate": "2014-05-25", "id": "20140525", "iso": "20140525", "name": "2014-05-25", + "periodType": "DAILY", "startDate": "2014-05-25", }, Object { + "displayName": "May 26, 2014", "endDate": "2014-05-26", "id": "20140526", "iso": "20140526", "name": "2014-05-26", + "periodType": "DAILY", "startDate": "2014-05-26", }, Object { + "displayName": "May 27, 2014", "endDate": "2014-05-27", "id": "20140527", "iso": "20140527", "name": "2014-05-27", + "periodType": "DAILY", "startDate": "2014-05-27", }, Object { + "displayName": "May 28, 2014", "endDate": "2014-05-28", "id": "20140528", "iso": "20140528", "name": "2014-05-28", + "periodType": "DAILY", "startDate": "2014-05-28", }, Object { + "displayName": "May 29, 2014", "endDate": "2014-05-29", "id": "20140529", "iso": "20140529", "name": "2014-05-29", + "periodType": "DAILY", "startDate": "2014-05-29", }, Object { + "displayName": "May 30, 2014", "endDate": "2014-05-30", "id": "20140530", "iso": "20140530", "name": "2014-05-30", + "periodType": "DAILY", "startDate": "2014-05-30", }, Object { + "displayName": "May 31, 2014", "endDate": "2014-05-31", "id": "20140531", "iso": "20140531", "name": "2014-05-31", + "periodType": "DAILY", "startDate": "2014-05-31", }, Object { + "displayName": "June 1, 2014", "endDate": "2014-06-01", "id": "20140601", "iso": "20140601", "name": "2014-06-01", + "periodType": "DAILY", "startDate": "2014-06-01", }, Object { + "displayName": "June 2, 2014", "endDate": "2014-06-02", "id": "20140602", "iso": "20140602", "name": "2014-06-02", + "periodType": "DAILY", "startDate": "2014-06-02", }, Object { + "displayName": "June 3, 2014", "endDate": "2014-06-03", "id": "20140603", "iso": "20140603", "name": "2014-06-03", + "periodType": "DAILY", "startDate": "2014-06-03", }, Object { + "displayName": "June 4, 2014", "endDate": "2014-06-04", "id": "20140604", "iso": "20140604", "name": "2014-06-04", + "periodType": "DAILY", "startDate": "2014-06-04", }, Object { + "displayName": "June 5, 2014", "endDate": "2014-06-05", "id": "20140605", "iso": "20140605", "name": "2014-06-05", + "periodType": "DAILY", "startDate": "2014-06-05", }, Object { + "displayName": "June 6, 2014", "endDate": "2014-06-06", "id": "20140606", "iso": "20140606", "name": "2014-06-06", + "periodType": "DAILY", "startDate": "2014-06-06", }, Object { + "displayName": "June 7, 2014", "endDate": "2014-06-07", "id": "20140607", "iso": "20140607", "name": "2014-06-07", + "periodType": "DAILY", "startDate": "2014-06-07", }, Object { + "displayName": "June 8, 2014", "endDate": "2014-06-08", "id": "20140608", "iso": "20140608", "name": "2014-06-08", + "periodType": "DAILY", "startDate": "2014-06-08", }, Object { + "displayName": "June 9, 2014", "endDate": "2014-06-09", "id": "20140609", "iso": "20140609", "name": "2014-06-09", + "periodType": "DAILY", "startDate": "2014-06-09", }, Object { + "displayName": "June 10, 2014", "endDate": "2014-06-10", "id": "20140610", "iso": "20140610", "name": "2014-06-10", + "periodType": "DAILY", "startDate": "2014-06-10", }, Object { + "displayName": "June 11, 2014", "endDate": "2014-06-11", "id": "20140611", "iso": "20140611", "name": "2014-06-11", + "periodType": "DAILY", "startDate": "2014-06-11", }, Object { + "displayName": "June 12, 2014", "endDate": "2014-06-12", "id": "20140612", "iso": "20140612", "name": "2014-06-12", + "periodType": "DAILY", "startDate": "2014-06-12", }, Object { + "displayName": "June 13, 2014", "endDate": "2014-06-13", "id": "20140613", "iso": "20140613", "name": "2014-06-13", + "periodType": "DAILY", "startDate": "2014-06-13", }, Object { + "displayName": "June 14, 2014", "endDate": "2014-06-14", "id": "20140614", "iso": "20140614", "name": "2014-06-14", + "periodType": "DAILY", "startDate": "2014-06-14", }, Object { + "displayName": "June 15, 2014", "endDate": "2014-06-15", "id": "20140615", "iso": "20140615", "name": "2014-06-15", + "periodType": "DAILY", "startDate": "2014-06-15", }, Object { + "displayName": "June 16, 2014", "endDate": "2014-06-16", "id": "20140616", "iso": "20140616", "name": "2014-06-16", + "periodType": "DAILY", "startDate": "2014-06-16", }, Object { + "displayName": "June 17, 2014", "endDate": "2014-06-17", "id": "20140617", "iso": "20140617", "name": "2014-06-17", + "periodType": "DAILY", "startDate": "2014-06-17", }, Object { + "displayName": "June 18, 2014", "endDate": "2014-06-18", "id": "20140618", "iso": "20140618", "name": "2014-06-18", + "periodType": "DAILY", "startDate": "2014-06-18", }, Object { + "displayName": "June 19, 2014", "endDate": "2014-06-19", "id": "20140619", "iso": "20140619", "name": "2014-06-19", + "periodType": "DAILY", "startDate": "2014-06-19", }, Object { + "displayName": "June 20, 2014", "endDate": "2014-06-20", "id": "20140620", "iso": "20140620", "name": "2014-06-20", + "periodType": "DAILY", "startDate": "2014-06-20", }, Object { + "displayName": "June 21, 2014", "endDate": "2014-06-21", "id": "20140621", "iso": "20140621", "name": "2014-06-21", + "periodType": "DAILY", "startDate": "2014-06-21", }, Object { + "displayName": "June 22, 2014", "endDate": "2014-06-22", "id": "20140622", "iso": "20140622", "name": "2014-06-22", + "periodType": "DAILY", "startDate": "2014-06-22", }, Object { + "displayName": "June 23, 2014", "endDate": "2014-06-23", "id": "20140623", "iso": "20140623", "name": "2014-06-23", + "periodType": "DAILY", "startDate": "2014-06-23", }, Object { + "displayName": "June 24, 2014", "endDate": "2014-06-24", "id": "20140624", "iso": "20140624", "name": "2014-06-24", + "periodType": "DAILY", "startDate": "2014-06-24", }, Object { + "displayName": "June 25, 2014", "endDate": "2014-06-25", "id": "20140625", "iso": "20140625", "name": "2014-06-25", + "periodType": "DAILY", "startDate": "2014-06-25", }, Object { + "displayName": "June 26, 2014", "endDate": "2014-06-26", "id": "20140626", "iso": "20140626", "name": "2014-06-26", + "periodType": "DAILY", "startDate": "2014-06-26", }, Object { + "displayName": "June 27, 2014", "endDate": "2014-06-27", "id": "20140627", "iso": "20140627", "name": "2014-06-27", + "periodType": "DAILY", "startDate": "2014-06-27", }, Object { + "displayName": "June 28, 2014", "endDate": "2014-06-28", "id": "20140628", "iso": "20140628", "name": "2014-06-28", + "periodType": "DAILY", "startDate": "2014-06-28", }, Object { + "displayName": "June 29, 2014", "endDate": "2014-06-29", "id": "20140629", "iso": "20140629", "name": "2014-06-29", + "periodType": "DAILY", "startDate": "2014-06-29", }, Object { + "displayName": "June 30, 2014", "endDate": "2014-06-30", "id": "20140630", "iso": "20140630", "name": "2014-06-30", + "periodType": "DAILY", "startDate": "2014-06-30", }, Object { + "displayName": "July 1, 2014", "endDate": "2014-07-01", "id": "20140701", "iso": "20140701", "name": "2014-07-01", + "periodType": "DAILY", "startDate": "2014-07-01", }, Object { + "displayName": "July 2, 2014", "endDate": "2014-07-02", "id": "20140702", "iso": "20140702", "name": "2014-07-02", + "periodType": "DAILY", "startDate": "2014-07-02", }, Object { + "displayName": "July 3, 2014", "endDate": "2014-07-03", "id": "20140703", "iso": "20140703", "name": "2014-07-03", + "periodType": "DAILY", "startDate": "2014-07-03", }, Object { + "displayName": "July 4, 2014", "endDate": "2014-07-04", "id": "20140704", "iso": "20140704", "name": "2014-07-04", + "periodType": "DAILY", "startDate": "2014-07-04", }, Object { + "displayName": "July 5, 2014", "endDate": "2014-07-05", "id": "20140705", "iso": "20140705", "name": "2014-07-05", + "periodType": "DAILY", "startDate": "2014-07-05", }, Object { + "displayName": "July 6, 2014", "endDate": "2014-07-06", "id": "20140706", "iso": "20140706", "name": "2014-07-06", + "periodType": "DAILY", "startDate": "2014-07-06", }, Object { + "displayName": "July 7, 2014", "endDate": "2014-07-07", "id": "20140707", "iso": "20140707", "name": "2014-07-07", + "periodType": "DAILY", "startDate": "2014-07-07", }, Object { + "displayName": "July 8, 2014", "endDate": "2014-07-08", "id": "20140708", "iso": "20140708", "name": "2014-07-08", + "periodType": "DAILY", "startDate": "2014-07-08", }, Object { + "displayName": "July 9, 2014", "endDate": "2014-07-09", "id": "20140709", "iso": "20140709", "name": "2014-07-09", + "periodType": "DAILY", "startDate": "2014-07-09", }, Object { + "displayName": "July 10, 2014", "endDate": "2014-07-10", "id": "20140710", "iso": "20140710", "name": "2014-07-10", + "periodType": "DAILY", "startDate": "2014-07-10", }, Object { + "displayName": "July 11, 2014", "endDate": "2014-07-11", "id": "20140711", "iso": "20140711", "name": "2014-07-11", + "periodType": "DAILY", "startDate": "2014-07-11", }, Object { + "displayName": "July 12, 2014", "endDate": "2014-07-12", "id": "20140712", "iso": "20140712", "name": "2014-07-12", + "periodType": "DAILY", "startDate": "2014-07-12", }, Object { + "displayName": "July 13, 2014", "endDate": "2014-07-13", "id": "20140713", "iso": "20140713", "name": "2014-07-13", + "periodType": "DAILY", "startDate": "2014-07-13", }, Object { + "displayName": "July 14, 2014", "endDate": "2014-07-14", "id": "20140714", "iso": "20140714", "name": "2014-07-14", + "periodType": "DAILY", "startDate": "2014-07-14", }, Object { + "displayName": "July 15, 2014", "endDate": "2014-07-15", "id": "20140715", "iso": "20140715", "name": "2014-07-15", + "periodType": "DAILY", "startDate": "2014-07-15", }, Object { + "displayName": "July 16, 2014", "endDate": "2014-07-16", "id": "20140716", "iso": "20140716", "name": "2014-07-16", + "periodType": "DAILY", "startDate": "2014-07-16", }, Object { + "displayName": "July 17, 2014", "endDate": "2014-07-17", "id": "20140717", "iso": "20140717", "name": "2014-07-17", + "periodType": "DAILY", "startDate": "2014-07-17", }, Object { + "displayName": "July 18, 2014", "endDate": "2014-07-18", "id": "20140718", "iso": "20140718", "name": "2014-07-18", + "periodType": "DAILY", "startDate": "2014-07-18", }, Object { + "displayName": "July 19, 2014", "endDate": "2014-07-19", "id": "20140719", "iso": "20140719", "name": "2014-07-19", + "periodType": "DAILY", "startDate": "2014-07-19", }, Object { + "displayName": "July 20, 2014", "endDate": "2014-07-20", "id": "20140720", "iso": "20140720", "name": "2014-07-20", + "periodType": "DAILY", "startDate": "2014-07-20", }, Object { + "displayName": "July 21, 2014", "endDate": "2014-07-21", "id": "20140721", "iso": "20140721", "name": "2014-07-21", + "periodType": "DAILY", "startDate": "2014-07-21", }, Object { + "displayName": "July 22, 2014", "endDate": "2014-07-22", "id": "20140722", "iso": "20140722", "name": "2014-07-22", + "periodType": "DAILY", "startDate": "2014-07-22", }, Object { + "displayName": "July 23, 2014", "endDate": "2014-07-23", "id": "20140723", "iso": "20140723", "name": "2014-07-23", + "periodType": "DAILY", "startDate": "2014-07-23", }, Object { + "displayName": "July 24, 2014", "endDate": "2014-07-24", "id": "20140724", "iso": "20140724", "name": "2014-07-24", + "periodType": "DAILY", "startDate": "2014-07-24", }, Object { + "displayName": "July 25, 2014", "endDate": "2014-07-25", "id": "20140725", "iso": "20140725", "name": "2014-07-25", + "periodType": "DAILY", "startDate": "2014-07-25", }, Object { + "displayName": "July 26, 2014", "endDate": "2014-07-26", "id": "20140726", "iso": "20140726", "name": "2014-07-26", + "periodType": "DAILY", "startDate": "2014-07-26", }, Object { + "displayName": "July 27, 2014", "endDate": "2014-07-27", "id": "20140727", "iso": "20140727", "name": "2014-07-27", + "periodType": "DAILY", "startDate": "2014-07-27", }, Object { + "displayName": "July 28, 2014", "endDate": "2014-07-28", "id": "20140728", "iso": "20140728", "name": "2014-07-28", + "periodType": "DAILY", "startDate": "2014-07-28", }, Object { + "displayName": "July 29, 2014", "endDate": "2014-07-29", "id": "20140729", "iso": "20140729", "name": "2014-07-29", + "periodType": "DAILY", "startDate": "2014-07-29", }, Object { + "displayName": "July 30, 2014", "endDate": "2014-07-30", "id": "20140730", "iso": "20140730", "name": "2014-07-30", + "periodType": "DAILY", "startDate": "2014-07-30", }, Object { + "displayName": "July 31, 2014", "endDate": "2014-07-31", "id": "20140731", "iso": "20140731", "name": "2014-07-31", + "periodType": "DAILY", "startDate": "2014-07-31", }, Object { + "displayName": "August 1, 2014", "endDate": "2014-08-01", "id": "20140801", "iso": "20140801", "name": "2014-08-01", + "periodType": "DAILY", "startDate": "2014-08-01", }, Object { + "displayName": "August 2, 2014", "endDate": "2014-08-02", "id": "20140802", "iso": "20140802", "name": "2014-08-02", + "periodType": "DAILY", "startDate": "2014-08-02", }, Object { + "displayName": "August 3, 2014", "endDate": "2014-08-03", "id": "20140803", "iso": "20140803", "name": "2014-08-03", + "periodType": "DAILY", "startDate": "2014-08-03", }, Object { + "displayName": "August 4, 2014", "endDate": "2014-08-04", "id": "20140804", "iso": "20140804", "name": "2014-08-04", + "periodType": "DAILY", "startDate": "2014-08-04", }, Object { + "displayName": "August 5, 2014", "endDate": "2014-08-05", "id": "20140805", "iso": "20140805", "name": "2014-08-05", + "periodType": "DAILY", "startDate": "2014-08-05", }, Object { + "displayName": "August 6, 2014", "endDate": "2014-08-06", "id": "20140806", "iso": "20140806", "name": "2014-08-06", + "periodType": "DAILY", "startDate": "2014-08-06", }, Object { + "displayName": "August 7, 2014", "endDate": "2014-08-07", "id": "20140807", "iso": "20140807", "name": "2014-08-07", + "periodType": "DAILY", "startDate": "2014-08-07", }, Object { + "displayName": "August 8, 2014", "endDate": "2014-08-08", "id": "20140808", "iso": "20140808", "name": "2014-08-08", + "periodType": "DAILY", "startDate": "2014-08-08", }, Object { + "displayName": "August 9, 2014", "endDate": "2014-08-09", "id": "20140809", "iso": "20140809", "name": "2014-08-09", + "periodType": "DAILY", "startDate": "2014-08-09", }, Object { + "displayName": "August 10, 2014", "endDate": "2014-08-10", "id": "20140810", "iso": "20140810", "name": "2014-08-10", + "periodType": "DAILY", "startDate": "2014-08-10", }, Object { + "displayName": "August 11, 2014", "endDate": "2014-08-11", "id": "20140811", "iso": "20140811", "name": "2014-08-11", + "periodType": "DAILY", "startDate": "2014-08-11", }, Object { + "displayName": "August 12, 2014", "endDate": "2014-08-12", "id": "20140812", "iso": "20140812", "name": "2014-08-12", + "periodType": "DAILY", "startDate": "2014-08-12", }, Object { + "displayName": "August 13, 2014", "endDate": "2014-08-13", "id": "20140813", "iso": "20140813", "name": "2014-08-13", + "periodType": "DAILY", "startDate": "2014-08-13", }, Object { + "displayName": "August 14, 2014", "endDate": "2014-08-14", "id": "20140814", "iso": "20140814", "name": "2014-08-14", + "periodType": "DAILY", "startDate": "2014-08-14", }, Object { + "displayName": "August 15, 2014", "endDate": "2014-08-15", "id": "20140815", "iso": "20140815", "name": "2014-08-15", + "periodType": "DAILY", "startDate": "2014-08-15", }, Object { + "displayName": "August 16, 2014", "endDate": "2014-08-16", "id": "20140816", "iso": "20140816", "name": "2014-08-16", + "periodType": "DAILY", "startDate": "2014-08-16", }, Object { + "displayName": "August 17, 2014", "endDate": "2014-08-17", "id": "20140817", "iso": "20140817", "name": "2014-08-17", + "periodType": "DAILY", "startDate": "2014-08-17", }, Object { + "displayName": "August 18, 2014", "endDate": "2014-08-18", "id": "20140818", "iso": "20140818", "name": "2014-08-18", + "periodType": "DAILY", "startDate": "2014-08-18", }, Object { + "displayName": "August 19, 2014", "endDate": "2014-08-19", "id": "20140819", "iso": "20140819", "name": "2014-08-19", + "periodType": "DAILY", "startDate": "2014-08-19", }, Object { + "displayName": "August 20, 2014", "endDate": "2014-08-20", "id": "20140820", "iso": "20140820", "name": "2014-08-20", + "periodType": "DAILY", "startDate": "2014-08-20", }, Object { + "displayName": "August 21, 2014", "endDate": "2014-08-21", "id": "20140821", "iso": "20140821", "name": "2014-08-21", + "periodType": "DAILY", "startDate": "2014-08-21", }, Object { + "displayName": "August 22, 2014", "endDate": "2014-08-22", "id": "20140822", "iso": "20140822", "name": "2014-08-22", + "periodType": "DAILY", "startDate": "2014-08-22", }, Object { + "displayName": "August 23, 2014", "endDate": "2014-08-23", "id": "20140823", "iso": "20140823", "name": "2014-08-23", + "periodType": "DAILY", "startDate": "2014-08-23", }, Object { + "displayName": "August 24, 2014", "endDate": "2014-08-24", "id": "20140824", "iso": "20140824", "name": "2014-08-24", + "periodType": "DAILY", "startDate": "2014-08-24", }, Object { + "displayName": "August 25, 2014", "endDate": "2014-08-25", "id": "20140825", "iso": "20140825", "name": "2014-08-25", + "periodType": "DAILY", "startDate": "2014-08-25", }, Object { + "displayName": "August 26, 2014", "endDate": "2014-08-26", "id": "20140826", "iso": "20140826", "name": "2014-08-26", + "periodType": "DAILY", "startDate": "2014-08-26", }, Object { + "displayName": "August 27, 2014", "endDate": "2014-08-27", "id": "20140827", "iso": "20140827", "name": "2014-08-27", + "periodType": "DAILY", "startDate": "2014-08-27", }, Object { + "displayName": "August 28, 2014", "endDate": "2014-08-28", "id": "20140828", "iso": "20140828", "name": "2014-08-28", + "periodType": "DAILY", "startDate": "2014-08-28", }, Object { + "displayName": "August 29, 2014", "endDate": "2014-08-29", "id": "20140829", "iso": "20140829", "name": "2014-08-29", + "periodType": "DAILY", "startDate": "2014-08-29", }, Object { + "displayName": "August 30, 2014", "endDate": "2014-08-30", "id": "20140830", "iso": "20140830", "name": "2014-08-30", + "periodType": "DAILY", "startDate": "2014-08-30", }, Object { + "displayName": "August 31, 2014", "endDate": "2014-08-31", "id": "20140831", "iso": "20140831", "name": "2014-08-31", + "periodType": "DAILY", "startDate": "2014-08-31", }, Object { + "displayName": "September 1, 2014", "endDate": "2014-09-01", "id": "20140901", "iso": "20140901", "name": "2014-09-01", + "periodType": "DAILY", "startDate": "2014-09-01", }, Object { + "displayName": "September 2, 2014", "endDate": "2014-09-02", "id": "20140902", "iso": "20140902", "name": "2014-09-02", + "periodType": "DAILY", "startDate": "2014-09-02", }, Object { + "displayName": "September 3, 2014", "endDate": "2014-09-03", "id": "20140903", "iso": "20140903", "name": "2014-09-03", + "periodType": "DAILY", "startDate": "2014-09-03", }, Object { + "displayName": "September 4, 2014", "endDate": "2014-09-04", "id": "20140904", "iso": "20140904", "name": "2014-09-04", + "periodType": "DAILY", "startDate": "2014-09-04", }, Object { + "displayName": "September 5, 2014", "endDate": "2014-09-05", "id": "20140905", "iso": "20140905", "name": "2014-09-05", + "periodType": "DAILY", "startDate": "2014-09-05", }, Object { + "displayName": "September 6, 2014", "endDate": "2014-09-06", "id": "20140906", "iso": "20140906", "name": "2014-09-06", + "periodType": "DAILY", "startDate": "2014-09-06", }, Object { + "displayName": "September 7, 2014", "endDate": "2014-09-07", "id": "20140907", "iso": "20140907", "name": "2014-09-07", + "periodType": "DAILY", "startDate": "2014-09-07", }, Object { + "displayName": "September 8, 2014", "endDate": "2014-09-08", "id": "20140908", "iso": "20140908", "name": "2014-09-08", + "periodType": "DAILY", "startDate": "2014-09-08", }, Object { + "displayName": "September 9, 2014", "endDate": "2014-09-09", "id": "20140909", "iso": "20140909", "name": "2014-09-09", + "periodType": "DAILY", "startDate": "2014-09-09", }, Object { + "displayName": "September 10, 2014", "endDate": "2014-09-10", "id": "20140910", "iso": "20140910", "name": "2014-09-10", + "periodType": "DAILY", "startDate": "2014-09-10", }, Object { + "displayName": "September 11, 2014", "endDate": "2014-09-11", "id": "20140911", "iso": "20140911", "name": "2014-09-11", + "periodType": "DAILY", "startDate": "2014-09-11", }, Object { + "displayName": "September 12, 2014", "endDate": "2014-09-12", "id": "20140912", "iso": "20140912", "name": "2014-09-12", + "periodType": "DAILY", "startDate": "2014-09-12", }, Object { + "displayName": "September 13, 2014", "endDate": "2014-09-13", "id": "20140913", "iso": "20140913", "name": "2014-09-13", + "periodType": "DAILY", "startDate": "2014-09-13", }, Object { + "displayName": "September 14, 2014", "endDate": "2014-09-14", "id": "20140914", "iso": "20140914", "name": "2014-09-14", + "periodType": "DAILY", "startDate": "2014-09-14", }, Object { + "displayName": "September 15, 2014", "endDate": "2014-09-15", "id": "20140915", "iso": "20140915", "name": "2014-09-15", + "periodType": "DAILY", "startDate": "2014-09-15", }, Object { + "displayName": "September 16, 2014", "endDate": "2014-09-16", "id": "20140916", "iso": "20140916", "name": "2014-09-16", + "periodType": "DAILY", "startDate": "2014-09-16", }, Object { + "displayName": "September 17, 2014", "endDate": "2014-09-17", "id": "20140917", "iso": "20140917", "name": "2014-09-17", + "periodType": "DAILY", "startDate": "2014-09-17", }, Object { + "displayName": "September 18, 2014", "endDate": "2014-09-18", "id": "20140918", "iso": "20140918", "name": "2014-09-18", + "periodType": "DAILY", "startDate": "2014-09-18", }, Object { + "displayName": "September 19, 2014", "endDate": "2014-09-19", "id": "20140919", "iso": "20140919", "name": "2014-09-19", + "periodType": "DAILY", "startDate": "2014-09-19", }, Object { + "displayName": "September 20, 2014", "endDate": "2014-09-20", "id": "20140920", "iso": "20140920", "name": "2014-09-20", + "periodType": "DAILY", "startDate": "2014-09-20", }, Object { + "displayName": "September 21, 2014", "endDate": "2014-09-21", "id": "20140921", "iso": "20140921", "name": "2014-09-21", + "periodType": "DAILY", "startDate": "2014-09-21", }, Object { + "displayName": "September 22, 2014", "endDate": "2014-09-22", "id": "20140922", "iso": "20140922", "name": "2014-09-22", + "periodType": "DAILY", "startDate": "2014-09-22", }, Object { + "displayName": "September 23, 2014", "endDate": "2014-09-23", "id": "20140923", "iso": "20140923", "name": "2014-09-23", + "periodType": "DAILY", "startDate": "2014-09-23", }, Object { + "displayName": "September 24, 2014", "endDate": "2014-09-24", "id": "20140924", "iso": "20140924", "name": "2014-09-24", + "periodType": "DAILY", "startDate": "2014-09-24", }, Object { + "displayName": "September 25, 2014", "endDate": "2014-09-25", "id": "20140925", "iso": "20140925", "name": "2014-09-25", + "periodType": "DAILY", "startDate": "2014-09-25", }, Object { + "displayName": "September 26, 2014", "endDate": "2014-09-26", "id": "20140926", "iso": "20140926", "name": "2014-09-26", + "periodType": "DAILY", "startDate": "2014-09-26", }, Object { + "displayName": "September 27, 2014", "endDate": "2014-09-27", "id": "20140927", "iso": "20140927", "name": "2014-09-27", + "periodType": "DAILY", "startDate": "2014-09-27", }, Object { + "displayName": "September 28, 2014", "endDate": "2014-09-28", "id": "20140928", "iso": "20140928", "name": "2014-09-28", + "periodType": "DAILY", "startDate": "2014-09-28", }, Object { + "displayName": "September 29, 2014", "endDate": "2014-09-29", "id": "20140929", "iso": "20140929", "name": "2014-09-29", + "periodType": "DAILY", "startDate": "2014-09-29", }, Object { + "displayName": "September 30, 2014", "endDate": "2014-09-30", "id": "20140930", "iso": "20140930", "name": "2014-09-30", + "periodType": "DAILY", "startDate": "2014-09-30", }, Object { + "displayName": "October 1, 2014", "endDate": "2014-10-01", "id": "20141001", "iso": "20141001", "name": "2014-10-01", + "periodType": "DAILY", "startDate": "2014-10-01", }, Object { + "displayName": "October 2, 2014", "endDate": "2014-10-02", "id": "20141002", "iso": "20141002", "name": "2014-10-02", + "periodType": "DAILY", "startDate": "2014-10-02", }, Object { + "displayName": "October 3, 2014", "endDate": "2014-10-03", "id": "20141003", "iso": "20141003", "name": "2014-10-03", + "periodType": "DAILY", "startDate": "2014-10-03", }, Object { + "displayName": "October 4, 2014", "endDate": "2014-10-04", "id": "20141004", "iso": "20141004", "name": "2014-10-04", + "periodType": "DAILY", "startDate": "2014-10-04", }, Object { + "displayName": "October 5, 2014", "endDate": "2014-10-05", "id": "20141005", "iso": "20141005", "name": "2014-10-05", + "periodType": "DAILY", "startDate": "2014-10-05", }, Object { + "displayName": "October 6, 2014", "endDate": "2014-10-06", "id": "20141006", "iso": "20141006", "name": "2014-10-06", + "periodType": "DAILY", "startDate": "2014-10-06", }, Object { + "displayName": "October 7, 2014", "endDate": "2014-10-07", "id": "20141007", "iso": "20141007", "name": "2014-10-07", + "periodType": "DAILY", "startDate": "2014-10-07", }, Object { + "displayName": "October 8, 2014", "endDate": "2014-10-08", "id": "20141008", "iso": "20141008", "name": "2014-10-08", + "periodType": "DAILY", "startDate": "2014-10-08", }, Object { + "displayName": "October 9, 2014", "endDate": "2014-10-09", "id": "20141009", "iso": "20141009", "name": "2014-10-09", + "periodType": "DAILY", "startDate": "2014-10-09", }, Object { + "displayName": "October 10, 2014", "endDate": "2014-10-10", "id": "20141010", "iso": "20141010", "name": "2014-10-10", + "periodType": "DAILY", "startDate": "2014-10-10", }, Object { + "displayName": "October 11, 2014", "endDate": "2014-10-11", "id": "20141011", "iso": "20141011", "name": "2014-10-11", + "periodType": "DAILY", "startDate": "2014-10-11", }, Object { + "displayName": "October 12, 2014", "endDate": "2014-10-12", "id": "20141012", "iso": "20141012", "name": "2014-10-12", + "periodType": "DAILY", "startDate": "2014-10-12", }, Object { + "displayName": "October 13, 2014", "endDate": "2014-10-13", "id": "20141013", "iso": "20141013", "name": "2014-10-13", + "periodType": "DAILY", "startDate": "2014-10-13", }, Object { + "displayName": "October 14, 2014", "endDate": "2014-10-14", "id": "20141014", "iso": "20141014", "name": "2014-10-14", + "periodType": "DAILY", "startDate": "2014-10-14", }, Object { + "displayName": "October 15, 2014", "endDate": "2014-10-15", "id": "20141015", "iso": "20141015", "name": "2014-10-15", + "periodType": "DAILY", "startDate": "2014-10-15", }, Object { + "displayName": "October 16, 2014", "endDate": "2014-10-16", "id": "20141016", "iso": "20141016", "name": "2014-10-16", + "periodType": "DAILY", "startDate": "2014-10-16", }, Object { + "displayName": "October 17, 2014", "endDate": "2014-10-17", "id": "20141017", "iso": "20141017", "name": "2014-10-17", + "periodType": "DAILY", "startDate": "2014-10-17", }, Object { + "displayName": "October 18, 2014", "endDate": "2014-10-18", "id": "20141018", "iso": "20141018", "name": "2014-10-18", + "periodType": "DAILY", "startDate": "2014-10-18", }, Object { + "displayName": "October 19, 2014", "endDate": "2014-10-19", "id": "20141019", "iso": "20141019", "name": "2014-10-19", + "periodType": "DAILY", "startDate": "2014-10-19", }, Object { + "displayName": "October 20, 2014", "endDate": "2014-10-20", "id": "20141020", "iso": "20141020", "name": "2014-10-20", + "periodType": "DAILY", "startDate": "2014-10-20", }, Object { + "displayName": "October 21, 2014", "endDate": "2014-10-21", "id": "20141021", "iso": "20141021", "name": "2014-10-21", + "periodType": "DAILY", "startDate": "2014-10-21", }, Object { + "displayName": "October 22, 2014", "endDate": "2014-10-22", "id": "20141022", "iso": "20141022", "name": "2014-10-22", + "periodType": "DAILY", "startDate": "2014-10-22", }, Object { + "displayName": "October 23, 2014", "endDate": "2014-10-23", "id": "20141023", "iso": "20141023", "name": "2014-10-23", + "periodType": "DAILY", "startDate": "2014-10-23", }, Object { + "displayName": "October 24, 2014", "endDate": "2014-10-24", "id": "20141024", "iso": "20141024", "name": "2014-10-24", + "periodType": "DAILY", "startDate": "2014-10-24", }, Object { + "displayName": "October 25, 2014", "endDate": "2014-10-25", "id": "20141025", "iso": "20141025", "name": "2014-10-25", + "periodType": "DAILY", "startDate": "2014-10-25", }, Object { + "displayName": "October 26, 2014", "endDate": "2014-10-26", "id": "20141026", "iso": "20141026", "name": "2014-10-26", + "periodType": "DAILY", "startDate": "2014-10-26", }, Object { + "displayName": "October 27, 2014", "endDate": "2014-10-27", "id": "20141027", "iso": "20141027", "name": "2014-10-27", + "periodType": "DAILY", "startDate": "2014-10-27", }, Object { + "displayName": "October 28, 2014", "endDate": "2014-10-28", "id": "20141028", "iso": "20141028", "name": "2014-10-28", + "periodType": "DAILY", "startDate": "2014-10-28", }, Object { + "displayName": "October 29, 2014", "endDate": "2014-10-29", "id": "20141029", "iso": "20141029", "name": "2014-10-29", + "periodType": "DAILY", "startDate": "2014-10-29", }, Object { + "displayName": "October 30, 2014", "endDate": "2014-10-30", "id": "20141030", "iso": "20141030", "name": "2014-10-30", + "periodType": "DAILY", "startDate": "2014-10-30", }, Object { + "displayName": "October 31, 2014", "endDate": "2014-10-31", "id": "20141031", "iso": "20141031", "name": "2014-10-31", + "periodType": "DAILY", "startDate": "2014-10-31", }, Object { + "displayName": "November 1, 2014", "endDate": "2014-11-01", "id": "20141101", "iso": "20141101", "name": "2014-11-01", + "periodType": "DAILY", "startDate": "2014-11-01", }, Object { + "displayName": "November 2, 2014", "endDate": "2014-11-02", "id": "20141102", "iso": "20141102", "name": "2014-11-02", + "periodType": "DAILY", "startDate": "2014-11-02", }, Object { + "displayName": "November 3, 2014", "endDate": "2014-11-03", "id": "20141103", "iso": "20141103", "name": "2014-11-03", + "periodType": "DAILY", "startDate": "2014-11-03", }, Object { + "displayName": "November 4, 2014", "endDate": "2014-11-04", "id": "20141104", "iso": "20141104", "name": "2014-11-04", + "periodType": "DAILY", "startDate": "2014-11-04", }, Object { + "displayName": "November 5, 2014", "endDate": "2014-11-05", "id": "20141105", "iso": "20141105", "name": "2014-11-05", + "periodType": "DAILY", "startDate": "2014-11-05", }, Object { + "displayName": "November 6, 2014", "endDate": "2014-11-06", "id": "20141106", "iso": "20141106", "name": "2014-11-06", + "periodType": "DAILY", "startDate": "2014-11-06", }, Object { + "displayName": "November 7, 2014", "endDate": "2014-11-07", "id": "20141107", "iso": "20141107", "name": "2014-11-07", + "periodType": "DAILY", "startDate": "2014-11-07", }, Object { + "displayName": "November 8, 2014", "endDate": "2014-11-08", "id": "20141108", "iso": "20141108", "name": "2014-11-08", + "periodType": "DAILY", "startDate": "2014-11-08", }, Object { + "displayName": "November 9, 2014", "endDate": "2014-11-09", "id": "20141109", "iso": "20141109", "name": "2014-11-09", + "periodType": "DAILY", "startDate": "2014-11-09", }, Object { + "displayName": "November 10, 2014", "endDate": "2014-11-10", "id": "20141110", "iso": "20141110", "name": "2014-11-10", + "periodType": "DAILY", "startDate": "2014-11-10", }, Object { + "displayName": "November 11, 2014", "endDate": "2014-11-11", "id": "20141111", "iso": "20141111", "name": "2014-11-11", + "periodType": "DAILY", "startDate": "2014-11-11", }, Object { + "displayName": "November 12, 2014", "endDate": "2014-11-12", "id": "20141112", "iso": "20141112", "name": "2014-11-12", + "periodType": "DAILY", "startDate": "2014-11-12", }, Object { + "displayName": "November 13, 2014", "endDate": "2014-11-13", "id": "20141113", "iso": "20141113", "name": "2014-11-13", + "periodType": "DAILY", "startDate": "2014-11-13", }, Object { + "displayName": "November 14, 2014", "endDate": "2014-11-14", "id": "20141114", "iso": "20141114", "name": "2014-11-14", + "periodType": "DAILY", "startDate": "2014-11-14", }, Object { + "displayName": "November 15, 2014", "endDate": "2014-11-15", "id": "20141115", "iso": "20141115", "name": "2014-11-15", + "periodType": "DAILY", "startDate": "2014-11-15", }, Object { + "displayName": "November 16, 2014", "endDate": "2014-11-16", "id": "20141116", "iso": "20141116", "name": "2014-11-16", + "periodType": "DAILY", "startDate": "2014-11-16", }, Object { + "displayName": "November 17, 2014", "endDate": "2014-11-17", "id": "20141117", "iso": "20141117", "name": "2014-11-17", + "periodType": "DAILY", "startDate": "2014-11-17", }, Object { + "displayName": "November 18, 2014", "endDate": "2014-11-18", "id": "20141118", "iso": "20141118", "name": "2014-11-18", + "periodType": "DAILY", "startDate": "2014-11-18", }, Object { + "displayName": "November 19, 2014", "endDate": "2014-11-19", "id": "20141119", "iso": "20141119", "name": "2014-11-19", + "periodType": "DAILY", "startDate": "2014-11-19", }, Object { + "displayName": "November 20, 2014", "endDate": "2014-11-20", "id": "20141120", "iso": "20141120", "name": "2014-11-20", + "periodType": "DAILY", "startDate": "2014-11-20", }, Object { + "displayName": "November 21, 2014", "endDate": "2014-11-21", "id": "20141121", "iso": "20141121", "name": "2014-11-21", + "periodType": "DAILY", "startDate": "2014-11-21", }, Object { + "displayName": "November 22, 2014", "endDate": "2014-11-22", "id": "20141122", "iso": "20141122", "name": "2014-11-22", + "periodType": "DAILY", "startDate": "2014-11-22", }, Object { + "displayName": "November 23, 2014", "endDate": "2014-11-23", "id": "20141123", "iso": "20141123", "name": "2014-11-23", + "periodType": "DAILY", "startDate": "2014-11-23", }, Object { + "displayName": "November 24, 2014", "endDate": "2014-11-24", "id": "20141124", "iso": "20141124", "name": "2014-11-24", + "periodType": "DAILY", "startDate": "2014-11-24", }, Object { + "displayName": "November 25, 2014", "endDate": "2014-11-25", "id": "20141125", "iso": "20141125", "name": "2014-11-25", + "periodType": "DAILY", "startDate": "2014-11-25", }, Object { + "displayName": "November 26, 2014", "endDate": "2014-11-26", "id": "20141126", "iso": "20141126", "name": "2014-11-26", + "periodType": "DAILY", "startDate": "2014-11-26", }, Object { + "displayName": "November 27, 2014", "endDate": "2014-11-27", "id": "20141127", "iso": "20141127", "name": "2014-11-27", + "periodType": "DAILY", "startDate": "2014-11-27", }, Object { + "displayName": "November 28, 2014", "endDate": "2014-11-28", "id": "20141128", "iso": "20141128", "name": "2014-11-28", + "periodType": "DAILY", "startDate": "2014-11-28", }, Object { + "displayName": "November 29, 2014", "endDate": "2014-11-29", "id": "20141129", "iso": "20141129", "name": "2014-11-29", + "periodType": "DAILY", "startDate": "2014-11-29", }, Object { + "displayName": "November 30, 2014", "endDate": "2014-11-30", "id": "20141130", "iso": "20141130", "name": "2014-11-30", + "periodType": "DAILY", "startDate": "2014-11-30", }, Object { + "displayName": "December 1, 2014", "endDate": "2014-12-01", "id": "20141201", "iso": "20141201", "name": "2014-12-01", + "periodType": "DAILY", "startDate": "2014-12-01", }, Object { + "displayName": "December 2, 2014", "endDate": "2014-12-02", "id": "20141202", "iso": "20141202", "name": "2014-12-02", + "periodType": "DAILY", "startDate": "2014-12-02", }, Object { + "displayName": "December 3, 2014", "endDate": "2014-12-03", "id": "20141203", "iso": "20141203", "name": "2014-12-03", + "periodType": "DAILY", "startDate": "2014-12-03", }, Object { + "displayName": "December 4, 2014", "endDate": "2014-12-04", "id": "20141204", "iso": "20141204", "name": "2014-12-04", + "periodType": "DAILY", "startDate": "2014-12-04", }, Object { + "displayName": "December 5, 2014", "endDate": "2014-12-05", "id": "20141205", "iso": "20141205", "name": "2014-12-05", + "periodType": "DAILY", "startDate": "2014-12-05", }, Object { + "displayName": "December 6, 2014", "endDate": "2014-12-06", "id": "20141206", "iso": "20141206", "name": "2014-12-06", + "periodType": "DAILY", "startDate": "2014-12-06", }, Object { + "displayName": "December 7, 2014", "endDate": "2014-12-07", "id": "20141207", "iso": "20141207", "name": "2014-12-07", + "periodType": "DAILY", "startDate": "2014-12-07", }, Object { + "displayName": "December 8, 2014", "endDate": "2014-12-08", "id": "20141208", "iso": "20141208", "name": "2014-12-08", + "periodType": "DAILY", "startDate": "2014-12-08", }, Object { + "displayName": "December 9, 2014", "endDate": "2014-12-09", "id": "20141209", "iso": "20141209", "name": "2014-12-09", + "periodType": "DAILY", "startDate": "2014-12-09", }, Object { + "displayName": "December 10, 2014", "endDate": "2014-12-10", "id": "20141210", "iso": "20141210", "name": "2014-12-10", + "periodType": "DAILY", "startDate": "2014-12-10", }, Object { + "displayName": "December 11, 2014", "endDate": "2014-12-11", "id": "20141211", "iso": "20141211", "name": "2014-12-11", + "periodType": "DAILY", "startDate": "2014-12-11", }, Object { + "displayName": "December 12, 2014", "endDate": "2014-12-12", "id": "20141212", "iso": "20141212", "name": "2014-12-12", + "periodType": "DAILY", "startDate": "2014-12-12", }, Object { + "displayName": "December 13, 2014", "endDate": "2014-12-13", "id": "20141213", "iso": "20141213", "name": "2014-12-13", + "periodType": "DAILY", "startDate": "2014-12-13", }, Object { + "displayName": "December 14, 2014", "endDate": "2014-12-14", "id": "20141214", "iso": "20141214", "name": "2014-12-14", + "periodType": "DAILY", "startDate": "2014-12-14", }, Object { + "displayName": "December 15, 2014", "endDate": "2014-12-15", "id": "20141215", "iso": "20141215", "name": "2014-12-15", + "periodType": "DAILY", "startDate": "2014-12-15", }, Object { + "displayName": "December 16, 2014", "endDate": "2014-12-16", "id": "20141216", "iso": "20141216", "name": "2014-12-16", + "periodType": "DAILY", "startDate": "2014-12-16", }, Object { + "displayName": "December 17, 2014", "endDate": "2014-12-17", "id": "20141217", "iso": "20141217", "name": "2014-12-17", + "periodType": "DAILY", "startDate": "2014-12-17", }, Object { + "displayName": "December 18, 2014", "endDate": "2014-12-18", "id": "20141218", "iso": "20141218", "name": "2014-12-18", + "periodType": "DAILY", "startDate": "2014-12-18", }, Object { + "displayName": "December 19, 2014", "endDate": "2014-12-19", "id": "20141219", "iso": "20141219", "name": "2014-12-19", + "periodType": "DAILY", "startDate": "2014-12-19", }, Object { + "displayName": "December 20, 2014", "endDate": "2014-12-20", "id": "20141220", "iso": "20141220", "name": "2014-12-20", + "periodType": "DAILY", "startDate": "2014-12-20", }, Object { + "displayName": "December 21, 2014", "endDate": "2014-12-21", "id": "20141221", "iso": "20141221", "name": "2014-12-21", + "periodType": "DAILY", "startDate": "2014-12-21", }, Object { + "displayName": "December 22, 2014", "endDate": "2014-12-22", "id": "20141222", "iso": "20141222", "name": "2014-12-22", + "periodType": "DAILY", "startDate": "2014-12-22", }, Object { + "displayName": "December 23, 2014", "endDate": "2014-12-23", "id": "20141223", "iso": "20141223", "name": "2014-12-23", + "periodType": "DAILY", "startDate": "2014-12-23", }, Object { + "displayName": "December 24, 2014", "endDate": "2014-12-24", "id": "20141224", "iso": "20141224", "name": "2014-12-24", + "periodType": "DAILY", "startDate": "2014-12-24", }, Object { + "displayName": "December 25, 2014", "endDate": "2014-12-25", "id": "20141225", "iso": "20141225", "name": "2014-12-25", + "periodType": "DAILY", "startDate": "2014-12-25", }, Object { + "displayName": "December 26, 2014", "endDate": "2014-12-26", "id": "20141226", "iso": "20141226", "name": "2014-12-26", + "periodType": "DAILY", "startDate": "2014-12-26", }, Object { + "displayName": "December 27, 2014", "endDate": "2014-12-27", "id": "20141227", "iso": "20141227", "name": "2014-12-27", + "periodType": "DAILY", "startDate": "2014-12-27", }, Object { + "displayName": "December 28, 2014", "endDate": "2014-12-28", "id": "20141228", "iso": "20141228", "name": "2014-12-28", + "periodType": "DAILY", "startDate": "2014-12-28", }, Object { + "displayName": "December 29, 2014", "endDate": "2014-12-29", "id": "20141229", "iso": "20141229", "name": "2014-12-29", + "periodType": "DAILY", "startDate": "2014-12-29", }, Object { + "displayName": "December 30, 2014", "endDate": "2014-12-30", "id": "20141230", "iso": "20141230", "name": "2014-12-30", + "periodType": "DAILY", "startDate": "2014-12-30", }, Object { + "displayName": "December 31, 2014", "endDate": "2014-12-31", "id": "20141231", "iso": "20141231", "name": "2014-12-31", + "periodType": "DAILY", "startDate": "2014-12-31", }, ], @@ -2815,63 +3609,93 @@ Object { "name": "Financial year (Start April)", "options": Array [ Object { + "displayName": "April 2005 - March 2006", "endDate": "2006-03-31", "id": "2005April", + "iso": "2005April", "name": "April 2005 - March 2006", + "periodType": "FYAPR", "startDate": "2005-04-01", }, Object { + "displayName": "April 2006 - March 2007", "endDate": "2007-03-31", "id": "2006April", + "iso": "2006April", "name": "April 2006 - March 2007", + "periodType": "FYAPR", "startDate": "2006-04-01", }, Object { + "displayName": "April 2007 - March 2008", "endDate": "2008-03-31", "id": "2007April", + "iso": "2007April", "name": "April 2007 - March 2008", + "periodType": "FYAPR", "startDate": "2007-04-01", }, Object { + "displayName": "April 2008 - March 2009", "endDate": "2009-03-31", "id": "2008April", + "iso": "2008April", "name": "April 2008 - March 2009", + "periodType": "FYAPR", "startDate": "2008-04-01", }, Object { + "displayName": "April 2009 - March 2010", "endDate": "2010-03-31", "id": "2009April", + "iso": "2009April", "name": "April 2009 - March 2010", + "periodType": "FYAPR", "startDate": "2009-04-01", }, Object { + "displayName": "April 2010 - March 2011", "endDate": "2011-03-31", "id": "2010April", + "iso": "2010April", "name": "April 2010 - March 2011", + "periodType": "FYAPR", "startDate": "2010-04-01", }, Object { + "displayName": "April 2011 - March 2012", "endDate": "2012-03-31", "id": "2011April", + "iso": "2011April", "name": "April 2011 - March 2012", + "periodType": "FYAPR", "startDate": "2011-04-01", }, Object { + "displayName": "April 2012 - March 2013", "endDate": "2013-03-31", "id": "2012April", + "iso": "2012April", "name": "April 2012 - March 2013", + "periodType": "FYAPR", "startDate": "2012-04-01", }, Object { + "displayName": "April 2013 - March 2014", "endDate": "2014-03-31", "id": "2013April", + "iso": "2013April", "name": "April 2013 - March 2014", + "periodType": "FYAPR", "startDate": "2013-04-01", }, Object { + "displayName": "April 2014 - March 2015", "endDate": "2015-03-31", "id": "2014April", + "iso": "2014April", "name": "April 2014 - March 2015", + "periodType": "FYAPR", "startDate": "2014-04-01", }, ], @@ -2885,63 +3709,93 @@ Object { "name": "Financial year (Start July)", "options": Array [ Object { + "displayName": "July 2005 - June 2006", "endDate": "2006-06-30", "id": "2005July", + "iso": "2005July", "name": "July 2005 - June 2006", + "periodType": "FYJUL", "startDate": "2005-07-01", }, Object { + "displayName": "July 2006 - June 2007", "endDate": "2007-06-30", "id": "2006July", + "iso": "2006July", "name": "July 2006 - June 2007", + "periodType": "FYJUL", "startDate": "2006-07-01", }, Object { + "displayName": "July 2007 - June 2008", "endDate": "2008-06-30", "id": "2007July", + "iso": "2007July", "name": "July 2007 - June 2008", + "periodType": "FYJUL", "startDate": "2007-07-01", }, Object { + "displayName": "July 2008 - June 2009", "endDate": "2009-06-30", "id": "2008July", + "iso": "2008July", "name": "July 2008 - June 2009", + "periodType": "FYJUL", "startDate": "2008-07-01", }, Object { + "displayName": "July 2009 - June 2010", "endDate": "2010-06-30", "id": "2009July", + "iso": "2009July", "name": "July 2009 - June 2010", + "periodType": "FYJUL", "startDate": "2009-07-01", }, Object { + "displayName": "July 2010 - June 2011", "endDate": "2011-06-30", "id": "2010July", + "iso": "2010July", "name": "July 2010 - June 2011", + "periodType": "FYJUL", "startDate": "2010-07-01", }, Object { + "displayName": "July 2011 - June 2012", "endDate": "2012-06-30", "id": "2011July", + "iso": "2011July", "name": "July 2011 - June 2012", + "periodType": "FYJUL", "startDate": "2011-07-01", }, Object { + "displayName": "July 2012 - June 2013", "endDate": "2013-06-30", "id": "2012July", + "iso": "2012July", "name": "July 2012 - June 2013", + "periodType": "FYJUL", "startDate": "2012-07-01", }, Object { + "displayName": "July 2013 - June 2014", "endDate": "2014-06-30", "id": "2013July", + "iso": "2013July", "name": "July 2013 - June 2014", + "periodType": "FYJUL", "startDate": "2013-07-01", }, Object { + "displayName": "July 2014 - June 2015", "endDate": "2015-06-30", "id": "2014July", + "iso": "2014July", "name": "July 2014 - June 2015", + "periodType": "FYJUL", "startDate": "2014-07-01", }, ], @@ -2955,63 +3809,93 @@ Object { "name": "Financial year (Start November)", "options": Array [ Object { + "displayName": "November 2005 - October 2006", "endDate": "2006-10-31", "id": "2005Nov", + "iso": "2005Nov", "name": "November 2005 - October 2006", + "periodType": "FYNOV", "startDate": "2005-11-01", }, Object { + "displayName": "November 2006 - October 2007", "endDate": "2007-10-31", "id": "2006Nov", + "iso": "2006Nov", "name": "November 2006 - October 2007", + "periodType": "FYNOV", "startDate": "2006-11-01", }, Object { + "displayName": "November 2007 - October 2008", "endDate": "2008-10-31", "id": "2007Nov", + "iso": "2007Nov", "name": "November 2007 - October 2008", + "periodType": "FYNOV", "startDate": "2007-11-01", }, Object { + "displayName": "November 2008 - October 2009", "endDate": "2009-10-31", "id": "2008Nov", + "iso": "2008Nov", "name": "November 2008 - October 2009", + "periodType": "FYNOV", "startDate": "2008-11-01", }, Object { + "displayName": "November 2009 - October 2010", "endDate": "2010-10-31", "id": "2009Nov", + "iso": "2009Nov", "name": "November 2009 - October 2010", + "periodType": "FYNOV", "startDate": "2009-11-01", }, Object { + "displayName": "November 2010 - October 2011", "endDate": "2011-10-31", "id": "2010Nov", + "iso": "2010Nov", "name": "November 2010 - October 2011", + "periodType": "FYNOV", "startDate": "2010-11-01", }, Object { + "displayName": "November 2011 - October 2012", "endDate": "2012-10-31", "id": "2011Nov", + "iso": "2011Nov", "name": "November 2011 - October 2012", + "periodType": "FYNOV", "startDate": "2011-11-01", }, Object { + "displayName": "November 2012 - October 2013", "endDate": "2013-10-31", "id": "2012Nov", + "iso": "2012Nov", "name": "November 2012 - October 2013", + "periodType": "FYNOV", "startDate": "2012-11-01", }, Object { + "displayName": "November 2013 - October 2014", "endDate": "2014-10-31", "id": "2013Nov", + "iso": "2013Nov", "name": "November 2013 - October 2014", + "periodType": "FYNOV", "startDate": "2013-11-01", }, Object { + "displayName": "November 2014 - October 2015", "endDate": "2015-10-31", "id": "2014Nov", + "iso": "2014Nov", "name": "November 2014 - October 2015", + "periodType": "FYNOV", "startDate": "2014-11-01", }, ], @@ -3025,63 +3909,93 @@ Object { "name": "Financial year (Start October)", "options": Array [ Object { + "displayName": "October 2005 - September 2006", "endDate": "2006-09-30", "id": "2005Oct", + "iso": "2005Oct", "name": "October 2005 - September 2006", + "periodType": "FYOCT", "startDate": "2005-10-01", }, Object { + "displayName": "October 2006 - September 2007", "endDate": "2007-09-30", "id": "2006Oct", + "iso": "2006Oct", "name": "October 2006 - September 2007", + "periodType": "FYOCT", "startDate": "2006-10-01", }, Object { + "displayName": "October 2007 - September 2008", "endDate": "2008-09-30", "id": "2007Oct", + "iso": "2007Oct", "name": "October 2007 - September 2008", + "periodType": "FYOCT", "startDate": "2007-10-01", }, Object { + "displayName": "October 2008 - September 2009", "endDate": "2009-09-30", "id": "2008Oct", + "iso": "2008Oct", "name": "October 2008 - September 2009", + "periodType": "FYOCT", "startDate": "2008-10-01", }, Object { + "displayName": "October 2009 - September 2010", "endDate": "2010-09-30", "id": "2009Oct", + "iso": "2009Oct", "name": "October 2009 - September 2010", + "periodType": "FYOCT", "startDate": "2009-10-01", }, Object { + "displayName": "October 2010 - September 2011", "endDate": "2011-09-30", "id": "2010Oct", + "iso": "2010Oct", "name": "October 2010 - September 2011", + "periodType": "FYOCT", "startDate": "2010-10-01", }, Object { + "displayName": "October 2011 - September 2012", "endDate": "2012-09-30", "id": "2011Oct", + "iso": "2011Oct", "name": "October 2011 - September 2012", + "periodType": "FYOCT", "startDate": "2011-10-01", }, Object { + "displayName": "October 2012 - September 2013", "endDate": "2013-09-30", "id": "2012Oct", + "iso": "2012Oct", "name": "October 2012 - September 2013", + "periodType": "FYOCT", "startDate": "2012-10-01", }, Object { + "displayName": "October 2013 - September 2014", "endDate": "2014-09-30", "id": "2013Oct", + "iso": "2013Oct", "name": "October 2013 - September 2014", + "periodType": "FYOCT", "startDate": "2013-10-01", }, Object { + "displayName": "October 2014 - September 2015", "endDate": "2015-09-30", "id": "2014Oct", + "iso": "2014Oct", "name": "October 2014 - September 2015", + "periodType": "FYOCT", "startDate": "2014-10-01", }, ], @@ -3095,87 +4009,111 @@ Object { "name": "Monthly", "options": Array [ Object { + "displayName": "January 2014", "endDate": "2014-01-31", "id": "201401", "iso": "201401", "name": "January 2014", + "periodType": "MONTHLY", "startDate": "2014-01-01", }, Object { + "displayName": "February 2014", "endDate": "2014-02-28", "id": "201402", "iso": "201402", "name": "February 2014", + "periodType": "MONTHLY", "startDate": "2014-02-01", }, Object { + "displayName": "March 2014", "endDate": "2014-03-31", "id": "201403", "iso": "201403", "name": "March 2014", + "periodType": "MONTHLY", "startDate": "2014-03-01", }, Object { + "displayName": "April 2014", "endDate": "2014-04-30", "id": "201404", "iso": "201404", "name": "April 2014", + "periodType": "MONTHLY", "startDate": "2014-04-01", }, Object { + "displayName": "May 2014", "endDate": "2014-05-31", "id": "201405", "iso": "201405", "name": "May 2014", + "periodType": "MONTHLY", "startDate": "2014-05-01", }, Object { + "displayName": "June 2014", "endDate": "2014-06-30", "id": "201406", "iso": "201406", "name": "June 2014", + "periodType": "MONTHLY", "startDate": "2014-06-01", }, Object { + "displayName": "July 2014", "endDate": "2014-07-31", "id": "201407", "iso": "201407", "name": "July 2014", + "periodType": "MONTHLY", "startDate": "2014-07-01", }, Object { + "displayName": "August 2014", "endDate": "2014-08-31", "id": "201408", "iso": "201408", "name": "August 2014", + "periodType": "MONTHLY", "startDate": "2014-08-01", }, Object { + "displayName": "September 2014", "endDate": "2014-09-30", "id": "201409", "iso": "201409", "name": "September 2014", + "periodType": "MONTHLY", "startDate": "2014-09-01", }, Object { + "displayName": "October 2014", "endDate": "2014-10-31", "id": "201410", "iso": "201410", "name": "October 2014", + "periodType": "MONTHLY", "startDate": "2014-10-01", }, Object { + "displayName": "November 2014", "endDate": "2014-11-30", "id": "201411", "iso": "201411", "name": "November 2014", + "periodType": "MONTHLY", "startDate": "2014-11-01", }, Object { + "displayName": "December 2014", "endDate": "2014-12-31", "id": "201412", "iso": "201412", "name": "December 2014", + "periodType": "MONTHLY", "startDate": "2014-12-01", }, ], @@ -3189,31 +4127,39 @@ Object { "name": "Quarterly", "options": Array [ Object { + "displayName": "January - March 2014", "endDate": "2014-03-31", "id": "2014Q1", "iso": "2014Q1", "name": "January - March 2014", + "periodType": "QUARTERLY", "startDate": "2014-01-01", }, Object { + "displayName": "April - June 2014", "endDate": "2014-06-30", "id": "2014Q2", "iso": "2014Q2", "name": "April - June 2014", + "periodType": "QUARTERLY", "startDate": "2014-04-01", }, Object { + "displayName": "July - September 2014", "endDate": "2014-09-30", "id": "2014Q3", "iso": "2014Q3", "name": "July - September 2014", + "periodType": "QUARTERLY", "startDate": "2014-07-01", }, Object { + "displayName": "October - December 2014", "endDate": "2014-12-31", "id": "2014Q4", "iso": "2014Q4", "name": "October - December 2014", + "periodType": "QUARTERLY", "startDate": "2014-10-01", }, ], @@ -3227,17 +4173,21 @@ Object { "name": "Six-monthly", "options": Array [ Object { + "displayName": "January - June 2014", "endDate": "2014-06-30", "id": "2014S1", "iso": "2014S1", "name": "January - June 2014", + "periodType": "SIXMONTHLY", "startDate": "2014-01-01", }, Object { + "displayName": "July - December 2014", "endDate": "2014-12-31", "id": "2014S2", "iso": "2014S2", "name": "July - December 2014", + "periodType": "SIXMONTHLY", "startDate": "2014-07-01", }, ], @@ -3251,17 +4201,21 @@ Object { "name": "Six-monthly April", "options": Array [ Object { + "displayName": "April - September 2014", "endDate": "2014-09-30", "id": "2014AprilS1", "iso": "2014AprilS1", "name": "April - September 2014", + "periodType": "SIXMONTHLYAPR", "startDate": "2014-04-01", }, Object { + "displayName": "October 2014 - March 2015", "endDate": "2015-03-31", "id": "2014AprilS2", "iso": "2014AprilS2", "name": "October 2014 - March 2015", + "periodType": "SIXMONTHLYAPR", "startDate": "2014-10-01", }, ], @@ -3275,367 +4229,471 @@ Object { "name": "Weekly", "options": Array [ Object { + "displayName": "Week 1 - 2013-12-30 - 2014-01-05", "endDate": "2014-01-05", "id": "2014W1", "iso": "2014W1", "name": "Week 1 - 2013-12-30 - 2014-01-05", + "periodType": "WEEKLY", "startDate": "2013-12-30", }, Object { + "displayName": "Week 2 - 2014-01-06 - 2014-01-12", "endDate": "2014-01-12", "id": "2014W2", "iso": "2014W2", "name": "Week 2 - 2014-01-06 - 2014-01-12", + "periodType": "WEEKLY", "startDate": "2014-01-06", }, Object { + "displayName": "Week 3 - 2014-01-13 - 2014-01-19", "endDate": "2014-01-19", "id": "2014W3", "iso": "2014W3", "name": "Week 3 - 2014-01-13 - 2014-01-19", + "periodType": "WEEKLY", "startDate": "2014-01-13", }, Object { + "displayName": "Week 4 - 2014-01-20 - 2014-01-26", "endDate": "2014-01-26", "id": "2014W4", "iso": "2014W4", "name": "Week 4 - 2014-01-20 - 2014-01-26", + "periodType": "WEEKLY", "startDate": "2014-01-20", }, Object { + "displayName": "Week 5 - 2014-01-27 - 2014-02-02", "endDate": "2014-02-02", "id": "2014W5", "iso": "2014W5", "name": "Week 5 - 2014-01-27 - 2014-02-02", + "periodType": "WEEKLY", "startDate": "2014-01-27", }, Object { + "displayName": "Week 6 - 2014-02-03 - 2014-02-09", "endDate": "2014-02-09", "id": "2014W6", "iso": "2014W6", "name": "Week 6 - 2014-02-03 - 2014-02-09", + "periodType": "WEEKLY", "startDate": "2014-02-03", }, Object { + "displayName": "Week 7 - 2014-02-10 - 2014-02-16", "endDate": "2014-02-16", "id": "2014W7", "iso": "2014W7", "name": "Week 7 - 2014-02-10 - 2014-02-16", + "periodType": "WEEKLY", "startDate": "2014-02-10", }, Object { + "displayName": "Week 8 - 2014-02-17 - 2014-02-23", "endDate": "2014-02-23", "id": "2014W8", "iso": "2014W8", "name": "Week 8 - 2014-02-17 - 2014-02-23", + "periodType": "WEEKLY", "startDate": "2014-02-17", }, Object { + "displayName": "Week 9 - 2014-02-24 - 2014-03-02", "endDate": "2014-03-02", "id": "2014W9", "iso": "2014W9", "name": "Week 9 - 2014-02-24 - 2014-03-02", + "periodType": "WEEKLY", "startDate": "2014-02-24", }, Object { + "displayName": "Week 10 - 2014-03-03 - 2014-03-09", "endDate": "2014-03-09", "id": "2014W10", "iso": "2014W10", "name": "Week 10 - 2014-03-03 - 2014-03-09", + "periodType": "WEEKLY", "startDate": "2014-03-03", }, Object { + "displayName": "Week 11 - 2014-03-10 - 2014-03-16", "endDate": "2014-03-16", "id": "2014W11", "iso": "2014W11", "name": "Week 11 - 2014-03-10 - 2014-03-16", + "periodType": "WEEKLY", "startDate": "2014-03-10", }, Object { + "displayName": "Week 12 - 2014-03-17 - 2014-03-23", "endDate": "2014-03-23", "id": "2014W12", "iso": "2014W12", "name": "Week 12 - 2014-03-17 - 2014-03-23", + "periodType": "WEEKLY", "startDate": "2014-03-17", }, Object { + "displayName": "Week 13 - 2014-03-24 - 2014-03-30", "endDate": "2014-03-30", "id": "2014W13", "iso": "2014W13", "name": "Week 13 - 2014-03-24 - 2014-03-30", + "periodType": "WEEKLY", "startDate": "2014-03-24", }, Object { + "displayName": "Week 14 - 2014-03-31 - 2014-04-06", "endDate": "2014-04-06", "id": "2014W14", "iso": "2014W14", "name": "Week 14 - 2014-03-31 - 2014-04-06", + "periodType": "WEEKLY", "startDate": "2014-03-31", }, Object { + "displayName": "Week 15 - 2014-04-07 - 2014-04-13", "endDate": "2014-04-13", "id": "2014W15", "iso": "2014W15", "name": "Week 15 - 2014-04-07 - 2014-04-13", + "periodType": "WEEKLY", "startDate": "2014-04-07", }, Object { + "displayName": "Week 16 - 2014-04-14 - 2014-04-20", "endDate": "2014-04-20", "id": "2014W16", "iso": "2014W16", "name": "Week 16 - 2014-04-14 - 2014-04-20", + "periodType": "WEEKLY", "startDate": "2014-04-14", }, Object { + "displayName": "Week 17 - 2014-04-21 - 2014-04-27", "endDate": "2014-04-27", "id": "2014W17", "iso": "2014W17", "name": "Week 17 - 2014-04-21 - 2014-04-27", + "periodType": "WEEKLY", "startDate": "2014-04-21", }, Object { + "displayName": "Week 18 - 2014-04-28 - 2014-05-04", "endDate": "2014-05-04", "id": "2014W18", "iso": "2014W18", "name": "Week 18 - 2014-04-28 - 2014-05-04", + "periodType": "WEEKLY", "startDate": "2014-04-28", }, Object { + "displayName": "Week 19 - 2014-05-05 - 2014-05-11", "endDate": "2014-05-11", "id": "2014W19", "iso": "2014W19", "name": "Week 19 - 2014-05-05 - 2014-05-11", + "periodType": "WEEKLY", "startDate": "2014-05-05", }, Object { + "displayName": "Week 20 - 2014-05-12 - 2014-05-18", "endDate": "2014-05-18", "id": "2014W20", "iso": "2014W20", "name": "Week 20 - 2014-05-12 - 2014-05-18", + "periodType": "WEEKLY", "startDate": "2014-05-12", }, Object { + "displayName": "Week 21 - 2014-05-19 - 2014-05-25", "endDate": "2014-05-25", "id": "2014W21", "iso": "2014W21", "name": "Week 21 - 2014-05-19 - 2014-05-25", + "periodType": "WEEKLY", "startDate": "2014-05-19", }, Object { + "displayName": "Week 22 - 2014-05-26 - 2014-06-01", "endDate": "2014-06-01", "id": "2014W22", "iso": "2014W22", "name": "Week 22 - 2014-05-26 - 2014-06-01", + "periodType": "WEEKLY", "startDate": "2014-05-26", }, Object { + "displayName": "Week 23 - 2014-06-02 - 2014-06-08", "endDate": "2014-06-08", "id": "2014W23", "iso": "2014W23", "name": "Week 23 - 2014-06-02 - 2014-06-08", + "periodType": "WEEKLY", "startDate": "2014-06-02", }, Object { + "displayName": "Week 24 - 2014-06-09 - 2014-06-15", "endDate": "2014-06-15", "id": "2014W24", "iso": "2014W24", "name": "Week 24 - 2014-06-09 - 2014-06-15", + "periodType": "WEEKLY", "startDate": "2014-06-09", }, Object { + "displayName": "Week 25 - 2014-06-16 - 2014-06-22", "endDate": "2014-06-22", "id": "2014W25", "iso": "2014W25", "name": "Week 25 - 2014-06-16 - 2014-06-22", + "periodType": "WEEKLY", "startDate": "2014-06-16", }, Object { + "displayName": "Week 26 - 2014-06-23 - 2014-06-29", "endDate": "2014-06-29", "id": "2014W26", "iso": "2014W26", "name": "Week 26 - 2014-06-23 - 2014-06-29", + "periodType": "WEEKLY", "startDate": "2014-06-23", }, Object { + "displayName": "Week 27 - 2014-06-30 - 2014-07-06", "endDate": "2014-07-06", "id": "2014W27", "iso": "2014W27", "name": "Week 27 - 2014-06-30 - 2014-07-06", + "periodType": "WEEKLY", "startDate": "2014-06-30", }, Object { + "displayName": "Week 28 - 2014-07-07 - 2014-07-13", "endDate": "2014-07-13", "id": "2014W28", "iso": "2014W28", "name": "Week 28 - 2014-07-07 - 2014-07-13", + "periodType": "WEEKLY", "startDate": "2014-07-07", }, Object { + "displayName": "Week 29 - 2014-07-14 - 2014-07-20", "endDate": "2014-07-20", "id": "2014W29", "iso": "2014W29", "name": "Week 29 - 2014-07-14 - 2014-07-20", + "periodType": "WEEKLY", "startDate": "2014-07-14", }, Object { + "displayName": "Week 30 - 2014-07-21 - 2014-07-27", "endDate": "2014-07-27", "id": "2014W30", "iso": "2014W30", "name": "Week 30 - 2014-07-21 - 2014-07-27", + "periodType": "WEEKLY", "startDate": "2014-07-21", }, Object { + "displayName": "Week 31 - 2014-07-28 - 2014-08-03", "endDate": "2014-08-03", "id": "2014W31", "iso": "2014W31", "name": "Week 31 - 2014-07-28 - 2014-08-03", + "periodType": "WEEKLY", "startDate": "2014-07-28", }, Object { + "displayName": "Week 32 - 2014-08-04 - 2014-08-10", "endDate": "2014-08-10", "id": "2014W32", "iso": "2014W32", "name": "Week 32 - 2014-08-04 - 2014-08-10", + "periodType": "WEEKLY", "startDate": "2014-08-04", }, Object { + "displayName": "Week 33 - 2014-08-11 - 2014-08-17", "endDate": "2014-08-17", "id": "2014W33", "iso": "2014W33", "name": "Week 33 - 2014-08-11 - 2014-08-17", + "periodType": "WEEKLY", "startDate": "2014-08-11", }, Object { + "displayName": "Week 34 - 2014-08-18 - 2014-08-24", "endDate": "2014-08-24", "id": "2014W34", "iso": "2014W34", "name": "Week 34 - 2014-08-18 - 2014-08-24", + "periodType": "WEEKLY", "startDate": "2014-08-18", }, Object { + "displayName": "Week 35 - 2014-08-25 - 2014-08-31", "endDate": "2014-08-31", "id": "2014W35", "iso": "2014W35", "name": "Week 35 - 2014-08-25 - 2014-08-31", + "periodType": "WEEKLY", "startDate": "2014-08-25", }, Object { + "displayName": "Week 36 - 2014-09-01 - 2014-09-07", "endDate": "2014-09-07", "id": "2014W36", "iso": "2014W36", "name": "Week 36 - 2014-09-01 - 2014-09-07", + "periodType": "WEEKLY", "startDate": "2014-09-01", }, Object { + "displayName": "Week 37 - 2014-09-08 - 2014-09-14", "endDate": "2014-09-14", "id": "2014W37", "iso": "2014W37", "name": "Week 37 - 2014-09-08 - 2014-09-14", + "periodType": "WEEKLY", "startDate": "2014-09-08", }, Object { + "displayName": "Week 38 - 2014-09-15 - 2014-09-21", "endDate": "2014-09-21", "id": "2014W38", "iso": "2014W38", "name": "Week 38 - 2014-09-15 - 2014-09-21", + "periodType": "WEEKLY", "startDate": "2014-09-15", }, Object { + "displayName": "Week 39 - 2014-09-22 - 2014-09-28", "endDate": "2014-09-28", "id": "2014W39", "iso": "2014W39", "name": "Week 39 - 2014-09-22 - 2014-09-28", + "periodType": "WEEKLY", "startDate": "2014-09-22", }, Object { + "displayName": "Week 40 - 2014-09-29 - 2014-10-05", "endDate": "2014-10-05", "id": "2014W40", "iso": "2014W40", "name": "Week 40 - 2014-09-29 - 2014-10-05", + "periodType": "WEEKLY", "startDate": "2014-09-29", }, Object { + "displayName": "Week 41 - 2014-10-06 - 2014-10-12", "endDate": "2014-10-12", "id": "2014W41", "iso": "2014W41", "name": "Week 41 - 2014-10-06 - 2014-10-12", + "periodType": "WEEKLY", "startDate": "2014-10-06", }, Object { + "displayName": "Week 42 - 2014-10-13 - 2014-10-19", "endDate": "2014-10-19", "id": "2014W42", "iso": "2014W42", "name": "Week 42 - 2014-10-13 - 2014-10-19", + "periodType": "WEEKLY", "startDate": "2014-10-13", }, Object { + "displayName": "Week 43 - 2014-10-20 - 2014-10-26", "endDate": "2014-10-26", "id": "2014W43", "iso": "2014W43", "name": "Week 43 - 2014-10-20 - 2014-10-26", + "periodType": "WEEKLY", "startDate": "2014-10-20", }, Object { + "displayName": "Week 44 - 2014-10-27 - 2014-11-02", "endDate": "2014-11-02", "id": "2014W44", "iso": "2014W44", "name": "Week 44 - 2014-10-27 - 2014-11-02", + "periodType": "WEEKLY", "startDate": "2014-10-27", }, Object { + "displayName": "Week 45 - 2014-11-03 - 2014-11-09", "endDate": "2014-11-09", "id": "2014W45", "iso": "2014W45", "name": "Week 45 - 2014-11-03 - 2014-11-09", + "periodType": "WEEKLY", "startDate": "2014-11-03", }, Object { + "displayName": "Week 46 - 2014-11-10 - 2014-11-16", "endDate": "2014-11-16", "id": "2014W46", "iso": "2014W46", "name": "Week 46 - 2014-11-10 - 2014-11-16", + "periodType": "WEEKLY", "startDate": "2014-11-10", }, Object { + "displayName": "Week 47 - 2014-11-17 - 2014-11-23", "endDate": "2014-11-23", "id": "2014W47", "iso": "2014W47", "name": "Week 47 - 2014-11-17 - 2014-11-23", + "periodType": "WEEKLY", "startDate": "2014-11-17", }, Object { + "displayName": "Week 48 - 2014-11-24 - 2014-11-30", "endDate": "2014-11-30", "id": "2014W48", "iso": "2014W48", "name": "Week 48 - 2014-11-24 - 2014-11-30", + "periodType": "WEEKLY", "startDate": "2014-11-24", }, Object { + "displayName": "Week 49 - 2014-12-01 - 2014-12-07", "endDate": "2014-12-07", "id": "2014W49", "iso": "2014W49", "name": "Week 49 - 2014-12-01 - 2014-12-07", + "periodType": "WEEKLY", "startDate": "2014-12-01", }, Object { + "displayName": "Week 50 - 2014-12-08 - 2014-12-14", "endDate": "2014-12-14", "id": "2014W50", "iso": "2014W50", "name": "Week 50 - 2014-12-08 - 2014-12-14", + "periodType": "WEEKLY", "startDate": "2014-12-08", }, Object { + "displayName": "Week 51 - 2014-12-15 - 2014-12-21", "endDate": "2014-12-21", "id": "2014W51", "iso": "2014W51", "name": "Week 51 - 2014-12-15 - 2014-12-21", + "periodType": "WEEKLY", "startDate": "2014-12-15", }, Object { + "displayName": "Week 52 - 2014-12-22 - 2014-12-28", "endDate": "2014-12-28", "id": "2014W52", "iso": "2014W52", "name": "Week 52 - 2014-12-22 - 2014-12-28", + "periodType": "WEEKLY", "startDate": "2014-12-22", }, ], @@ -3649,367 +4707,471 @@ Object { "name": "Weekly (Start Saturday)", "options": Array [ Object { + "displayName": "Week 1 - 2014-01-04 - 2014-01-10", "endDate": "2014-01-10", "id": "2014SatW1", "iso": "2014SatW1", "name": "Week 1 - 2014-01-04 - 2014-01-10", + "periodType": "WEEKLY", "startDate": "2014-01-04", }, Object { + "displayName": "Week 2 - 2014-01-11 - 2014-01-17", "endDate": "2014-01-17", "id": "2014SatW2", "iso": "2014SatW2", "name": "Week 2 - 2014-01-11 - 2014-01-17", + "periodType": "WEEKLY", "startDate": "2014-01-11", }, Object { + "displayName": "Week 3 - 2014-01-18 - 2014-01-24", "endDate": "2014-01-24", "id": "2014SatW3", "iso": "2014SatW3", "name": "Week 3 - 2014-01-18 - 2014-01-24", + "periodType": "WEEKLY", "startDate": "2014-01-18", }, Object { + "displayName": "Week 4 - 2014-01-25 - 2014-01-31", "endDate": "2014-01-31", "id": "2014SatW4", "iso": "2014SatW4", "name": "Week 4 - 2014-01-25 - 2014-01-31", + "periodType": "WEEKLY", "startDate": "2014-01-25", }, Object { + "displayName": "Week 5 - 2014-02-01 - 2014-02-07", "endDate": "2014-02-07", "id": "2014SatW5", "iso": "2014SatW5", "name": "Week 5 - 2014-02-01 - 2014-02-07", + "periodType": "WEEKLY", "startDate": "2014-02-01", }, Object { + "displayName": "Week 6 - 2014-02-08 - 2014-02-14", "endDate": "2014-02-14", "id": "2014SatW6", "iso": "2014SatW6", "name": "Week 6 - 2014-02-08 - 2014-02-14", + "periodType": "WEEKLY", "startDate": "2014-02-08", }, Object { + "displayName": "Week 7 - 2014-02-15 - 2014-02-21", "endDate": "2014-02-21", "id": "2014SatW7", "iso": "2014SatW7", "name": "Week 7 - 2014-02-15 - 2014-02-21", + "periodType": "WEEKLY", "startDate": "2014-02-15", }, Object { + "displayName": "Week 8 - 2014-02-22 - 2014-02-28", "endDate": "2014-02-28", "id": "2014SatW8", "iso": "2014SatW8", "name": "Week 8 - 2014-02-22 - 2014-02-28", + "periodType": "WEEKLY", "startDate": "2014-02-22", }, Object { + "displayName": "Week 9 - 2014-03-01 - 2014-03-07", "endDate": "2014-03-07", "id": "2014SatW9", "iso": "2014SatW9", "name": "Week 9 - 2014-03-01 - 2014-03-07", + "periodType": "WEEKLY", "startDate": "2014-03-01", }, Object { + "displayName": "Week 10 - 2014-03-08 - 2014-03-14", "endDate": "2014-03-14", "id": "2014SatW10", "iso": "2014SatW10", "name": "Week 10 - 2014-03-08 - 2014-03-14", + "periodType": "WEEKLY", "startDate": "2014-03-08", }, Object { + "displayName": "Week 11 - 2014-03-15 - 2014-03-21", "endDate": "2014-03-21", "id": "2014SatW11", "iso": "2014SatW11", "name": "Week 11 - 2014-03-15 - 2014-03-21", + "periodType": "WEEKLY", "startDate": "2014-03-15", }, Object { + "displayName": "Week 12 - 2014-03-22 - 2014-03-28", "endDate": "2014-03-28", "id": "2014SatW12", "iso": "2014SatW12", "name": "Week 12 - 2014-03-22 - 2014-03-28", + "periodType": "WEEKLY", "startDate": "2014-03-22", }, Object { + "displayName": "Week 13 - 2014-03-29 - 2014-04-04", "endDate": "2014-04-04", "id": "2014SatW13", "iso": "2014SatW13", "name": "Week 13 - 2014-03-29 - 2014-04-04", + "periodType": "WEEKLY", "startDate": "2014-03-29", }, Object { + "displayName": "Week 14 - 2014-04-05 - 2014-04-11", "endDate": "2014-04-11", "id": "2014SatW14", "iso": "2014SatW14", "name": "Week 14 - 2014-04-05 - 2014-04-11", + "periodType": "WEEKLY", "startDate": "2014-04-05", }, Object { + "displayName": "Week 15 - 2014-04-12 - 2014-04-18", "endDate": "2014-04-18", "id": "2014SatW15", "iso": "2014SatW15", "name": "Week 15 - 2014-04-12 - 2014-04-18", + "periodType": "WEEKLY", "startDate": "2014-04-12", }, Object { + "displayName": "Week 16 - 2014-04-19 - 2014-04-25", "endDate": "2014-04-25", "id": "2014SatW16", "iso": "2014SatW16", "name": "Week 16 - 2014-04-19 - 2014-04-25", + "periodType": "WEEKLY", "startDate": "2014-04-19", }, Object { + "displayName": "Week 17 - 2014-04-26 - 2014-05-02", "endDate": "2014-05-02", "id": "2014SatW17", "iso": "2014SatW17", "name": "Week 17 - 2014-04-26 - 2014-05-02", + "periodType": "WEEKLY", "startDate": "2014-04-26", }, Object { + "displayName": "Week 18 - 2014-05-03 - 2014-05-09", "endDate": "2014-05-09", "id": "2014SatW18", "iso": "2014SatW18", "name": "Week 18 - 2014-05-03 - 2014-05-09", + "periodType": "WEEKLY", "startDate": "2014-05-03", }, Object { + "displayName": "Week 19 - 2014-05-10 - 2014-05-16", "endDate": "2014-05-16", "id": "2014SatW19", "iso": "2014SatW19", "name": "Week 19 - 2014-05-10 - 2014-05-16", + "periodType": "WEEKLY", "startDate": "2014-05-10", }, Object { + "displayName": "Week 20 - 2014-05-17 - 2014-05-23", "endDate": "2014-05-23", "id": "2014SatW20", "iso": "2014SatW20", "name": "Week 20 - 2014-05-17 - 2014-05-23", + "periodType": "WEEKLY", "startDate": "2014-05-17", }, Object { + "displayName": "Week 21 - 2014-05-24 - 2014-05-30", "endDate": "2014-05-30", "id": "2014SatW21", "iso": "2014SatW21", "name": "Week 21 - 2014-05-24 - 2014-05-30", + "periodType": "WEEKLY", "startDate": "2014-05-24", }, Object { + "displayName": "Week 22 - 2014-05-31 - 2014-06-06", "endDate": "2014-06-06", "id": "2014SatW22", "iso": "2014SatW22", "name": "Week 22 - 2014-05-31 - 2014-06-06", + "periodType": "WEEKLY", "startDate": "2014-05-31", }, Object { + "displayName": "Week 23 - 2014-06-07 - 2014-06-13", "endDate": "2014-06-13", "id": "2014SatW23", "iso": "2014SatW23", "name": "Week 23 - 2014-06-07 - 2014-06-13", + "periodType": "WEEKLY", "startDate": "2014-06-07", }, Object { + "displayName": "Week 24 - 2014-06-14 - 2014-06-20", "endDate": "2014-06-20", "id": "2014SatW24", "iso": "2014SatW24", "name": "Week 24 - 2014-06-14 - 2014-06-20", + "periodType": "WEEKLY", "startDate": "2014-06-14", }, Object { + "displayName": "Week 25 - 2014-06-21 - 2014-06-27", "endDate": "2014-06-27", "id": "2014SatW25", "iso": "2014SatW25", "name": "Week 25 - 2014-06-21 - 2014-06-27", + "periodType": "WEEKLY", "startDate": "2014-06-21", }, Object { + "displayName": "Week 26 - 2014-06-28 - 2014-07-04", "endDate": "2014-07-04", "id": "2014SatW26", "iso": "2014SatW26", "name": "Week 26 - 2014-06-28 - 2014-07-04", + "periodType": "WEEKLY", "startDate": "2014-06-28", }, Object { + "displayName": "Week 27 - 2014-07-05 - 2014-07-11", "endDate": "2014-07-11", "id": "2014SatW27", "iso": "2014SatW27", "name": "Week 27 - 2014-07-05 - 2014-07-11", + "periodType": "WEEKLY", "startDate": "2014-07-05", }, Object { + "displayName": "Week 28 - 2014-07-12 - 2014-07-18", "endDate": "2014-07-18", "id": "2014SatW28", "iso": "2014SatW28", "name": "Week 28 - 2014-07-12 - 2014-07-18", + "periodType": "WEEKLY", "startDate": "2014-07-12", }, Object { + "displayName": "Week 29 - 2014-07-19 - 2014-07-25", "endDate": "2014-07-25", "id": "2014SatW29", "iso": "2014SatW29", "name": "Week 29 - 2014-07-19 - 2014-07-25", + "periodType": "WEEKLY", "startDate": "2014-07-19", }, Object { + "displayName": "Week 30 - 2014-07-26 - 2014-08-01", "endDate": "2014-08-01", "id": "2014SatW30", "iso": "2014SatW30", "name": "Week 30 - 2014-07-26 - 2014-08-01", + "periodType": "WEEKLY", "startDate": "2014-07-26", }, Object { + "displayName": "Week 31 - 2014-08-02 - 2014-08-08", "endDate": "2014-08-08", "id": "2014SatW31", "iso": "2014SatW31", "name": "Week 31 - 2014-08-02 - 2014-08-08", + "periodType": "WEEKLY", "startDate": "2014-08-02", }, Object { + "displayName": "Week 32 - 2014-08-09 - 2014-08-15", "endDate": "2014-08-15", "id": "2014SatW32", "iso": "2014SatW32", "name": "Week 32 - 2014-08-09 - 2014-08-15", + "periodType": "WEEKLY", "startDate": "2014-08-09", }, Object { + "displayName": "Week 33 - 2014-08-16 - 2014-08-22", "endDate": "2014-08-22", "id": "2014SatW33", "iso": "2014SatW33", "name": "Week 33 - 2014-08-16 - 2014-08-22", + "periodType": "WEEKLY", "startDate": "2014-08-16", }, Object { + "displayName": "Week 34 - 2014-08-23 - 2014-08-29", "endDate": "2014-08-29", "id": "2014SatW34", "iso": "2014SatW34", "name": "Week 34 - 2014-08-23 - 2014-08-29", + "periodType": "WEEKLY", "startDate": "2014-08-23", }, Object { + "displayName": "Week 35 - 2014-08-30 - 2014-09-05", "endDate": "2014-09-05", "id": "2014SatW35", "iso": "2014SatW35", "name": "Week 35 - 2014-08-30 - 2014-09-05", + "periodType": "WEEKLY", "startDate": "2014-08-30", }, Object { + "displayName": "Week 36 - 2014-09-06 - 2014-09-12", "endDate": "2014-09-12", "id": "2014SatW36", "iso": "2014SatW36", "name": "Week 36 - 2014-09-06 - 2014-09-12", + "periodType": "WEEKLY", "startDate": "2014-09-06", }, Object { + "displayName": "Week 37 - 2014-09-13 - 2014-09-19", "endDate": "2014-09-19", "id": "2014SatW37", "iso": "2014SatW37", "name": "Week 37 - 2014-09-13 - 2014-09-19", + "periodType": "WEEKLY", "startDate": "2014-09-13", }, Object { + "displayName": "Week 38 - 2014-09-20 - 2014-09-26", "endDate": "2014-09-26", "id": "2014SatW38", "iso": "2014SatW38", "name": "Week 38 - 2014-09-20 - 2014-09-26", + "periodType": "WEEKLY", "startDate": "2014-09-20", }, Object { + "displayName": "Week 39 - 2014-09-27 - 2014-10-03", "endDate": "2014-10-03", "id": "2014SatW39", "iso": "2014SatW39", "name": "Week 39 - 2014-09-27 - 2014-10-03", + "periodType": "WEEKLY", "startDate": "2014-09-27", }, Object { + "displayName": "Week 40 - 2014-10-04 - 2014-10-10", "endDate": "2014-10-10", "id": "2014SatW40", "iso": "2014SatW40", "name": "Week 40 - 2014-10-04 - 2014-10-10", + "periodType": "WEEKLY", "startDate": "2014-10-04", }, Object { + "displayName": "Week 41 - 2014-10-11 - 2014-10-17", "endDate": "2014-10-17", "id": "2014SatW41", "iso": "2014SatW41", "name": "Week 41 - 2014-10-11 - 2014-10-17", + "periodType": "WEEKLY", "startDate": "2014-10-11", }, Object { + "displayName": "Week 42 - 2014-10-18 - 2014-10-24", "endDate": "2014-10-24", "id": "2014SatW42", "iso": "2014SatW42", "name": "Week 42 - 2014-10-18 - 2014-10-24", + "periodType": "WEEKLY", "startDate": "2014-10-18", }, Object { + "displayName": "Week 43 - 2014-10-25 - 2014-10-31", "endDate": "2014-10-31", "id": "2014SatW43", "iso": "2014SatW43", "name": "Week 43 - 2014-10-25 - 2014-10-31", + "periodType": "WEEKLY", "startDate": "2014-10-25", }, Object { + "displayName": "Week 44 - 2014-11-01 - 2014-11-07", "endDate": "2014-11-07", "id": "2014SatW44", "iso": "2014SatW44", "name": "Week 44 - 2014-11-01 - 2014-11-07", + "periodType": "WEEKLY", "startDate": "2014-11-01", }, Object { + "displayName": "Week 45 - 2014-11-08 - 2014-11-14", "endDate": "2014-11-14", "id": "2014SatW45", "iso": "2014SatW45", "name": "Week 45 - 2014-11-08 - 2014-11-14", + "periodType": "WEEKLY", "startDate": "2014-11-08", }, Object { + "displayName": "Week 46 - 2014-11-15 - 2014-11-21", "endDate": "2014-11-21", "id": "2014SatW46", "iso": "2014SatW46", "name": "Week 46 - 2014-11-15 - 2014-11-21", + "periodType": "WEEKLY", "startDate": "2014-11-15", }, Object { + "displayName": "Week 47 - 2014-11-22 - 2014-11-28", "endDate": "2014-11-28", "id": "2014SatW47", "iso": "2014SatW47", "name": "Week 47 - 2014-11-22 - 2014-11-28", + "periodType": "WEEKLY", "startDate": "2014-11-22", }, Object { + "displayName": "Week 48 - 2014-11-29 - 2014-12-05", "endDate": "2014-12-05", "id": "2014SatW48", "iso": "2014SatW48", "name": "Week 48 - 2014-11-29 - 2014-12-05", + "periodType": "WEEKLY", "startDate": "2014-11-29", }, Object { + "displayName": "Week 49 - 2014-12-06 - 2014-12-12", "endDate": "2014-12-12", "id": "2014SatW49", "iso": "2014SatW49", "name": "Week 49 - 2014-12-06 - 2014-12-12", + "periodType": "WEEKLY", "startDate": "2014-12-06", }, Object { + "displayName": "Week 50 - 2014-12-13 - 2014-12-19", "endDate": "2014-12-19", "id": "2014SatW50", "iso": "2014SatW50", "name": "Week 50 - 2014-12-13 - 2014-12-19", + "periodType": "WEEKLY", "startDate": "2014-12-13", }, Object { + "displayName": "Week 51 - 2014-12-20 - 2014-12-26", "endDate": "2014-12-26", "id": "2014SatW51", "iso": "2014SatW51", "name": "Week 51 - 2014-12-20 - 2014-12-26", + "periodType": "WEEKLY", "startDate": "2014-12-20", }, Object { + "displayName": "Week 52 - 2014-12-27 - 2015-01-02", "endDate": "2015-01-02", "id": "2014SatW52", "iso": "2014SatW52", "name": "Week 52 - 2014-12-27 - 2015-01-02", + "periodType": "WEEKLY", "startDate": "2014-12-27", }, ], @@ -4023,374 +5185,480 @@ Object { "name": "Weekly (Start Sunday)", "options": Array [ Object { + "displayName": "Week 1 - 2013-12-29 - 2014-01-04", "endDate": "2014-01-04", "id": "2014SunW1", "iso": "2014SunW1", "name": "Week 1 - 2013-12-29 - 2014-01-04", + "periodType": "WEEKLY", "startDate": "2013-12-29", }, Object { + "displayName": "Week 2 - 2014-01-05 - 2014-01-11", "endDate": "2014-01-11", "id": "2014SunW2", "iso": "2014SunW2", "name": "Week 2 - 2014-01-05 - 2014-01-11", + "periodType": "WEEKLY", "startDate": "2014-01-05", }, Object { + "displayName": "Week 3 - 2014-01-12 - 2014-01-18", "endDate": "2014-01-18", "id": "2014SunW3", "iso": "2014SunW3", "name": "Week 3 - 2014-01-12 - 2014-01-18", + "periodType": "WEEKLY", "startDate": "2014-01-12", }, Object { + "displayName": "Week 4 - 2014-01-19 - 2014-01-25", "endDate": "2014-01-25", "id": "2014SunW4", "iso": "2014SunW4", "name": "Week 4 - 2014-01-19 - 2014-01-25", + "periodType": "WEEKLY", "startDate": "2014-01-19", }, Object { + "displayName": "Week 5 - 2014-01-26 - 2014-02-01", "endDate": "2014-02-01", "id": "2014SunW5", "iso": "2014SunW5", "name": "Week 5 - 2014-01-26 - 2014-02-01", + "periodType": "WEEKLY", "startDate": "2014-01-26", }, Object { + "displayName": "Week 6 - 2014-02-02 - 2014-02-08", "endDate": "2014-02-08", "id": "2014SunW6", "iso": "2014SunW6", "name": "Week 6 - 2014-02-02 - 2014-02-08", + "periodType": "WEEKLY", "startDate": "2014-02-02", }, Object { + "displayName": "Week 7 - 2014-02-09 - 2014-02-15", "endDate": "2014-02-15", "id": "2014SunW7", "iso": "2014SunW7", "name": "Week 7 - 2014-02-09 - 2014-02-15", + "periodType": "WEEKLY", "startDate": "2014-02-09", }, Object { + "displayName": "Week 8 - 2014-02-16 - 2014-02-22", "endDate": "2014-02-22", "id": "2014SunW8", "iso": "2014SunW8", "name": "Week 8 - 2014-02-16 - 2014-02-22", + "periodType": "WEEKLY", "startDate": "2014-02-16", }, Object { + "displayName": "Week 9 - 2014-02-23 - 2014-03-01", "endDate": "2014-03-01", "id": "2014SunW9", "iso": "2014SunW9", "name": "Week 9 - 2014-02-23 - 2014-03-01", + "periodType": "WEEKLY", "startDate": "2014-02-23", }, Object { + "displayName": "Week 10 - 2014-03-02 - 2014-03-08", "endDate": "2014-03-08", "id": "2014SunW10", "iso": "2014SunW10", "name": "Week 10 - 2014-03-02 - 2014-03-08", + "periodType": "WEEKLY", "startDate": "2014-03-02", }, Object { + "displayName": "Week 11 - 2014-03-09 - 2014-03-15", "endDate": "2014-03-15", "id": "2014SunW11", "iso": "2014SunW11", "name": "Week 11 - 2014-03-09 - 2014-03-15", + "periodType": "WEEKLY", "startDate": "2014-03-09", }, Object { + "displayName": "Week 12 - 2014-03-16 - 2014-03-22", "endDate": "2014-03-22", "id": "2014SunW12", "iso": "2014SunW12", "name": "Week 12 - 2014-03-16 - 2014-03-22", + "periodType": "WEEKLY", "startDate": "2014-03-16", }, Object { + "displayName": "Week 13 - 2014-03-23 - 2014-03-29", "endDate": "2014-03-29", "id": "2014SunW13", "iso": "2014SunW13", "name": "Week 13 - 2014-03-23 - 2014-03-29", + "periodType": "WEEKLY", "startDate": "2014-03-23", }, Object { + "displayName": "Week 14 - 2014-03-30 - 2014-04-05", "endDate": "2014-04-05", "id": "2014SunW14", "iso": "2014SunW14", "name": "Week 14 - 2014-03-30 - 2014-04-05", + "periodType": "WEEKLY", "startDate": "2014-03-30", }, Object { + "displayName": "Week 15 - 2014-04-06 - 2014-04-12", "endDate": "2014-04-12", "id": "2014SunW15", "iso": "2014SunW15", "name": "Week 15 - 2014-04-06 - 2014-04-12", + "periodType": "WEEKLY", "startDate": "2014-04-06", }, Object { + "displayName": "Week 16 - 2014-04-13 - 2014-04-19", "endDate": "2014-04-19", "id": "2014SunW16", "iso": "2014SunW16", "name": "Week 16 - 2014-04-13 - 2014-04-19", + "periodType": "WEEKLY", "startDate": "2014-04-13", }, Object { + "displayName": "Week 17 - 2014-04-20 - 2014-04-26", "endDate": "2014-04-26", "id": "2014SunW17", "iso": "2014SunW17", "name": "Week 17 - 2014-04-20 - 2014-04-26", + "periodType": "WEEKLY", "startDate": "2014-04-20", }, Object { + "displayName": "Week 18 - 2014-04-27 - 2014-05-03", "endDate": "2014-05-03", "id": "2014SunW18", "iso": "2014SunW18", "name": "Week 18 - 2014-04-27 - 2014-05-03", + "periodType": "WEEKLY", "startDate": "2014-04-27", }, Object { + "displayName": "Week 19 - 2014-05-04 - 2014-05-10", "endDate": "2014-05-10", "id": "2014SunW19", "iso": "2014SunW19", "name": "Week 19 - 2014-05-04 - 2014-05-10", + "periodType": "WEEKLY", "startDate": "2014-05-04", }, Object { + "displayName": "Week 20 - 2014-05-11 - 2014-05-17", "endDate": "2014-05-17", "id": "2014SunW20", "iso": "2014SunW20", "name": "Week 20 - 2014-05-11 - 2014-05-17", + "periodType": "WEEKLY", "startDate": "2014-05-11", }, Object { + "displayName": "Week 21 - 2014-05-18 - 2014-05-24", "endDate": "2014-05-24", "id": "2014SunW21", "iso": "2014SunW21", "name": "Week 21 - 2014-05-18 - 2014-05-24", + "periodType": "WEEKLY", "startDate": "2014-05-18", }, Object { + "displayName": "Week 22 - 2014-05-25 - 2014-05-31", "endDate": "2014-05-31", "id": "2014SunW22", "iso": "2014SunW22", "name": "Week 22 - 2014-05-25 - 2014-05-31", + "periodType": "WEEKLY", "startDate": "2014-05-25", }, Object { + "displayName": "Week 23 - 2014-06-01 - 2014-06-07", "endDate": "2014-06-07", "id": "2014SunW23", "iso": "2014SunW23", "name": "Week 23 - 2014-06-01 - 2014-06-07", + "periodType": "WEEKLY", "startDate": "2014-06-01", }, Object { + "displayName": "Week 24 - 2014-06-08 - 2014-06-14", "endDate": "2014-06-14", "id": "2014SunW24", "iso": "2014SunW24", "name": "Week 24 - 2014-06-08 - 2014-06-14", + "periodType": "WEEKLY", "startDate": "2014-06-08", }, Object { + "displayName": "Week 25 - 2014-06-15 - 2014-06-21", "endDate": "2014-06-21", "id": "2014SunW25", "iso": "2014SunW25", "name": "Week 25 - 2014-06-15 - 2014-06-21", + "periodType": "WEEKLY", "startDate": "2014-06-15", }, Object { + "displayName": "Week 26 - 2014-06-22 - 2014-06-28", "endDate": "2014-06-28", "id": "2014SunW26", "iso": "2014SunW26", "name": "Week 26 - 2014-06-22 - 2014-06-28", + "periodType": "WEEKLY", "startDate": "2014-06-22", }, Object { + "displayName": "Week 27 - 2014-06-29 - 2014-07-05", "endDate": "2014-07-05", "id": "2014SunW27", "iso": "2014SunW27", "name": "Week 27 - 2014-06-29 - 2014-07-05", + "periodType": "WEEKLY", "startDate": "2014-06-29", }, Object { + "displayName": "Week 28 - 2014-07-06 - 2014-07-12", "endDate": "2014-07-12", "id": "2014SunW28", "iso": "2014SunW28", "name": "Week 28 - 2014-07-06 - 2014-07-12", + "periodType": "WEEKLY", "startDate": "2014-07-06", }, Object { + "displayName": "Week 29 - 2014-07-13 - 2014-07-19", "endDate": "2014-07-19", "id": "2014SunW29", "iso": "2014SunW29", "name": "Week 29 - 2014-07-13 - 2014-07-19", + "periodType": "WEEKLY", "startDate": "2014-07-13", }, Object { + "displayName": "Week 30 - 2014-07-20 - 2014-07-26", "endDate": "2014-07-26", "id": "2014SunW30", "iso": "2014SunW30", "name": "Week 30 - 2014-07-20 - 2014-07-26", + "periodType": "WEEKLY", "startDate": "2014-07-20", }, Object { + "displayName": "Week 31 - 2014-07-27 - 2014-08-02", "endDate": "2014-08-02", "id": "2014SunW31", "iso": "2014SunW31", "name": "Week 31 - 2014-07-27 - 2014-08-02", + "periodType": "WEEKLY", "startDate": "2014-07-27", }, Object { + "displayName": "Week 32 - 2014-08-03 - 2014-08-09", "endDate": "2014-08-09", "id": "2014SunW32", "iso": "2014SunW32", "name": "Week 32 - 2014-08-03 - 2014-08-09", + "periodType": "WEEKLY", "startDate": "2014-08-03", }, Object { + "displayName": "Week 33 - 2014-08-10 - 2014-08-16", "endDate": "2014-08-16", "id": "2014SunW33", "iso": "2014SunW33", "name": "Week 33 - 2014-08-10 - 2014-08-16", + "periodType": "WEEKLY", "startDate": "2014-08-10", }, Object { + "displayName": "Week 34 - 2014-08-17 - 2014-08-23", "endDate": "2014-08-23", "id": "2014SunW34", "iso": "2014SunW34", "name": "Week 34 - 2014-08-17 - 2014-08-23", + "periodType": "WEEKLY", "startDate": "2014-08-17", }, Object { + "displayName": "Week 35 - 2014-08-24 - 2014-08-30", "endDate": "2014-08-30", "id": "2014SunW35", "iso": "2014SunW35", "name": "Week 35 - 2014-08-24 - 2014-08-30", + "periodType": "WEEKLY", "startDate": "2014-08-24", }, Object { + "displayName": "Week 36 - 2014-08-31 - 2014-09-06", "endDate": "2014-09-06", "id": "2014SunW36", "iso": "2014SunW36", "name": "Week 36 - 2014-08-31 - 2014-09-06", + "periodType": "WEEKLY", "startDate": "2014-08-31", }, Object { + "displayName": "Week 37 - 2014-09-07 - 2014-09-13", "endDate": "2014-09-13", "id": "2014SunW37", "iso": "2014SunW37", "name": "Week 37 - 2014-09-07 - 2014-09-13", + "periodType": "WEEKLY", "startDate": "2014-09-07", }, Object { + "displayName": "Week 38 - 2014-09-14 - 2014-09-20", "endDate": "2014-09-20", "id": "2014SunW38", "iso": "2014SunW38", "name": "Week 38 - 2014-09-14 - 2014-09-20", + "periodType": "WEEKLY", "startDate": "2014-09-14", }, Object { + "displayName": "Week 39 - 2014-09-21 - 2014-09-27", "endDate": "2014-09-27", "id": "2014SunW39", "iso": "2014SunW39", "name": "Week 39 - 2014-09-21 - 2014-09-27", + "periodType": "WEEKLY", "startDate": "2014-09-21", }, Object { + "displayName": "Week 40 - 2014-09-28 - 2014-10-04", "endDate": "2014-10-04", "id": "2014SunW40", "iso": "2014SunW40", "name": "Week 40 - 2014-09-28 - 2014-10-04", + "periodType": "WEEKLY", "startDate": "2014-09-28", }, Object { + "displayName": "Week 41 - 2014-10-05 - 2014-10-11", "endDate": "2014-10-11", "id": "2014SunW41", "iso": "2014SunW41", "name": "Week 41 - 2014-10-05 - 2014-10-11", + "periodType": "WEEKLY", "startDate": "2014-10-05", }, Object { + "displayName": "Week 42 - 2014-10-12 - 2014-10-18", "endDate": "2014-10-18", "id": "2014SunW42", "iso": "2014SunW42", "name": "Week 42 - 2014-10-12 - 2014-10-18", + "periodType": "WEEKLY", "startDate": "2014-10-12", }, Object { + "displayName": "Week 43 - 2014-10-19 - 2014-10-25", "endDate": "2014-10-25", "id": "2014SunW43", "iso": "2014SunW43", "name": "Week 43 - 2014-10-19 - 2014-10-25", + "periodType": "WEEKLY", "startDate": "2014-10-19", }, Object { + "displayName": "Week 44 - 2014-10-26 - 2014-11-01", "endDate": "2014-11-01", "id": "2014SunW44", "iso": "2014SunW44", "name": "Week 44 - 2014-10-26 - 2014-11-01", + "periodType": "WEEKLY", "startDate": "2014-10-26", }, Object { + "displayName": "Week 45 - 2014-11-02 - 2014-11-08", "endDate": "2014-11-08", "id": "2014SunW45", "iso": "2014SunW45", "name": "Week 45 - 2014-11-02 - 2014-11-08", + "periodType": "WEEKLY", "startDate": "2014-11-02", }, Object { + "displayName": "Week 46 - 2014-11-09 - 2014-11-15", "endDate": "2014-11-15", "id": "2014SunW46", "iso": "2014SunW46", "name": "Week 46 - 2014-11-09 - 2014-11-15", + "periodType": "WEEKLY", "startDate": "2014-11-09", }, Object { + "displayName": "Week 47 - 2014-11-16 - 2014-11-22", "endDate": "2014-11-22", "id": "2014SunW47", "iso": "2014SunW47", "name": "Week 47 - 2014-11-16 - 2014-11-22", + "periodType": "WEEKLY", "startDate": "2014-11-16", }, Object { + "displayName": "Week 48 - 2014-11-23 - 2014-11-29", "endDate": "2014-11-29", "id": "2014SunW48", "iso": "2014SunW48", "name": "Week 48 - 2014-11-23 - 2014-11-29", + "periodType": "WEEKLY", "startDate": "2014-11-23", }, Object { + "displayName": "Week 49 - 2014-11-30 - 2014-12-06", "endDate": "2014-12-06", "id": "2014SunW49", "iso": "2014SunW49", "name": "Week 49 - 2014-11-30 - 2014-12-06", + "periodType": "WEEKLY", "startDate": "2014-11-30", }, Object { + "displayName": "Week 50 - 2014-12-07 - 2014-12-13", "endDate": "2014-12-13", "id": "2014SunW50", "iso": "2014SunW50", "name": "Week 50 - 2014-12-07 - 2014-12-13", + "periodType": "WEEKLY", "startDate": "2014-12-07", }, Object { + "displayName": "Week 51 - 2014-12-14 - 2014-12-20", "endDate": "2014-12-20", "id": "2014SunW51", "iso": "2014SunW51", "name": "Week 51 - 2014-12-14 - 2014-12-20", + "periodType": "WEEKLY", "startDate": "2014-12-14", }, Object { + "displayName": "Week 52 - 2014-12-21 - 2014-12-27", "endDate": "2014-12-27", "id": "2014SunW52", "iso": "2014SunW52", "name": "Week 52 - 2014-12-21 - 2014-12-27", + "periodType": "WEEKLY", "startDate": "2014-12-21", }, Object { + "displayName": "Week 53 - 2014-12-28 - 2015-01-03", "endDate": "2015-01-03", "id": "2014SunW53", "iso": "2014SunW53", "name": "Week 53 - 2014-12-28 - 2015-01-03", + "periodType": "WEEKLY", "startDate": "2014-12-28", }, ], @@ -4404,374 +5672,480 @@ Object { "name": "Weekly (Start Sunday)", "options": Array [ Object { + "displayName": "Week 1 - 2013-12-29 - 2014-01-04", "endDate": "2014-01-04", "id": "2014SunW1", "iso": "2014SunW1", "name": "Week 1 - 2013-12-29 - 2014-01-04", + "periodType": "WEEKLY", "startDate": "2013-12-29", }, Object { + "displayName": "Week 2 - 2014-01-05 - 2014-01-11", "endDate": "2014-01-11", "id": "2014SunW2", "iso": "2014SunW2", "name": "Week 2 - 2014-01-05 - 2014-01-11", + "periodType": "WEEKLY", "startDate": "2014-01-05", }, Object { + "displayName": "Week 3 - 2014-01-12 - 2014-01-18", "endDate": "2014-01-18", "id": "2014SunW3", "iso": "2014SunW3", "name": "Week 3 - 2014-01-12 - 2014-01-18", + "periodType": "WEEKLY", "startDate": "2014-01-12", }, Object { + "displayName": "Week 4 - 2014-01-19 - 2014-01-25", "endDate": "2014-01-25", "id": "2014SunW4", "iso": "2014SunW4", "name": "Week 4 - 2014-01-19 - 2014-01-25", + "periodType": "WEEKLY", "startDate": "2014-01-19", }, Object { + "displayName": "Week 5 - 2014-01-26 - 2014-02-01", "endDate": "2014-02-01", "id": "2014SunW5", "iso": "2014SunW5", "name": "Week 5 - 2014-01-26 - 2014-02-01", + "periodType": "WEEKLY", "startDate": "2014-01-26", }, Object { + "displayName": "Week 6 - 2014-02-02 - 2014-02-08", "endDate": "2014-02-08", "id": "2014SunW6", "iso": "2014SunW6", "name": "Week 6 - 2014-02-02 - 2014-02-08", + "periodType": "WEEKLY", "startDate": "2014-02-02", }, Object { + "displayName": "Week 7 - 2014-02-09 - 2014-02-15", "endDate": "2014-02-15", "id": "2014SunW7", "iso": "2014SunW7", "name": "Week 7 - 2014-02-09 - 2014-02-15", + "periodType": "WEEKLY", "startDate": "2014-02-09", }, Object { + "displayName": "Week 8 - 2014-02-16 - 2014-02-22", "endDate": "2014-02-22", "id": "2014SunW8", "iso": "2014SunW8", "name": "Week 8 - 2014-02-16 - 2014-02-22", + "periodType": "WEEKLY", "startDate": "2014-02-16", }, Object { + "displayName": "Week 9 - 2014-02-23 - 2014-03-01", "endDate": "2014-03-01", "id": "2014SunW9", "iso": "2014SunW9", "name": "Week 9 - 2014-02-23 - 2014-03-01", + "periodType": "WEEKLY", "startDate": "2014-02-23", }, Object { + "displayName": "Week 10 - 2014-03-02 - 2014-03-08", "endDate": "2014-03-08", "id": "2014SunW10", "iso": "2014SunW10", "name": "Week 10 - 2014-03-02 - 2014-03-08", + "periodType": "WEEKLY", "startDate": "2014-03-02", }, Object { + "displayName": "Week 11 - 2014-03-09 - 2014-03-15", "endDate": "2014-03-15", "id": "2014SunW11", "iso": "2014SunW11", "name": "Week 11 - 2014-03-09 - 2014-03-15", + "periodType": "WEEKLY", "startDate": "2014-03-09", }, Object { + "displayName": "Week 12 - 2014-03-16 - 2014-03-22", "endDate": "2014-03-22", "id": "2014SunW12", "iso": "2014SunW12", "name": "Week 12 - 2014-03-16 - 2014-03-22", + "periodType": "WEEKLY", "startDate": "2014-03-16", }, Object { + "displayName": "Week 13 - 2014-03-23 - 2014-03-29", "endDate": "2014-03-29", "id": "2014SunW13", "iso": "2014SunW13", "name": "Week 13 - 2014-03-23 - 2014-03-29", + "periodType": "WEEKLY", "startDate": "2014-03-23", }, Object { + "displayName": "Week 14 - 2014-03-30 - 2014-04-05", "endDate": "2014-04-05", "id": "2014SunW14", "iso": "2014SunW14", "name": "Week 14 - 2014-03-30 - 2014-04-05", + "periodType": "WEEKLY", "startDate": "2014-03-30", }, Object { + "displayName": "Week 15 - 2014-04-06 - 2014-04-12", "endDate": "2014-04-12", "id": "2014SunW15", "iso": "2014SunW15", "name": "Week 15 - 2014-04-06 - 2014-04-12", + "periodType": "WEEKLY", "startDate": "2014-04-06", }, Object { + "displayName": "Week 16 - 2014-04-13 - 2014-04-19", "endDate": "2014-04-19", "id": "2014SunW16", "iso": "2014SunW16", "name": "Week 16 - 2014-04-13 - 2014-04-19", + "periodType": "WEEKLY", "startDate": "2014-04-13", }, Object { + "displayName": "Week 17 - 2014-04-20 - 2014-04-26", "endDate": "2014-04-26", "id": "2014SunW17", "iso": "2014SunW17", "name": "Week 17 - 2014-04-20 - 2014-04-26", + "periodType": "WEEKLY", "startDate": "2014-04-20", }, Object { + "displayName": "Week 18 - 2014-04-27 - 2014-05-03", "endDate": "2014-05-03", "id": "2014SunW18", "iso": "2014SunW18", "name": "Week 18 - 2014-04-27 - 2014-05-03", + "periodType": "WEEKLY", "startDate": "2014-04-27", }, Object { + "displayName": "Week 19 - 2014-05-04 - 2014-05-10", "endDate": "2014-05-10", "id": "2014SunW19", "iso": "2014SunW19", "name": "Week 19 - 2014-05-04 - 2014-05-10", + "periodType": "WEEKLY", "startDate": "2014-05-04", }, Object { + "displayName": "Week 20 - 2014-05-11 - 2014-05-17", "endDate": "2014-05-17", "id": "2014SunW20", "iso": "2014SunW20", "name": "Week 20 - 2014-05-11 - 2014-05-17", + "periodType": "WEEKLY", "startDate": "2014-05-11", }, Object { + "displayName": "Week 21 - 2014-05-18 - 2014-05-24", "endDate": "2014-05-24", "id": "2014SunW21", "iso": "2014SunW21", "name": "Week 21 - 2014-05-18 - 2014-05-24", + "periodType": "WEEKLY", "startDate": "2014-05-18", }, Object { + "displayName": "Week 22 - 2014-05-25 - 2014-05-31", "endDate": "2014-05-31", "id": "2014SunW22", "iso": "2014SunW22", "name": "Week 22 - 2014-05-25 - 2014-05-31", + "periodType": "WEEKLY", "startDate": "2014-05-25", }, Object { + "displayName": "Week 23 - 2014-06-01 - 2014-06-07", "endDate": "2014-06-07", "id": "2014SunW23", "iso": "2014SunW23", "name": "Week 23 - 2014-06-01 - 2014-06-07", + "periodType": "WEEKLY", "startDate": "2014-06-01", }, Object { + "displayName": "Week 24 - 2014-06-08 - 2014-06-14", "endDate": "2014-06-14", "id": "2014SunW24", "iso": "2014SunW24", "name": "Week 24 - 2014-06-08 - 2014-06-14", + "periodType": "WEEKLY", "startDate": "2014-06-08", }, Object { + "displayName": "Week 25 - 2014-06-15 - 2014-06-21", "endDate": "2014-06-21", "id": "2014SunW25", "iso": "2014SunW25", "name": "Week 25 - 2014-06-15 - 2014-06-21", + "periodType": "WEEKLY", "startDate": "2014-06-15", }, Object { + "displayName": "Week 26 - 2014-06-22 - 2014-06-28", "endDate": "2014-06-28", "id": "2014SunW26", "iso": "2014SunW26", "name": "Week 26 - 2014-06-22 - 2014-06-28", + "periodType": "WEEKLY", "startDate": "2014-06-22", }, Object { + "displayName": "Week 27 - 2014-06-29 - 2014-07-05", "endDate": "2014-07-05", "id": "2014SunW27", "iso": "2014SunW27", "name": "Week 27 - 2014-06-29 - 2014-07-05", + "periodType": "WEEKLY", "startDate": "2014-06-29", }, Object { + "displayName": "Week 28 - 2014-07-06 - 2014-07-12", "endDate": "2014-07-12", "id": "2014SunW28", "iso": "2014SunW28", "name": "Week 28 - 2014-07-06 - 2014-07-12", + "periodType": "WEEKLY", "startDate": "2014-07-06", }, Object { + "displayName": "Week 29 - 2014-07-13 - 2014-07-19", "endDate": "2014-07-19", "id": "2014SunW29", "iso": "2014SunW29", "name": "Week 29 - 2014-07-13 - 2014-07-19", + "periodType": "WEEKLY", "startDate": "2014-07-13", }, Object { + "displayName": "Week 30 - 2014-07-20 - 2014-07-26", "endDate": "2014-07-26", "id": "2014SunW30", "iso": "2014SunW30", "name": "Week 30 - 2014-07-20 - 2014-07-26", + "periodType": "WEEKLY", "startDate": "2014-07-20", }, Object { + "displayName": "Week 31 - 2014-07-27 - 2014-08-02", "endDate": "2014-08-02", "id": "2014SunW31", "iso": "2014SunW31", "name": "Week 31 - 2014-07-27 - 2014-08-02", + "periodType": "WEEKLY", "startDate": "2014-07-27", }, Object { + "displayName": "Week 32 - 2014-08-03 - 2014-08-09", "endDate": "2014-08-09", "id": "2014SunW32", "iso": "2014SunW32", "name": "Week 32 - 2014-08-03 - 2014-08-09", + "periodType": "WEEKLY", "startDate": "2014-08-03", }, Object { + "displayName": "Week 33 - 2014-08-10 - 2014-08-16", "endDate": "2014-08-16", "id": "2014SunW33", "iso": "2014SunW33", "name": "Week 33 - 2014-08-10 - 2014-08-16", + "periodType": "WEEKLY", "startDate": "2014-08-10", }, Object { + "displayName": "Week 34 - 2014-08-17 - 2014-08-23", "endDate": "2014-08-23", "id": "2014SunW34", "iso": "2014SunW34", "name": "Week 34 - 2014-08-17 - 2014-08-23", + "periodType": "WEEKLY", "startDate": "2014-08-17", }, Object { + "displayName": "Week 35 - 2014-08-24 - 2014-08-30", "endDate": "2014-08-30", "id": "2014SunW35", "iso": "2014SunW35", "name": "Week 35 - 2014-08-24 - 2014-08-30", + "periodType": "WEEKLY", "startDate": "2014-08-24", }, Object { + "displayName": "Week 36 - 2014-08-31 - 2014-09-06", "endDate": "2014-09-06", "id": "2014SunW36", "iso": "2014SunW36", "name": "Week 36 - 2014-08-31 - 2014-09-06", + "periodType": "WEEKLY", "startDate": "2014-08-31", }, Object { + "displayName": "Week 37 - 2014-09-07 - 2014-09-13", "endDate": "2014-09-13", "id": "2014SunW37", "iso": "2014SunW37", "name": "Week 37 - 2014-09-07 - 2014-09-13", + "periodType": "WEEKLY", "startDate": "2014-09-07", }, Object { + "displayName": "Week 38 - 2014-09-14 - 2014-09-20", "endDate": "2014-09-20", "id": "2014SunW38", "iso": "2014SunW38", "name": "Week 38 - 2014-09-14 - 2014-09-20", + "periodType": "WEEKLY", "startDate": "2014-09-14", }, Object { + "displayName": "Week 39 - 2014-09-21 - 2014-09-27", "endDate": "2014-09-27", "id": "2014SunW39", "iso": "2014SunW39", "name": "Week 39 - 2014-09-21 - 2014-09-27", + "periodType": "WEEKLY", "startDate": "2014-09-21", }, Object { + "displayName": "Week 40 - 2014-09-28 - 2014-10-04", "endDate": "2014-10-04", "id": "2014SunW40", "iso": "2014SunW40", "name": "Week 40 - 2014-09-28 - 2014-10-04", + "periodType": "WEEKLY", "startDate": "2014-09-28", }, Object { + "displayName": "Week 41 - 2014-10-05 - 2014-10-11", "endDate": "2014-10-11", "id": "2014SunW41", "iso": "2014SunW41", "name": "Week 41 - 2014-10-05 - 2014-10-11", + "periodType": "WEEKLY", "startDate": "2014-10-05", }, Object { + "displayName": "Week 42 - 2014-10-12 - 2014-10-18", "endDate": "2014-10-18", "id": "2014SunW42", "iso": "2014SunW42", "name": "Week 42 - 2014-10-12 - 2014-10-18", + "periodType": "WEEKLY", "startDate": "2014-10-12", }, Object { + "displayName": "Week 43 - 2014-10-19 - 2014-10-25", "endDate": "2014-10-25", "id": "2014SunW43", "iso": "2014SunW43", "name": "Week 43 - 2014-10-19 - 2014-10-25", + "periodType": "WEEKLY", "startDate": "2014-10-19", }, Object { + "displayName": "Week 44 - 2014-10-26 - 2014-11-01", "endDate": "2014-11-01", "id": "2014SunW44", "iso": "2014SunW44", "name": "Week 44 - 2014-10-26 - 2014-11-01", + "periodType": "WEEKLY", "startDate": "2014-10-26", }, Object { + "displayName": "Week 45 - 2014-11-02 - 2014-11-08", "endDate": "2014-11-08", "id": "2014SunW45", "iso": "2014SunW45", "name": "Week 45 - 2014-11-02 - 2014-11-08", + "periodType": "WEEKLY", "startDate": "2014-11-02", }, Object { + "displayName": "Week 46 - 2014-11-09 - 2014-11-15", "endDate": "2014-11-15", "id": "2014SunW46", "iso": "2014SunW46", "name": "Week 46 - 2014-11-09 - 2014-11-15", + "periodType": "WEEKLY", "startDate": "2014-11-09", }, Object { + "displayName": "Week 47 - 2014-11-16 - 2014-11-22", "endDate": "2014-11-22", "id": "2014SunW47", "iso": "2014SunW47", "name": "Week 47 - 2014-11-16 - 2014-11-22", + "periodType": "WEEKLY", "startDate": "2014-11-16", }, Object { + "displayName": "Week 48 - 2014-11-23 - 2014-11-29", "endDate": "2014-11-29", "id": "2014SunW48", "iso": "2014SunW48", "name": "Week 48 - 2014-11-23 - 2014-11-29", + "periodType": "WEEKLY", "startDate": "2014-11-23", }, Object { + "displayName": "Week 49 - 2014-11-30 - 2014-12-06", "endDate": "2014-12-06", "id": "2014SunW49", "iso": "2014SunW49", "name": "Week 49 - 2014-11-30 - 2014-12-06", + "periodType": "WEEKLY", "startDate": "2014-11-30", }, Object { + "displayName": "Week 50 - 2014-12-07 - 2014-12-13", "endDate": "2014-12-13", "id": "2014SunW50", "iso": "2014SunW50", "name": "Week 50 - 2014-12-07 - 2014-12-13", + "periodType": "WEEKLY", "startDate": "2014-12-07", }, Object { + "displayName": "Week 51 - 2014-12-14 - 2014-12-20", "endDate": "2014-12-20", "id": "2014SunW51", "iso": "2014SunW51", "name": "Week 51 - 2014-12-14 - 2014-12-20", + "periodType": "WEEKLY", "startDate": "2014-12-14", }, Object { + "displayName": "Week 52 - 2014-12-21 - 2014-12-27", "endDate": "2014-12-27", "id": "2014SunW52", "iso": "2014SunW52", "name": "Week 52 - 2014-12-21 - 2014-12-27", + "periodType": "WEEKLY", "startDate": "2014-12-21", }, Object { + "displayName": "Week 53 - 2014-12-28 - 2015-01-03", "endDate": "2015-01-03", "id": "2014SunW53", "iso": "2014SunW53", "name": "Week 53 - 2014-12-28 - 2015-01-03", + "periodType": "WEEKLY", "startDate": "2014-12-28", }, ], @@ -4785,367 +6159,471 @@ Object { "name": "Weekly (Start Thursday)", "options": Array [ Object { + "displayName": "Week 1 - 2014-01-02 - 2014-01-08", "endDate": "2014-01-08", "id": "2014ThuW1", "iso": "2014ThuW1", "name": "Week 1 - 2014-01-02 - 2014-01-08", + "periodType": "WEEKLY", "startDate": "2014-01-02", }, Object { + "displayName": "Week 2 - 2014-01-09 - 2014-01-15", "endDate": "2014-01-15", "id": "2014ThuW2", "iso": "2014ThuW2", "name": "Week 2 - 2014-01-09 - 2014-01-15", + "periodType": "WEEKLY", "startDate": "2014-01-09", }, Object { + "displayName": "Week 3 - 2014-01-16 - 2014-01-22", "endDate": "2014-01-22", "id": "2014ThuW3", "iso": "2014ThuW3", "name": "Week 3 - 2014-01-16 - 2014-01-22", + "periodType": "WEEKLY", "startDate": "2014-01-16", }, Object { + "displayName": "Week 4 - 2014-01-23 - 2014-01-29", "endDate": "2014-01-29", "id": "2014ThuW4", "iso": "2014ThuW4", "name": "Week 4 - 2014-01-23 - 2014-01-29", + "periodType": "WEEKLY", "startDate": "2014-01-23", }, Object { + "displayName": "Week 5 - 2014-01-30 - 2014-02-05", "endDate": "2014-02-05", "id": "2014ThuW5", "iso": "2014ThuW5", "name": "Week 5 - 2014-01-30 - 2014-02-05", + "periodType": "WEEKLY", "startDate": "2014-01-30", }, Object { + "displayName": "Week 6 - 2014-02-06 - 2014-02-12", "endDate": "2014-02-12", "id": "2014ThuW6", "iso": "2014ThuW6", "name": "Week 6 - 2014-02-06 - 2014-02-12", + "periodType": "WEEKLY", "startDate": "2014-02-06", }, Object { + "displayName": "Week 7 - 2014-02-13 - 2014-02-19", "endDate": "2014-02-19", "id": "2014ThuW7", "iso": "2014ThuW7", "name": "Week 7 - 2014-02-13 - 2014-02-19", + "periodType": "WEEKLY", "startDate": "2014-02-13", }, Object { + "displayName": "Week 8 - 2014-02-20 - 2014-02-26", "endDate": "2014-02-26", "id": "2014ThuW8", "iso": "2014ThuW8", "name": "Week 8 - 2014-02-20 - 2014-02-26", + "periodType": "WEEKLY", "startDate": "2014-02-20", }, Object { + "displayName": "Week 9 - 2014-02-27 - 2014-03-05", "endDate": "2014-03-05", "id": "2014ThuW9", "iso": "2014ThuW9", "name": "Week 9 - 2014-02-27 - 2014-03-05", + "periodType": "WEEKLY", "startDate": "2014-02-27", }, Object { + "displayName": "Week 10 - 2014-03-06 - 2014-03-12", "endDate": "2014-03-12", "id": "2014ThuW10", "iso": "2014ThuW10", "name": "Week 10 - 2014-03-06 - 2014-03-12", + "periodType": "WEEKLY", "startDate": "2014-03-06", }, Object { + "displayName": "Week 11 - 2014-03-13 - 2014-03-19", "endDate": "2014-03-19", "id": "2014ThuW11", "iso": "2014ThuW11", "name": "Week 11 - 2014-03-13 - 2014-03-19", + "periodType": "WEEKLY", "startDate": "2014-03-13", }, Object { + "displayName": "Week 12 - 2014-03-20 - 2014-03-26", "endDate": "2014-03-26", "id": "2014ThuW12", "iso": "2014ThuW12", "name": "Week 12 - 2014-03-20 - 2014-03-26", + "periodType": "WEEKLY", "startDate": "2014-03-20", }, Object { + "displayName": "Week 13 - 2014-03-27 - 2014-04-02", "endDate": "2014-04-02", "id": "2014ThuW13", "iso": "2014ThuW13", "name": "Week 13 - 2014-03-27 - 2014-04-02", + "periodType": "WEEKLY", "startDate": "2014-03-27", }, Object { + "displayName": "Week 14 - 2014-04-03 - 2014-04-09", "endDate": "2014-04-09", "id": "2014ThuW14", "iso": "2014ThuW14", "name": "Week 14 - 2014-04-03 - 2014-04-09", + "periodType": "WEEKLY", "startDate": "2014-04-03", }, Object { + "displayName": "Week 15 - 2014-04-10 - 2014-04-16", "endDate": "2014-04-16", "id": "2014ThuW15", "iso": "2014ThuW15", "name": "Week 15 - 2014-04-10 - 2014-04-16", + "periodType": "WEEKLY", "startDate": "2014-04-10", }, Object { + "displayName": "Week 16 - 2014-04-17 - 2014-04-23", "endDate": "2014-04-23", "id": "2014ThuW16", "iso": "2014ThuW16", "name": "Week 16 - 2014-04-17 - 2014-04-23", + "periodType": "WEEKLY", "startDate": "2014-04-17", }, Object { + "displayName": "Week 17 - 2014-04-24 - 2014-04-30", "endDate": "2014-04-30", "id": "2014ThuW17", "iso": "2014ThuW17", "name": "Week 17 - 2014-04-24 - 2014-04-30", + "periodType": "WEEKLY", "startDate": "2014-04-24", }, Object { + "displayName": "Week 18 - 2014-05-01 - 2014-05-07", "endDate": "2014-05-07", "id": "2014ThuW18", "iso": "2014ThuW18", "name": "Week 18 - 2014-05-01 - 2014-05-07", + "periodType": "WEEKLY", "startDate": "2014-05-01", }, Object { + "displayName": "Week 19 - 2014-05-08 - 2014-05-14", "endDate": "2014-05-14", "id": "2014ThuW19", "iso": "2014ThuW19", "name": "Week 19 - 2014-05-08 - 2014-05-14", + "periodType": "WEEKLY", "startDate": "2014-05-08", }, Object { + "displayName": "Week 20 - 2014-05-15 - 2014-05-21", "endDate": "2014-05-21", "id": "2014ThuW20", "iso": "2014ThuW20", "name": "Week 20 - 2014-05-15 - 2014-05-21", + "periodType": "WEEKLY", "startDate": "2014-05-15", }, Object { + "displayName": "Week 21 - 2014-05-22 - 2014-05-28", "endDate": "2014-05-28", "id": "2014ThuW21", "iso": "2014ThuW21", "name": "Week 21 - 2014-05-22 - 2014-05-28", + "periodType": "WEEKLY", "startDate": "2014-05-22", }, Object { + "displayName": "Week 22 - 2014-05-29 - 2014-06-04", "endDate": "2014-06-04", "id": "2014ThuW22", "iso": "2014ThuW22", "name": "Week 22 - 2014-05-29 - 2014-06-04", + "periodType": "WEEKLY", "startDate": "2014-05-29", }, Object { + "displayName": "Week 23 - 2014-06-05 - 2014-06-11", "endDate": "2014-06-11", "id": "2014ThuW23", "iso": "2014ThuW23", "name": "Week 23 - 2014-06-05 - 2014-06-11", + "periodType": "WEEKLY", "startDate": "2014-06-05", }, Object { + "displayName": "Week 24 - 2014-06-12 - 2014-06-18", "endDate": "2014-06-18", "id": "2014ThuW24", "iso": "2014ThuW24", "name": "Week 24 - 2014-06-12 - 2014-06-18", + "periodType": "WEEKLY", "startDate": "2014-06-12", }, Object { + "displayName": "Week 25 - 2014-06-19 - 2014-06-25", "endDate": "2014-06-25", "id": "2014ThuW25", "iso": "2014ThuW25", "name": "Week 25 - 2014-06-19 - 2014-06-25", + "periodType": "WEEKLY", "startDate": "2014-06-19", }, Object { + "displayName": "Week 26 - 2014-06-26 - 2014-07-02", "endDate": "2014-07-02", "id": "2014ThuW26", "iso": "2014ThuW26", "name": "Week 26 - 2014-06-26 - 2014-07-02", + "periodType": "WEEKLY", "startDate": "2014-06-26", }, Object { + "displayName": "Week 27 - 2014-07-03 - 2014-07-09", "endDate": "2014-07-09", "id": "2014ThuW27", "iso": "2014ThuW27", "name": "Week 27 - 2014-07-03 - 2014-07-09", + "periodType": "WEEKLY", "startDate": "2014-07-03", }, Object { + "displayName": "Week 28 - 2014-07-10 - 2014-07-16", "endDate": "2014-07-16", "id": "2014ThuW28", "iso": "2014ThuW28", "name": "Week 28 - 2014-07-10 - 2014-07-16", + "periodType": "WEEKLY", "startDate": "2014-07-10", }, Object { + "displayName": "Week 29 - 2014-07-17 - 2014-07-23", "endDate": "2014-07-23", "id": "2014ThuW29", "iso": "2014ThuW29", "name": "Week 29 - 2014-07-17 - 2014-07-23", + "periodType": "WEEKLY", "startDate": "2014-07-17", }, Object { + "displayName": "Week 30 - 2014-07-24 - 2014-07-30", "endDate": "2014-07-30", "id": "2014ThuW30", "iso": "2014ThuW30", "name": "Week 30 - 2014-07-24 - 2014-07-30", + "periodType": "WEEKLY", "startDate": "2014-07-24", }, Object { + "displayName": "Week 31 - 2014-07-31 - 2014-08-06", "endDate": "2014-08-06", "id": "2014ThuW31", "iso": "2014ThuW31", "name": "Week 31 - 2014-07-31 - 2014-08-06", + "periodType": "WEEKLY", "startDate": "2014-07-31", }, Object { + "displayName": "Week 32 - 2014-08-07 - 2014-08-13", "endDate": "2014-08-13", "id": "2014ThuW32", "iso": "2014ThuW32", "name": "Week 32 - 2014-08-07 - 2014-08-13", + "periodType": "WEEKLY", "startDate": "2014-08-07", }, Object { + "displayName": "Week 33 - 2014-08-14 - 2014-08-20", "endDate": "2014-08-20", "id": "2014ThuW33", "iso": "2014ThuW33", "name": "Week 33 - 2014-08-14 - 2014-08-20", + "periodType": "WEEKLY", "startDate": "2014-08-14", }, Object { + "displayName": "Week 34 - 2014-08-21 - 2014-08-27", "endDate": "2014-08-27", "id": "2014ThuW34", "iso": "2014ThuW34", "name": "Week 34 - 2014-08-21 - 2014-08-27", + "periodType": "WEEKLY", "startDate": "2014-08-21", }, Object { + "displayName": "Week 35 - 2014-08-28 - 2014-09-03", "endDate": "2014-09-03", "id": "2014ThuW35", "iso": "2014ThuW35", "name": "Week 35 - 2014-08-28 - 2014-09-03", + "periodType": "WEEKLY", "startDate": "2014-08-28", }, Object { + "displayName": "Week 36 - 2014-09-04 - 2014-09-10", "endDate": "2014-09-10", "id": "2014ThuW36", "iso": "2014ThuW36", "name": "Week 36 - 2014-09-04 - 2014-09-10", + "periodType": "WEEKLY", "startDate": "2014-09-04", }, Object { + "displayName": "Week 37 - 2014-09-11 - 2014-09-17", "endDate": "2014-09-17", "id": "2014ThuW37", "iso": "2014ThuW37", "name": "Week 37 - 2014-09-11 - 2014-09-17", + "periodType": "WEEKLY", "startDate": "2014-09-11", }, Object { + "displayName": "Week 38 - 2014-09-18 - 2014-09-24", "endDate": "2014-09-24", "id": "2014ThuW38", "iso": "2014ThuW38", "name": "Week 38 - 2014-09-18 - 2014-09-24", + "periodType": "WEEKLY", "startDate": "2014-09-18", }, Object { + "displayName": "Week 39 - 2014-09-25 - 2014-10-01", "endDate": "2014-10-01", "id": "2014ThuW39", "iso": "2014ThuW39", "name": "Week 39 - 2014-09-25 - 2014-10-01", + "periodType": "WEEKLY", "startDate": "2014-09-25", }, Object { + "displayName": "Week 40 - 2014-10-02 - 2014-10-08", "endDate": "2014-10-08", "id": "2014ThuW40", "iso": "2014ThuW40", "name": "Week 40 - 2014-10-02 - 2014-10-08", + "periodType": "WEEKLY", "startDate": "2014-10-02", }, Object { + "displayName": "Week 41 - 2014-10-09 - 2014-10-15", "endDate": "2014-10-15", "id": "2014ThuW41", "iso": "2014ThuW41", "name": "Week 41 - 2014-10-09 - 2014-10-15", + "periodType": "WEEKLY", "startDate": "2014-10-09", }, Object { + "displayName": "Week 42 - 2014-10-16 - 2014-10-22", "endDate": "2014-10-22", "id": "2014ThuW42", "iso": "2014ThuW42", "name": "Week 42 - 2014-10-16 - 2014-10-22", + "periodType": "WEEKLY", "startDate": "2014-10-16", }, Object { + "displayName": "Week 43 - 2014-10-23 - 2014-10-29", "endDate": "2014-10-29", "id": "2014ThuW43", "iso": "2014ThuW43", "name": "Week 43 - 2014-10-23 - 2014-10-29", + "periodType": "WEEKLY", "startDate": "2014-10-23", }, Object { + "displayName": "Week 44 - 2014-10-30 - 2014-11-05", "endDate": "2014-11-05", "id": "2014ThuW44", "iso": "2014ThuW44", "name": "Week 44 - 2014-10-30 - 2014-11-05", + "periodType": "WEEKLY", "startDate": "2014-10-30", }, Object { + "displayName": "Week 45 - 2014-11-06 - 2014-11-12", "endDate": "2014-11-12", "id": "2014ThuW45", "iso": "2014ThuW45", "name": "Week 45 - 2014-11-06 - 2014-11-12", + "periodType": "WEEKLY", "startDate": "2014-11-06", }, Object { + "displayName": "Week 46 - 2014-11-13 - 2014-11-19", "endDate": "2014-11-19", "id": "2014ThuW46", "iso": "2014ThuW46", "name": "Week 46 - 2014-11-13 - 2014-11-19", + "periodType": "WEEKLY", "startDate": "2014-11-13", }, Object { + "displayName": "Week 47 - 2014-11-20 - 2014-11-26", "endDate": "2014-11-26", "id": "2014ThuW47", "iso": "2014ThuW47", "name": "Week 47 - 2014-11-20 - 2014-11-26", + "periodType": "WEEKLY", "startDate": "2014-11-20", }, Object { + "displayName": "Week 48 - 2014-11-27 - 2014-12-03", "endDate": "2014-12-03", "id": "2014ThuW48", "iso": "2014ThuW48", "name": "Week 48 - 2014-11-27 - 2014-12-03", + "periodType": "WEEKLY", "startDate": "2014-11-27", }, Object { + "displayName": "Week 49 - 2014-12-04 - 2014-12-10", "endDate": "2014-12-10", "id": "2014ThuW49", "iso": "2014ThuW49", "name": "Week 49 - 2014-12-04 - 2014-12-10", + "periodType": "WEEKLY", "startDate": "2014-12-04", }, Object { + "displayName": "Week 50 - 2014-12-11 - 2014-12-17", "endDate": "2014-12-17", "id": "2014ThuW50", "iso": "2014ThuW50", "name": "Week 50 - 2014-12-11 - 2014-12-17", + "periodType": "WEEKLY", "startDate": "2014-12-11", }, Object { + "displayName": "Week 51 - 2014-12-18 - 2014-12-24", "endDate": "2014-12-24", "id": "2014ThuW51", "iso": "2014ThuW51", "name": "Week 51 - 2014-12-18 - 2014-12-24", + "periodType": "WEEKLY", "startDate": "2014-12-18", }, Object { + "displayName": "Week 52 - 2014-12-25 - 2014-12-31", "endDate": "2014-12-31", "id": "2014ThuW52", "iso": "2014ThuW52", "name": "Week 52 - 2014-12-25 - 2014-12-31", + "periodType": "WEEKLY", "startDate": "2014-12-25", }, ], @@ -5159,367 +6637,471 @@ Object { "name": "Weekly (Start Wednesday)", "options": Array [ Object { + "displayName": "Week 1 - 2014-01-01 - 2014-01-07", "endDate": "2014-01-07", "id": "2014WedW1", "iso": "2014WedW1", "name": "Week 1 - 2014-01-01 - 2014-01-07", + "periodType": "WEEKLY", "startDate": "2014-01-01", }, Object { + "displayName": "Week 2 - 2014-01-08 - 2014-01-14", "endDate": "2014-01-14", "id": "2014WedW2", "iso": "2014WedW2", "name": "Week 2 - 2014-01-08 - 2014-01-14", + "periodType": "WEEKLY", "startDate": "2014-01-08", }, Object { + "displayName": "Week 3 - 2014-01-15 - 2014-01-21", "endDate": "2014-01-21", "id": "2014WedW3", "iso": "2014WedW3", "name": "Week 3 - 2014-01-15 - 2014-01-21", + "periodType": "WEEKLY", "startDate": "2014-01-15", }, Object { + "displayName": "Week 4 - 2014-01-22 - 2014-01-28", "endDate": "2014-01-28", "id": "2014WedW4", "iso": "2014WedW4", "name": "Week 4 - 2014-01-22 - 2014-01-28", + "periodType": "WEEKLY", "startDate": "2014-01-22", }, Object { + "displayName": "Week 5 - 2014-01-29 - 2014-02-04", "endDate": "2014-02-04", "id": "2014WedW5", "iso": "2014WedW5", "name": "Week 5 - 2014-01-29 - 2014-02-04", + "periodType": "WEEKLY", "startDate": "2014-01-29", }, Object { + "displayName": "Week 6 - 2014-02-05 - 2014-02-11", "endDate": "2014-02-11", "id": "2014WedW6", "iso": "2014WedW6", "name": "Week 6 - 2014-02-05 - 2014-02-11", + "periodType": "WEEKLY", "startDate": "2014-02-05", }, Object { + "displayName": "Week 7 - 2014-02-12 - 2014-02-18", "endDate": "2014-02-18", "id": "2014WedW7", "iso": "2014WedW7", "name": "Week 7 - 2014-02-12 - 2014-02-18", + "periodType": "WEEKLY", "startDate": "2014-02-12", }, Object { + "displayName": "Week 8 - 2014-02-19 - 2014-02-25", "endDate": "2014-02-25", "id": "2014WedW8", "iso": "2014WedW8", "name": "Week 8 - 2014-02-19 - 2014-02-25", + "periodType": "WEEKLY", "startDate": "2014-02-19", }, Object { + "displayName": "Week 9 - 2014-02-26 - 2014-03-04", "endDate": "2014-03-04", "id": "2014WedW9", "iso": "2014WedW9", "name": "Week 9 - 2014-02-26 - 2014-03-04", + "periodType": "WEEKLY", "startDate": "2014-02-26", }, Object { + "displayName": "Week 10 - 2014-03-05 - 2014-03-11", "endDate": "2014-03-11", "id": "2014WedW10", "iso": "2014WedW10", "name": "Week 10 - 2014-03-05 - 2014-03-11", + "periodType": "WEEKLY", "startDate": "2014-03-05", }, Object { + "displayName": "Week 11 - 2014-03-12 - 2014-03-18", "endDate": "2014-03-18", "id": "2014WedW11", "iso": "2014WedW11", "name": "Week 11 - 2014-03-12 - 2014-03-18", + "periodType": "WEEKLY", "startDate": "2014-03-12", }, Object { + "displayName": "Week 12 - 2014-03-19 - 2014-03-25", "endDate": "2014-03-25", "id": "2014WedW12", "iso": "2014WedW12", "name": "Week 12 - 2014-03-19 - 2014-03-25", + "periodType": "WEEKLY", "startDate": "2014-03-19", }, Object { + "displayName": "Week 13 - 2014-03-26 - 2014-04-01", "endDate": "2014-04-01", "id": "2014WedW13", "iso": "2014WedW13", "name": "Week 13 - 2014-03-26 - 2014-04-01", + "periodType": "WEEKLY", "startDate": "2014-03-26", }, Object { + "displayName": "Week 14 - 2014-04-02 - 2014-04-08", "endDate": "2014-04-08", "id": "2014WedW14", "iso": "2014WedW14", "name": "Week 14 - 2014-04-02 - 2014-04-08", + "periodType": "WEEKLY", "startDate": "2014-04-02", }, Object { + "displayName": "Week 15 - 2014-04-09 - 2014-04-15", "endDate": "2014-04-15", "id": "2014WedW15", "iso": "2014WedW15", "name": "Week 15 - 2014-04-09 - 2014-04-15", + "periodType": "WEEKLY", "startDate": "2014-04-09", }, Object { + "displayName": "Week 16 - 2014-04-16 - 2014-04-22", "endDate": "2014-04-22", "id": "2014WedW16", "iso": "2014WedW16", "name": "Week 16 - 2014-04-16 - 2014-04-22", + "periodType": "WEEKLY", "startDate": "2014-04-16", }, Object { + "displayName": "Week 17 - 2014-04-23 - 2014-04-29", "endDate": "2014-04-29", "id": "2014WedW17", "iso": "2014WedW17", "name": "Week 17 - 2014-04-23 - 2014-04-29", + "periodType": "WEEKLY", "startDate": "2014-04-23", }, Object { + "displayName": "Week 18 - 2014-04-30 - 2014-05-06", "endDate": "2014-05-06", "id": "2014WedW18", "iso": "2014WedW18", "name": "Week 18 - 2014-04-30 - 2014-05-06", + "periodType": "WEEKLY", "startDate": "2014-04-30", }, Object { + "displayName": "Week 19 - 2014-05-07 - 2014-05-13", "endDate": "2014-05-13", "id": "2014WedW19", "iso": "2014WedW19", "name": "Week 19 - 2014-05-07 - 2014-05-13", + "periodType": "WEEKLY", "startDate": "2014-05-07", }, Object { + "displayName": "Week 20 - 2014-05-14 - 2014-05-20", "endDate": "2014-05-20", "id": "2014WedW20", "iso": "2014WedW20", "name": "Week 20 - 2014-05-14 - 2014-05-20", + "periodType": "WEEKLY", "startDate": "2014-05-14", }, Object { + "displayName": "Week 21 - 2014-05-21 - 2014-05-27", "endDate": "2014-05-27", "id": "2014WedW21", "iso": "2014WedW21", "name": "Week 21 - 2014-05-21 - 2014-05-27", + "periodType": "WEEKLY", "startDate": "2014-05-21", }, Object { + "displayName": "Week 22 - 2014-05-28 - 2014-06-03", "endDate": "2014-06-03", "id": "2014WedW22", "iso": "2014WedW22", "name": "Week 22 - 2014-05-28 - 2014-06-03", + "periodType": "WEEKLY", "startDate": "2014-05-28", }, Object { + "displayName": "Week 23 - 2014-06-04 - 2014-06-10", "endDate": "2014-06-10", "id": "2014WedW23", "iso": "2014WedW23", "name": "Week 23 - 2014-06-04 - 2014-06-10", + "periodType": "WEEKLY", "startDate": "2014-06-04", }, Object { + "displayName": "Week 24 - 2014-06-11 - 2014-06-17", "endDate": "2014-06-17", "id": "2014WedW24", "iso": "2014WedW24", "name": "Week 24 - 2014-06-11 - 2014-06-17", + "periodType": "WEEKLY", "startDate": "2014-06-11", }, Object { + "displayName": "Week 25 - 2014-06-18 - 2014-06-24", "endDate": "2014-06-24", "id": "2014WedW25", "iso": "2014WedW25", "name": "Week 25 - 2014-06-18 - 2014-06-24", + "periodType": "WEEKLY", "startDate": "2014-06-18", }, Object { + "displayName": "Week 26 - 2014-06-25 - 2014-07-01", "endDate": "2014-07-01", "id": "2014WedW26", "iso": "2014WedW26", "name": "Week 26 - 2014-06-25 - 2014-07-01", + "periodType": "WEEKLY", "startDate": "2014-06-25", }, Object { + "displayName": "Week 27 - 2014-07-02 - 2014-07-08", "endDate": "2014-07-08", "id": "2014WedW27", "iso": "2014WedW27", "name": "Week 27 - 2014-07-02 - 2014-07-08", + "periodType": "WEEKLY", "startDate": "2014-07-02", }, Object { + "displayName": "Week 28 - 2014-07-09 - 2014-07-15", "endDate": "2014-07-15", "id": "2014WedW28", "iso": "2014WedW28", "name": "Week 28 - 2014-07-09 - 2014-07-15", + "periodType": "WEEKLY", "startDate": "2014-07-09", }, Object { + "displayName": "Week 29 - 2014-07-16 - 2014-07-22", "endDate": "2014-07-22", "id": "2014WedW29", "iso": "2014WedW29", "name": "Week 29 - 2014-07-16 - 2014-07-22", + "periodType": "WEEKLY", "startDate": "2014-07-16", }, Object { + "displayName": "Week 30 - 2014-07-23 - 2014-07-29", "endDate": "2014-07-29", "id": "2014WedW30", "iso": "2014WedW30", "name": "Week 30 - 2014-07-23 - 2014-07-29", + "periodType": "WEEKLY", "startDate": "2014-07-23", }, Object { + "displayName": "Week 31 - 2014-07-30 - 2014-08-05", "endDate": "2014-08-05", "id": "2014WedW31", "iso": "2014WedW31", "name": "Week 31 - 2014-07-30 - 2014-08-05", + "periodType": "WEEKLY", "startDate": "2014-07-30", }, Object { + "displayName": "Week 32 - 2014-08-06 - 2014-08-12", "endDate": "2014-08-12", "id": "2014WedW32", "iso": "2014WedW32", "name": "Week 32 - 2014-08-06 - 2014-08-12", + "periodType": "WEEKLY", "startDate": "2014-08-06", }, Object { + "displayName": "Week 33 - 2014-08-13 - 2014-08-19", "endDate": "2014-08-19", "id": "2014WedW33", "iso": "2014WedW33", "name": "Week 33 - 2014-08-13 - 2014-08-19", + "periodType": "WEEKLY", "startDate": "2014-08-13", }, Object { + "displayName": "Week 34 - 2014-08-20 - 2014-08-26", "endDate": "2014-08-26", "id": "2014WedW34", "iso": "2014WedW34", "name": "Week 34 - 2014-08-20 - 2014-08-26", + "periodType": "WEEKLY", "startDate": "2014-08-20", }, Object { + "displayName": "Week 35 - 2014-08-27 - 2014-09-02", "endDate": "2014-09-02", "id": "2014WedW35", "iso": "2014WedW35", "name": "Week 35 - 2014-08-27 - 2014-09-02", + "periodType": "WEEKLY", "startDate": "2014-08-27", }, Object { + "displayName": "Week 36 - 2014-09-03 - 2014-09-09", "endDate": "2014-09-09", "id": "2014WedW36", "iso": "2014WedW36", "name": "Week 36 - 2014-09-03 - 2014-09-09", + "periodType": "WEEKLY", "startDate": "2014-09-03", }, Object { + "displayName": "Week 37 - 2014-09-10 - 2014-09-16", "endDate": "2014-09-16", "id": "2014WedW37", "iso": "2014WedW37", "name": "Week 37 - 2014-09-10 - 2014-09-16", + "periodType": "WEEKLY", "startDate": "2014-09-10", }, Object { + "displayName": "Week 38 - 2014-09-17 - 2014-09-23", "endDate": "2014-09-23", "id": "2014WedW38", "iso": "2014WedW38", "name": "Week 38 - 2014-09-17 - 2014-09-23", + "periodType": "WEEKLY", "startDate": "2014-09-17", }, Object { + "displayName": "Week 39 - 2014-09-24 - 2014-09-30", "endDate": "2014-09-30", "id": "2014WedW39", "iso": "2014WedW39", "name": "Week 39 - 2014-09-24 - 2014-09-30", + "periodType": "WEEKLY", "startDate": "2014-09-24", }, Object { + "displayName": "Week 40 - 2014-10-01 - 2014-10-07", "endDate": "2014-10-07", "id": "2014WedW40", "iso": "2014WedW40", "name": "Week 40 - 2014-10-01 - 2014-10-07", + "periodType": "WEEKLY", "startDate": "2014-10-01", }, Object { + "displayName": "Week 41 - 2014-10-08 - 2014-10-14", "endDate": "2014-10-14", "id": "2014WedW41", "iso": "2014WedW41", "name": "Week 41 - 2014-10-08 - 2014-10-14", + "periodType": "WEEKLY", "startDate": "2014-10-08", }, Object { + "displayName": "Week 42 - 2014-10-15 - 2014-10-21", "endDate": "2014-10-21", "id": "2014WedW42", "iso": "2014WedW42", "name": "Week 42 - 2014-10-15 - 2014-10-21", + "periodType": "WEEKLY", "startDate": "2014-10-15", }, Object { + "displayName": "Week 43 - 2014-10-22 - 2014-10-28", "endDate": "2014-10-28", "id": "2014WedW43", "iso": "2014WedW43", "name": "Week 43 - 2014-10-22 - 2014-10-28", + "periodType": "WEEKLY", "startDate": "2014-10-22", }, Object { + "displayName": "Week 44 - 2014-10-29 - 2014-11-04", "endDate": "2014-11-04", "id": "2014WedW44", "iso": "2014WedW44", "name": "Week 44 - 2014-10-29 - 2014-11-04", + "periodType": "WEEKLY", "startDate": "2014-10-29", }, Object { + "displayName": "Week 45 - 2014-11-05 - 2014-11-11", "endDate": "2014-11-11", "id": "2014WedW45", "iso": "2014WedW45", "name": "Week 45 - 2014-11-05 - 2014-11-11", + "periodType": "WEEKLY", "startDate": "2014-11-05", }, Object { + "displayName": "Week 46 - 2014-11-12 - 2014-11-18", "endDate": "2014-11-18", "id": "2014WedW46", "iso": "2014WedW46", "name": "Week 46 - 2014-11-12 - 2014-11-18", + "periodType": "WEEKLY", "startDate": "2014-11-12", }, Object { + "displayName": "Week 47 - 2014-11-19 - 2014-11-25", "endDate": "2014-11-25", "id": "2014WedW47", "iso": "2014WedW47", "name": "Week 47 - 2014-11-19 - 2014-11-25", + "periodType": "WEEKLY", "startDate": "2014-11-19", }, Object { + "displayName": "Week 48 - 2014-11-26 - 2014-12-02", "endDate": "2014-12-02", "id": "2014WedW48", "iso": "2014WedW48", "name": "Week 48 - 2014-11-26 - 2014-12-02", + "periodType": "WEEKLY", "startDate": "2014-11-26", }, Object { + "displayName": "Week 49 - 2014-12-03 - 2014-12-09", "endDate": "2014-12-09", "id": "2014WedW49", "iso": "2014WedW49", "name": "Week 49 - 2014-12-03 - 2014-12-09", + "periodType": "WEEKLY", "startDate": "2014-12-03", }, Object { + "displayName": "Week 50 - 2014-12-10 - 2014-12-16", "endDate": "2014-12-16", "id": "2014WedW50", "iso": "2014WedW50", "name": "Week 50 - 2014-12-10 - 2014-12-16", + "periodType": "WEEKLY", "startDate": "2014-12-10", }, Object { + "displayName": "Week 51 - 2014-12-17 - 2014-12-23", "endDate": "2014-12-23", "id": "2014WedW51", "iso": "2014WedW51", "name": "Week 51 - 2014-12-17 - 2014-12-23", + "periodType": "WEEKLY", "startDate": "2014-12-17", }, Object { + "displayName": "Week 52 - 2014-12-24 - 2014-12-30", "endDate": "2014-12-30", "id": "2014WedW52", "iso": "2014WedW52", "name": "Week 52 - 2014-12-24 - 2014-12-30", + "periodType": "WEEKLY", "startDate": "2014-12-24", }, ], @@ -5533,73 +7115,93 @@ Object { "name": "Yearly", "options": Array [ Object { + "displayName": "2005", "endDate": "2005-12-31", "id": "2005", "iso": "2005", "name": "2005", + "periodType": "YEARLY", "startDate": "2005-01-01", }, Object { + "displayName": "2006", "endDate": "2006-12-31", "id": "2006", "iso": "2006", "name": "2006", + "periodType": "YEARLY", "startDate": "2006-01-01", }, Object { + "displayName": "2007", "endDate": "2007-12-31", "id": "2007", "iso": "2007", "name": "2007", + "periodType": "YEARLY", "startDate": "2007-01-01", }, Object { + "displayName": "2008", "endDate": "2008-12-31", "id": "2008", "iso": "2008", "name": "2008", + "periodType": "YEARLY", "startDate": "2008-01-01", }, Object { + "displayName": "2009", "endDate": "2009-12-31", "id": "2009", "iso": "2009", "name": "2009", + "periodType": "YEARLY", "startDate": "2009-01-01", }, Object { + "displayName": "2010", "endDate": "2010-12-31", "id": "2010", "iso": "2010", "name": "2010", + "periodType": "YEARLY", "startDate": "2010-01-01", }, Object { + "displayName": "2011", "endDate": "2011-12-31", "id": "2011", "iso": "2011", "name": "2011", + "periodType": "YEARLY", "startDate": "2011-01-01", }, Object { + "displayName": "2012", "endDate": "2012-12-31", "id": "2012", "iso": "2012", "name": "2012", + "periodType": "YEARLY", "startDate": "2012-01-01", }, Object { + "displayName": "2013", "endDate": "2013-12-31", "id": "2013", "iso": "2013", "name": "2013", + "periodType": "YEARLY", "startDate": "2013-01-01", }, Object { + "displayName": "2014", "endDate": "2014-12-31", "id": "2014", "iso": "2014", "name": "2014", + "periodType": "YEARLY", "startDate": "2014-01-01", }, ], diff --git a/src/components/PeriodDimension/utils/fixedPeriods.js b/src/components/PeriodDimension/utils/fixedPeriods.js index ad0459d6a..d3e1fc1a9 100644 --- a/src/components/PeriodDimension/utils/fixedPeriods.js +++ b/src/components/PeriodDimension/utils/fixedPeriods.js @@ -1,3 +1,7 @@ +import { + generateFixedPeriods, + getNowInCalendar, +} from '@dhis2/multi-calendar-dates' import i18n from '../../../locales/index.js' import { DAILY, @@ -40,510 +44,177 @@ const PERIOD_TYPE_REGEX = { [FYAPR]: /^([0-9]{4})April$/, // YYYY"April" } -const getMonthName = (key) => { - const monthNames = [ - i18n.t('January'), - i18n.t('February'), - i18n.t('March'), - i18n.t('April'), - i18n.t('May'), - i18n.t('June'), - i18n.t('July'), - i18n.t('August'), - i18n.t('September'), - i18n.t('October'), - i18n.t('November'), - i18n.t('December'), - ] - - return monthNames[key] -} +const getPeriods = ({ periodType, config, fnFilter, periodSettings = {} }) => { + const offset = parseInt(config.offset, 10) + const isFilter = config.filterFuturePeriods + const isReverse = periodType.match(/^FY|YEARLY/) + ? true + : config.reversePeriods + + const { calendar = 'gregory', locale = 'en' } = periodSettings + const now = getNowInCalendar(calendar) + const year = (now.eraYear || now.year) + offset + + const params = { + periodType, + year, + calendar, + locale, + startingDay: config.startDay, + } -const getDailyPeriodType = (formatYyyyMmDd, fnFilter) => { - return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`01 Jan ${year}`) - - while (date.getFullYear() === year) { - const period = {} - period.startDate = formatYyyyMmDd(date) - period.endDate = period.startDate - period.name = period.startDate - period.iso = period.startDate.replace(/-/g, '') - period.id = period.iso - periods.push(period) - date.setDate(date.getDate() + 1) - } + let periods = generateFixedPeriods(params) - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods.reverse() : periods + periods = isFilter ? fnFilter(periods) : periods + periods = !isReverse ? periods : periods.reverse() - return periods - } + return periods } -const getWeeklyPeriodType = (formatYyyyMmDd, weekObj, fnFilter) => { - // Calculate the first date of an EPI year base on ISO standard ( first week always contains 4th Jan ) - const getEpiWeekStartDay = (year, startDayOfWeek) => { - const jan4 = new Date(year, 0, 4) - const jan4DayOfWeek = jan4.getDay() - const startDate = jan4 - const dayDiff = jan4DayOfWeek - startDayOfWeek - - if (dayDiff > 0) { - startDate.setDate(jan4.getDate() - dayDiff) - } else if (dayDiff < 0) { - startDate.setDate(jan4.getDate() - dayDiff) - startDate.setDate(startDate.getDate() - 7) - } - - return startDate - } - +const getDailyPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = getEpiWeekStartDay(year, weekObj.startDay) - let week = 1 - - while (date.getFullYear() <= year) { - const period = {} - period.startDate = formatYyyyMmDd(date) - period.iso = `${year}${weekObj.shortName}W${week}` - period.id = period.iso - date.setDate(date.getDate() + 6) - period.endDate = formatYyyyMmDd(date) - - const weekNumber = week - period.name = `${i18n.t('Week {{weekNumber}}', { weekNumber })} - ${ - period.startDate - } - ${period.endDate}` - - // if end date is Jan 4th or later, week belongs to next year - if (date.getFullYear() > year && date.getDate() >= 4) { - break - } - - periods.push(period) - date.setDate(date.getDate() + 1) - - week += 1 - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods.reverse() : periods - - return periods + return getPeriods({ + periodType: 'DAILY', + config, + fnFilter, + periodSettings, + }) } } -const getBiWeeklyPeriodType = (formatYyyyMmDd, fnFilter) => { +const getWeeklyPeriodType = (weekObj, fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`01 Jan ${year}`) - const day = date.getDay() - let biWeek = 1 - - if (day <= 4) { - date.setDate(date.getDate() - (day - 1)) - } else { - date.setDate(date.getDate() + (8 - day)) - } - - while (date.getFullYear() <= year) { - const period = {} - - period.iso = `${year}BiW${biWeek}` - period.id = period.iso - period.startDate = formatYyyyMmDd(date) - date.setDate(date.getDate() + 13) - - period.endDate = formatYyyyMmDd(date) - const biWeekNumber = biWeek - period.name = `${i18n.t('Bi-Week {{biWeekNumber}}', { - biWeekNumber, - })} - ${period.startDate} - ${period.endDate}` - - // if end date is Jan 4th or later, biweek belongs to next year - if (date.getFullYear() > year && date.getDate() >= 4) { - break - } - - periods.push(period) - - date.setDate(date.getDate() + 1) - - biWeek += 1 - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods.reverse() : periods - - return periods + return getPeriods({ + periodType: 'WEEKLY', + config: { + ...config, + startDay: weekObj.startDay, + }, + fnFilter, + periodSettings, + }) } } -const getMonthlyPeriodType = (formatYyyyMmDd, fnFilter) => { - const formatIso = (date) => { - const y = date.getFullYear() - let m = String(date.getMonth() + 1) - - m = m.length < 2 ? `0${m}` : m - - return y + m - } - +const getBiWeeklyPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`31 Dec ${year}`) - - while (date.getFullYear() === year) { - const period = {} - - period.endDate = formatYyyyMmDd(date) - date.setDate(1) - period.startDate = formatYyyyMmDd(date) - const monthName = getMonthName(date.getMonth()) - period.name = `${monthName} ${year}` - period.iso = formatIso(date) - period.id = period.iso - - periods.push(period) - date.setDate(0) - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods : periods.reverse() - // Months are collected backwards. If isReverse is true, then do nothing. Else reverse to correct order and return. - - return periods + return getPeriods({ + periodType: 'BIWEEKLY', + config, + fnFilter, + periodSettings, + }) } } -const getBiMonthlyPeriodType = (formatYyyyMmDd, fnFilter) => { +const getMonthlyPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`31 Dec ${year}`) - let index = 6 - - while (date.getFullYear() === year) { - const period = {} - - period.endDate = formatYyyyMmDd(date) - date.setDate(0) - date.setDate(1) - period.startDate = formatYyyyMmDd(date) - const monthStart = getMonthName(date.getMonth()) - const monthEnd = getMonthName(date.getMonth() + 1) - const fullYear = date.getFullYear() - period.name = `${monthStart} - ${monthEnd} ${fullYear}` - period.iso = `${year}0${index}B` - period.id = period.iso - periods.push(period) - date.setDate(0) - - index-- - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods : periods.reverse() - // Bi-months are collected backwards. If isReverse is true, then do nothing. Else reverse to correct order and return. - - return periods + return getPeriods({ + periodType: 'MONTHLY', + config, + fnFilter, + periodSettings, + }) } } -const getQuarterlyPeriodType = (formatYyyyMmDd, fnFilter) => { +const getBiMonthlyPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`31 Dec ${year}`) - let quarter = 4 - - while (date.getFullYear() === year) { - const period = {} - period.endDate = formatYyyyMmDd(date) - date.setDate(0) - date.setDate(0) - date.setDate(1) - period.startDate = formatYyyyMmDd(date) - const monthStart = getMonthName(date.getMonth()) - const monthEnd = getMonthName(date.getMonth() + 2) - const fullYear = date.getFullYear() - period.name = `${monthStart} - ${monthEnd} ${fullYear}` - period.iso = `${year}Q${quarter}` - period.id = period.iso - periods.push(period) - date.setDate(0) - quarter -= 1 - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods : periods.reverse() - // Quarters are collected backwards. If isReverse is true, then do nothing. Else reverse to correct order and return. - - return periods + return getPeriods({ + periodType: 'BIMONTHLY', + config, + fnFilter, + periodSettings, + }) } } -const getSixMonthlyPeriodType = (fnFilter) => { +const getQuarterlyPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - - let period = {} - period.startDate = `${year}-01-01` - period.endDate = `${year}-06-30` - period.name = `${getMonthName(0)} - ${getMonthName(5)} ${year}` - period.iso = `${year}S1` - period.id = period.iso - periods.push(period) - - period = {} - period.startDate = `${year}-07-01` - period.endDate = `${year}-12-31` - period.name = `${getMonthName(6)} - ${getMonthName(11)} ${year}` - period.iso = `${year}S2` - period.id = period.iso - periods.push(period) - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods.reverse() : periods - - return periods + return getPeriods({ + periodType: 'QUARTERLY', + config, + fnFilter, + periodSettings, + }) } } -const getSixMonthlyAprilPeriodType = (fnFilter) => { +const getSixMonthlyPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - - let period = {} - period.startDate = `${year}-04-01` - period.endDate = `${year}-09-30` - period.name = `${getMonthName(3)} - ${getMonthName(8)} ${year}` - period.iso = `${year}AprilS1` - period.id = period.iso - periods.push(period) - - period = {} - period.startDate = `${year}-10-01` - period.endDate = `${year + 1}-03-31` - period.name = `${getMonthName(9)} ${year} - ${getMonthName(2)} ${ - year + 1 - }` - period.iso = `${year}AprilS2` - period.id = period.iso - periods.push(period) - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods.reverse() : periods - - return periods + return getPeriods({ + periodType: 'SIXMONTHLY', + config, + fnFilter, + periodSettings, + }) } } -const getYearlyPeriodType = (formatYyyyMmDd, fnFilter) => { +const getSixMonthlyAprilPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`31 Dec ${year}`) - - while (year - date.getFullYear() < 10) { - const period = {} - period.endDate = formatYyyyMmDd(date) - date.setMonth(0, 1) - period.startDate = formatYyyyMmDd(date) - const dateString = date.getFullYear().toString() - period.name = dateString - period.iso = date.getFullYear().toString() - period.id = period.iso.toString() - periods.push(period) - date.setDate(0) - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods : periods.reverse() - // Years are collected backwards. If isReverse is true, then do nothing. Else reverse to correct order and return. - - return periods + return getPeriods({ + periodType: 'SIXMONTHLYAPR', + config, + fnFilter, + periodSettings, + }) } } -const getFinancialOctoberPeriodType = (formatYyyyMmDd, fnFilter) => { +const getYearlyPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`30 Sep ${year + 1}`) - - for (let i = 0; i < 10; i++) { - const period = {} - period.endDate = formatYyyyMmDd(date) - date.setYear(date.getFullYear() - 1) - date.setDate(date.getDate() + 1) - period.startDate = formatYyyyMmDd(date) - const yearStart = date.getFullYear() - const yearEnd = date.getFullYear() + 1 - period.name = `${getMonthName(9)} ${yearStart} - ${getMonthName( - 8 - )} ${yearEnd}` - period.id = `${date.getFullYear()}Oct` - periods.push(period) - date.setDate(date.getDate() - 1) - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods : periods.reverse() - // FinancialOctober periods are collected backwards. If isReverse is true, then do nothing. Else reverse to correct order and return. - - return periods + return getPeriods({ + periodType: 'YEARLY', + config, + fnFilter, + periodSettings, + }) } } -const getFinancialNovemberPeriodType = (formatYyyyMmDd, fnFilter) => { +const getFinancialOctoberPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`31 Oct ${year + 1}`) - - for (let i = 0; i < 10; i++) { - const period = {} - period.endDate = formatYyyyMmDd(date) - date.setYear(date.getFullYear() - 1) - date.setDate(date.getDate() + 1) - period.startDate = formatYyyyMmDd(date) - const yearStart = date.getFullYear() - const yearEnd = date.getFullYear() + 1 - period.name = `${getMonthName(10)} ${yearStart} - ${getMonthName( - 9 - )} ${yearEnd}` - period.id = `${date.getFullYear()}Nov` - periods.push(period) - date.setDate(date.getDate() - 1) - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods : periods.reverse() - // FinancialNovember periods are collected backwards. If isReverse is true, then do nothing. Else reverse to correct order and return. - - return periods + return getPeriods({ + periodType: 'FYOCT', + config, + fnFilter, + periodSettings, + }) } } -const getFinancialJulyPeriodType = (formatYyyyMmDd, fnFilter) => { +const getFinancialNovemberPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`30 Jun ${year + 1}`) - - for (let i = 0; i < 10; i++) { - const period = {} - period.endDate = formatYyyyMmDd(date) - date.setYear(date.getFullYear() - 1) - date.setDate(date.getDate() + 1) - period.startDate = formatYyyyMmDd(date) - const yearStart = date.getFullYear() - const yearEnd = date.getFullYear() + 1 - period.name = `${getMonthName(6)} ${yearStart} - ${getMonthName( - 5 - )} ${yearEnd}` - period.id = `${date.getFullYear()}July` - periods.push(period) - date.setDate(date.getDate() - 1) - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods : periods.reverse() - // FinancialJuly periods are collected backwards. If isReverse is true, then do nothing. Else reverse to correct order and return. - - return periods + return getPeriods({ + periodType: 'FYNOV', + config, + fnFilter, + periodSettings, + }) } } -const getFinancialAprilPeriodType = (formatYyyyMmDd, fnFilter) => { +const getFinancialJulyPeriodType = (fnFilter, periodSettings) => { return (config) => { - let periods = [] - const offset = parseInt(config.offset, 10) - const isFilter = config.filterFuturePeriods - const isReverse = config.reversePeriods - const year = new Date(Date.now()).getFullYear() + offset - const date = new Date(`31 Mar ${year + 1}`) - - for (let i = 0; i < 10; i++) { - const period = {} - period.endDate = formatYyyyMmDd(date) - date.setYear(date.getFullYear() - 1) - date.setDate(date.getDate() + 1) - period.startDate = formatYyyyMmDd(date) - const yearStart = date.getFullYear() - const yearEnd = date.getFullYear() + 1 - period.name = `${getMonthName(3)} ${yearStart} - ${getMonthName( - 2 - )} ${yearEnd}` - period.id = `${date.getFullYear()}April` - periods.push(period) - date.setDate(date.getDate() - 1) - } - - periods = isFilter ? fnFilter(periods) : periods - periods = isReverse ? periods : periods.reverse() - // FinancialApril periods are collected backwards. If isReverse is true, then do nothing. Else reverse to correct order and return. - - return periods + return getPeriods({ + periodType: 'FYJUL', + config, + fnFilter, + periodSettings, + }) } } -const formatYyyyMmDd = (date) => { - const y = date.getFullYear() - let m = String(date.getMonth() + 1) - let d = String(date.getDate()) - - m = m.length < 2 ? `0${m}` : m - d = d.length < 2 ? `0${d}` : d - - return `${y}-${m}-${d}` +const getFinancialAprilPeriodType = (fnFilter, periodSettings) => { + return (config) => { + return getPeriods({ + periodType: 'FYAPR', + config, + fnFilter, + periodSettings, + }) + } } const filterFuturePeriods = (periods) => { @@ -559,128 +230,152 @@ const filterFuturePeriods = (periods) => { return array } -const getOptions = () => [ - { - id: DAILY, - getPeriods: getDailyPeriodType(formatYyyyMmDd, filterFuturePeriods), - name: i18n.t('Daily'), - }, - { - id: WEEKLY, - getPeriods: getWeeklyPeriodType( - formatYyyyMmDd, - { shortName: '', startDay: 1 }, - filterFuturePeriods - ), - name: i18n.t('Weekly'), - }, - { - id: WEEKLYWED, - getPeriods: getWeeklyPeriodType( - formatYyyyMmDd, - { shortName: 'Wed', startDay: 3 }, - filterFuturePeriods - ), - name: i18n.t('Weekly (Start Wednesday)'), - }, - { - id: WEEKLYTHU, - getPeriods: getWeeklyPeriodType( - formatYyyyMmDd, - { shortName: 'Thu', startDay: 4 }, - filterFuturePeriods - ), - name: i18n.t('Weekly (Start Thursday)'), - }, - { - id: WEEKLYSAT, - getPeriods: getWeeklyPeriodType( - formatYyyyMmDd, - { shortName: 'Sat', startDay: 6 }, - filterFuturePeriods - ), - name: i18n.t('Weekly (Start Saturday)'), - }, - { - id: WEEKLYSUN, - getPeriods: getWeeklyPeriodType( - formatYyyyMmDd, - { shortName: 'Sun', startDay: 7 }, - filterFuturePeriods - ), - name: i18n.t('Weekly (Start Sunday)'), - }, - { - id: BIWEEKLY, - getPeriods: getBiWeeklyPeriodType(formatYyyyMmDd, filterFuturePeriods), - name: i18n.t('Bi-weekly'), - }, - { - id: MONTHLY, - getPeriods: getMonthlyPeriodType(formatYyyyMmDd, filterFuturePeriods), - name: i18n.t('Monthly'), - }, - { - id: BIMONTHLY, - getPeriods: getBiMonthlyPeriodType(formatYyyyMmDd, filterFuturePeriods), - name: i18n.t('Bi-monthly'), - }, - { - id: QUARTERLY, - getPeriods: getQuarterlyPeriodType(formatYyyyMmDd, filterFuturePeriods), - name: i18n.t('Quarterly'), - }, - { - id: SIXMONTHLY, - getPeriods: getSixMonthlyPeriodType(filterFuturePeriods), - name: i18n.t('Six-monthly'), - }, - { - id: SIXMONTHLYAPR, - getPeriods: getSixMonthlyAprilPeriodType(filterFuturePeriods), - name: i18n.t('Six-monthly April'), - }, - { - id: YEARLY, - getPeriods: getYearlyPeriodType(formatYyyyMmDd, filterFuturePeriods), - name: i18n.t('Yearly'), - }, - { - id: FYNOV, - getPeriods: getFinancialNovemberPeriodType( - formatYyyyMmDd, - filterFuturePeriods - ), - name: i18n.t('Financial year (Start November)'), - }, - { - id: FYOCT, - getPeriods: getFinancialOctoberPeriodType( - formatYyyyMmDd, - filterFuturePeriods - ), - name: i18n.t('Financial year (Start October)'), - }, - { - id: FYJUL, - getPeriods: getFinancialJulyPeriodType( - formatYyyyMmDd, - filterFuturePeriods - ), - name: i18n.t('Financial year (Start July)'), - }, - { - id: FYAPR, - getPeriods: getFinancialAprilPeriodType( - formatYyyyMmDd, - filterFuturePeriods - ), - name: i18n.t('Financial year (Start April)'), - }, -] - -export const getFixedPeriodsOptionsById = (id) => - getOptions().find((option) => option.id === id) +const getOptions = (periodSettings) => { + return [ + { + id: DAILY, + getPeriods: getDailyPeriodType(filterFuturePeriods, periodSettings), + name: i18n.t('Daily'), + }, + { + id: WEEKLY, + getPeriods: getWeeklyPeriodType( + { startDay: 1 }, + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Weekly'), + }, + { + id: WEEKLYWED, + getPeriods: getWeeklyPeriodType( + { startDay: 3 }, + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Weekly (Start Wednesday)'), + }, + { + id: WEEKLYTHU, + getPeriods: getWeeklyPeriodType( + { startDay: 4 }, + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Weekly (Start Thursday)'), + }, + { + id: WEEKLYSAT, + getPeriods: getWeeklyPeriodType( + { startDay: 6 }, + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Weekly (Start Saturday)'), + }, + { + id: WEEKLYSUN, + getPeriods: getWeeklyPeriodType( + { startDay: 7 }, + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Weekly (Start Sunday)'), + }, + { + id: BIWEEKLY, + getPeriods: getBiWeeklyPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Bi-weekly'), + }, + { + id: MONTHLY, + getPeriods: getMonthlyPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Monthly'), + }, + { + id: BIMONTHLY, + getPeriods: getBiMonthlyPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Bi-monthly'), + }, + { + id: QUARTERLY, + getPeriods: getQuarterlyPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Quarterly'), + }, + { + id: SIXMONTHLY, + getPeriods: getSixMonthlyPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Six-monthly'), + }, + { + id: SIXMONTHLYAPR, + getPeriods: getSixMonthlyAprilPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Six-monthly April'), + }, + { + id: YEARLY, + getPeriods: getYearlyPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Yearly'), + }, + { + id: FYNOV, + getPeriods: getFinancialNovemberPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Financial year (Start November)'), + }, + { + id: FYOCT, + getPeriods: getFinancialOctoberPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Financial year (Start October)'), + }, + { + id: FYJUL, + getPeriods: getFinancialJulyPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Financial year (Start July)'), + }, + { + id: FYAPR, + getPeriods: getFinancialAprilPeriodType( + filterFuturePeriods, + periodSettings + ), + name: i18n.t('Financial year (Start April)'), + }, + ] +} + +export const getFixedPeriodsOptionsById = (id, periodSettings) => { + return getOptions(periodSettings).find((option) => option.id === id) +} export const getFixedPeriodsOptions = () => getOptions() diff --git a/src/components/PivotTable/PivotTableTitleRow.js b/src/components/PivotTable/PivotTableTitleRow.js index 681eaf1ab..ae9bfb576 100644 --- a/src/components/PivotTable/PivotTableTitleRow.js +++ b/src/components/PivotTable/PivotTableTitleRow.js @@ -1,5 +1,6 @@ +import { Tooltip } from '@dhis2/ui' import PropTypes from 'prop-types' -import React, { useState, useEffect } from 'react' +import React, { useRef, useState, useEffect } from 'react' import { PivotTableCell } from './PivotTableCell.js' import { usePivotTableEngine } from './PivotTableEngineContext.js' import { cell as cellStyle } from './styles/PivotTable.style.js' @@ -8,34 +9,66 @@ export const PivotTableTitleRow = ({ title, scrollPosition, containerWidth, - totalWidth, }) => { + const containerRef = useRef(null) + const [scrollWidth, setScrollWidth] = useState(0) + const [isTitleTruncated, setIsTitleTruncated] = useState(false) const engine = usePivotTableEngine() const columnCount = engine.width + engine.rowDepth + const maxWidth = containerWidth - (engine.cellPadding * 2 + 2) + const marginLeft = Math.max(0, scrollPosition?.x ?? 0) - const [position, setPosition] = useState(scrollPosition.x) useEffect(() => { - setPosition( - Math.max(0, Math.min(scrollPosition.x, totalWidth - containerWidth)) - ) - }, [containerWidth, scrollPosition.x, totalWidth]) + if (containerRef.current) { + /* Only set `scrollWidth` once, because during a CSS transition + * the reported value can sometimes be equal to `clientWidth` + * even though the text doesn't fit. Due to `white-space: nowrap` + * and `overflow: hidden` the `scrollWidth` should remain constant, + * so we can assume this initial value is correct. */ + if (!scrollWidth) { + setScrollWidth(containerRef.current.scrollWidth) + } + const currentScrollWidth = + scrollWidth ?? containerRef.current.scrollWidth + const newIsTitleTruncated = + currentScrollWidth > containerRef.current.clientWidth + if (newIsTitleTruncated !== isTitleTruncated) { + setIsTitleTruncated(newIsTitleTruncated) + } + } + }, [containerWidth, scrollWidth, isTitleTruncated]) + return (
    - {title} + {isTitleTruncated ? ( + + {({ ref: tooltipRef, onMouseOver, onMouseOut }) => ( +
    + {title} +
    + )} +
    + ) : ( + title + )}
    @@ -47,5 +80,4 @@ PivotTableTitleRow.propTypes = { scrollPosition: PropTypes.shape({ x: PropTypes.number.isRequired }) .isRequired, title: PropTypes.string.isRequired, - totalWidth: PropTypes.number.isRequired, } diff --git a/src/components/PivotTable/PivotTableTitleRows.js b/src/components/PivotTable/PivotTableTitleRows.js index 34ad04e33..8a3439c9d 100644 --- a/src/components/PivotTable/PivotTableTitleRows.js +++ b/src/components/PivotTable/PivotTableTitleRows.js @@ -13,10 +13,6 @@ export const PivotTableTitleRows = ({ clippingResult, width }) => { title={engine.options.title} scrollPosition={clippingResult.scrollPosition} containerWidth={width} - totalWidth={ - engine.adaptiveClippingController.columns.totalSize + - engine.adaptiveClippingController.columns.headerSize - } /> ) : null} {engine.options.subtitle ? ( @@ -24,10 +20,6 @@ export const PivotTableTitleRows = ({ clippingResult, width }) => { title={engine.options.subtitle} scrollPosition={clippingResult.scrollPosition} containerWidth={width} - totalWidth={ - engine.adaptiveClippingController.columns.totalSize + - engine.adaptiveClippingController.columns.headerSize - } /> ) : null} {engine.visualization.filters?.length ? ( @@ -38,10 +30,6 @@ export const PivotTableTitleRows = ({ clippingResult, width }) => { )} scrollPosition={clippingResult.scrollPosition} containerWidth={width} - totalWidth={ - engine.adaptiveClippingController.columns.totalSize + - engine.adaptiveClippingController.columns.headerSize - } /> ) : null} diff --git a/src/components/PivotTable/PivotTableValueCell.js b/src/components/PivotTable/PivotTableValueCell.js index 9013a0a83..f20fe554d 100644 --- a/src/components/PivotTable/PivotTableValueCell.js +++ b/src/components/PivotTable/PivotTableValueCell.js @@ -1,8 +1,12 @@ +import i18n from '@dhis2/d2-i18n' import PropTypes from 'prop-types' import React, { useRef } from 'react' import { applyLegendSet } from '../../modules/pivotTable/applyLegendSet.js' import { CELL_TYPE_VALUE } from '../../modules/pivotTable/pivotTableConstants.js' -import { VALUE_TYPE_NUMBER } from '../../modules/valueTypes.js' +import { + isNumericValueType, + isBooleanValueType, +} from '../../modules/valueTypes.js' import { PivotTableCell } from './PivotTableCell.js' import { PivotTableEmptyCell } from './PivotTableEmptyCell.js' import { usePivotTableEngine } from './PivotTableEngineContext.js' @@ -43,10 +47,10 @@ export const PivotTableValueCell = ({ ) } - // TODO: Add support for 'INTEGER' type (requires server changes) const legendStyle = cellContent.cellType === CELL_TYPE_VALUE && - cellContent.valueType === VALUE_TYPE_NUMBER + (isNumericValueType(cellContent.valueType) || + isBooleanValueType(cellContent.valueType)) ? applyLegendSet( cellContent.rawValue, cellContent.dxDimension, @@ -71,7 +75,13 @@ export const PivotTableValueCell = ({ .title-cell-content { + padding: ${DISPLAY_DENSITY_PADDING_COMPACT}px; + } + .title-cell.displaydensity-NORMAL > .title-cell-content { + padding: ${DISPLAY_DENSITY_PADDING_NORMAL}px; + } + .title-cell.displaydensity-COMFORTABLE > .title-cell-content { + padding: ${DISPLAY_DENSITY_PADDING_COMFORTABLE}px; } .row-header { background-color: #dae6f8; @@ -127,13 +145,24 @@ export const cell = css` } .value { background-color: #ffffff; - } - .TEXT { text-align: left; } - .NUMBER { + .NUMBER, + .INTEGER, + .INTEGER_POSITIVE, + .INTEGER_NEGATIVE, + .INTEGER_ZERO_OR_POSITIVE, + .UNIT_INTERVAL, + .PERCENTAGE, + .BOOLEAN, + .TRUE_ONLY { text-align: right; } + .N_A { + text-align: center; + color: ${colors.grey600}; + } + .clickable { cursor: pointer; } diff --git a/src/components/Interpretations/common/RichTextEditor/RichTextEditor.js b/src/components/RichText/Editor/Editor.js similarity index 77% rename from src/components/Interpretations/common/RichTextEditor/RichTextEditor.js rename to src/components/RichText/Editor/Editor.js index 4d9ea52e4..6e7e62f0a 100644 --- a/src/components/Interpretations/common/RichTextEditor/RichTextEditor.js +++ b/src/components/RichText/Editor/Editor.js @@ -1,9 +1,8 @@ -import { Parser as RichTextParser } from '@dhis2/d2-ui-rich-text' import { Button, Popover, Tooltip, - Field, + Help, IconAt24, IconFaceAdd24, IconLink24, @@ -11,10 +10,12 @@ import { IconTextItalic24, colors, } from '@dhis2/ui' +import cx from 'classnames' import PropTypes from 'prop-types' import React, { forwardRef, useRef, useEffect, useState } from 'react' -import i18n from '../../../../locales/index.js' -import { UserMentionWrapper } from '../UserMention/UserMentionWrapper.js' +import i18n from '../../../locales/index.js' +import { UserMentionWrapper } from '../../UserMention/UserMentionWrapper.js' +import { Parser } from '../Parser/Parser.js' import { convertCtrlKey, insertMarkdown, @@ -33,22 +34,22 @@ import { toolbarClasses, tooltipAnchorClasses, emojisPopoverClasses, -} from './styles/RichTextEditor.style.js' +} from './styles/Editor.style.js' const EmojisPopover = ({ onInsertMarkdown, onClose, reference }) => (
    • onInsertMarkdown(EMOJI_SMILEY_FACE)}> - {emojis[EMOJI_SMILEY_FACE]} + {emojis[EMOJI_SMILEY_FACE]}
    • onInsertMarkdown(EMOJI_SAD_FACE)}> - {emojis[EMOJI_SAD_FACE]} + {emojis[EMOJI_SAD_FACE]}
    • onInsertMarkdown(EMOJI_THUMBS_UP)}> - {emojis[EMOJI_THUMBS_UP]} + {emojis[EMOJI_THUMBS_UP]}
    • onInsertMarkdown(EMOJI_THUMBS_DOWN)}> - {emojis[EMOJI_THUMBS_DOWN]} + {emojis[EMOJI_THUMBS_DOWN]}
    @@ -190,29 +191,59 @@ Toolbar.propTypes = { disabled: PropTypes.bool, } -export const RichTextEditor = forwardRef( +export const Editor = forwardRef( ( - { value, disabled, inputPlaceholder, onChange, errorText }, + { + value, + disabled, + inputPlaceholder, + onChange, + errorText, + helpText, + initialFocus, + resizable, + }, externalRef ) => { const [previewMode, setPreviewMode] = useState(false) const internalRef = useRef() const textareaRef = externalRef || internalRef + const caretPosRef = useRef(undefined) - useEffect(() => textareaRef.current?.focus(), [textareaRef]) + const insertMarkdownCallback = (text, caretPos) => { + caretPosRef.current = caretPos + onChange(text) + textareaRef.current.focus() + } + + useEffect(() => { + if (initialFocus) { + textareaRef.current?.focus() + } + }, [initialFocus, textareaRef]) + + useEffect(() => { + if (caretPosRef.current) { + textareaRef.current?.setSelectionRange( + caretPosRef.current, + caretPosRef.current + ) + + caretPosRef.current = undefined + } + }, [value, textareaRef]) return ( -
    +
    { insertMarkdown( markdown, textareaRef.current, - (text, caretPos) => { - onChange(text) - textareaRef.current.focus() - textareaRef.current.selectionEnd = caretPos - } + insertMarkdownCallback ) if (markdown === MENTION) { @@ -231,16 +262,18 @@ export const RichTextEditor = forwardRef( /> {previewMode ? (
    - {value} + {value}
    ) : ( - +