├── .dockerignore ├── .editorconfig ├── .eslintrc.js ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── Bug_report.md │ └── Feature_request.md ├── dependabot.yml ├── pull_request_template.md ├── stale.yml └── workflows │ ├── app-upgrade-mysql.yml │ ├── app-upgrade-postgres.yml │ ├── behat-sqlite-encryption.yml │ ├── behat-sqlite.yml │ ├── cypress-e2e.yml │ ├── dependabot-approve-merge.yml │ ├── lint-eslint.yml │ ├── lint-info-xml.yml │ ├── lint-php-cs.yml │ ├── lint-php.yml │ ├── lint-stylelint.yml │ ├── node-test.yml │ ├── occ-cli-mysql.yml │ ├── pages.yml │ ├── phpunit-sqlite.yml │ ├── pr-feedback.yml │ ├── psalm-migrations.yml │ ├── psalm.yml │ ├── renovate-approve-merge.yml │ └── reuse.yml ├── .gitignore ├── .gitmodules ├── .l10nignore ├── .npmignore ├── .php-cs-fixer.dist.php ├── .tx ├── backport └── config ├── AUTHORS.md ├── CHANGELOG.md ├── COPYING ├── DEVELOPING.md ├── LICENSES ├── AGPL-3.0-or-later.txt ├── CC0-1.0.txt └── MIT.txt ├── Makefile ├── README.md ├── REUSE.toml ├── appinfo ├── info.xml └── routes.php ├── babel.config.js ├── composer.json ├── composer.lock ├── css └── collectives.css ├── cypress.config.js ├── cypress ├── Dockerfile ├── docker-compose.yml ├── e2e │ ├── apps.spec.js │ ├── circle-with-group.spec.js │ ├── collective-members.spec.js │ ├── collective-page-mode.spec.js │ ├── collective-readonly.spec.js │ ├── collective-settings.spec.js │ ├── collective-share.spec.js │ ├── collective.spec.js │ ├── collectives-trash.spec.js │ ├── dashboard-widget.spec.js │ ├── page-anchor-links.spec.js │ ├── page-details.spec.js │ ├── page-landingpage.spec.js │ ├── page-list.spec.js │ ├── page-mentions.spec.js │ ├── page-share.spec.js │ ├── page-templates.spec.js │ ├── pages-links.spec.js │ ├── pages.spec.js │ └── settings.spec.js ├── entrypoint.sh ├── fixtures │ ├── test.md │ ├── test.pdf │ └── test.png ├── runLocal.sh ├── support │ ├── commands.js │ ├── e2e.js │ └── navigation.js └── utils │ └── index.js ├── docs ├── archetypes │ └── default.md ├── config.toml ├── content │ ├── _index.md │ ├── administration │ │ └── _index.md │ ├── development │ │ └── _index.md │ └── usage │ │ └── _index.md ├── static │ ├── css │ │ └── custom.css │ └── images │ │ ├── apps.png │ │ ├── bmbf.jpg │ │ ├── create-collective.gif │ │ ├── prototype.png │ │ ├── screenshot-small.png │ │ └── screenshot.png └── themes │ └── custom-css │ ├── layouts │ └── partials │ │ └── custom-head.html │ └── theme.toml ├── img ├── collectives-dark.svg ├── collectives.svg ├── folder-collective.svg └── page.svg ├── jest.config.json ├── jsconfig.json ├── l10n ├── .gitkeep ├── af.js ├── af.json ├── ar.js ├── ar.json ├── ast.js ├── ast.json ├── az.js ├── az.json ├── bg.js ├── bg.json ├── bn_BD.js ├── bn_BD.json ├── br.js ├── br.json ├── bs.js ├── bs.json ├── ca.js ├── ca.json ├── cs.js ├── cs.json ├── cy_GB.js ├── cy_GB.json ├── da.js ├── da.json ├── de.js ├── de.json ├── de_DE.js ├── de_DE.json ├── el.js ├── el.json ├── en_GB.js ├── en_GB.json ├── eo.js ├── eo.json ├── es.js ├── es.json ├── es_419.js ├── es_419.json ├── es_AR.js ├── es_AR.json ├── es_CL.js ├── es_CL.json ├── es_CO.js ├── es_CO.json ├── es_CR.js ├── es_CR.json ├── es_DO.js ├── es_DO.json ├── es_EC.js ├── es_EC.json ├── es_GT.js ├── es_GT.json ├── es_HN.js ├── es_HN.json ├── es_MX.js ├── es_MX.json ├── es_NI.js ├── es_NI.json ├── es_PA.js ├── es_PA.json ├── es_PE.js ├── es_PE.json ├── es_PR.js ├── es_PR.json ├── es_PY.js ├── es_PY.json ├── es_SV.js ├── es_SV.json ├── es_UY.js ├── es_UY.json ├── et_EE.js ├── et_EE.json ├── eu.js ├── eu.json ├── fa.js ├── fa.json ├── fi.js ├── fi.json ├── fr.js ├── fr.json ├── ga.js ├── ga.json ├── gd.js ├── gd.json ├── gl.js ├── gl.json ├── he.js ├── he.json ├── hr.js ├── hr.json ├── hu.js ├── hu.json ├── hy.js ├── hy.json ├── ia.js ├── ia.json ├── id.js ├── id.json ├── is.js ├── is.json ├── it.js ├── it.json ├── ja.js ├── ja.json ├── ka.js ├── ka.json ├── ka_GE.js ├── ka_GE.json ├── kab.js ├── kab.json ├── km.js ├── km.json ├── kn.js ├── kn.json ├── ko.js ├── ko.json ├── lb.js ├── lb.json ├── lo.js ├── lo.json ├── lt_LT.js ├── lt_LT.json ├── lv.js ├── lv.json ├── mk.js ├── mk.json ├── mn.js ├── mn.json ├── ms_MY.js ├── ms_MY.json ├── nb.js ├── nb.json ├── nl.js ├── nl.json ├── nn_NO.js ├── nn_NO.json ├── oc.js ├── oc.json ├── pl.js ├── pl.json ├── pt_BR.js ├── pt_BR.json ├── pt_PT.js ├── pt_PT.json ├── ro.js ├── ro.json ├── ru.js ├── ru.json ├── sc.js ├── sc.json ├── si.js ├── si.json ├── sk.js ├── sk.json ├── sl.js ├── sl.json ├── sq.js ├── sq.json ├── sr.js ├── sr.json ├── sr@latin.js ├── sr@latin.json ├── sv.js ├── sv.json ├── ta.js ├── ta.json ├── th.js ├── th.json ├── tk.js ├── tk.json ├── tr.js ├── tr.json ├── ug.js ├── ug.json ├── uk.js ├── uk.json ├── uz.js ├── uz.json ├── vi.js ├── vi.json ├── zh_CN.js ├── zh_CN.json ├── zh_HK.js ├── zh_HK.json ├── zh_TW.js └── zh_TW.json ├── lib ├── ACL │ └── ACLStorageWrapper.php ├── AppInfo │ └── Application.php ├── BackgroundJob │ ├── CleanupSessions.php │ ├── ExpirePageTrash.php │ ├── ExpirePageVersions.php │ ├── IndexCollectives.php │ └── PurgeObsoletePages.php ├── CacheListener.php ├── Command │ ├── CreateCollective.php │ ├── ExpirePageVersions.php │ ├── IndexCollectives.php │ ├── PageTrashCleanup.php │ └── PurgeObsoletePages.php ├── Controller │ ├── CollectiveController.php │ ├── CollectiveUserSettingsController.php │ ├── ErrorHelper.php │ ├── PageController.php │ ├── PageTrashController.php │ ├── PublicCollectiveController.php │ ├── PublicPageController.php │ ├── PublicPageTrashController.php │ ├── PublicStartController.php │ ├── SessionController.php │ ├── SettingsController.php │ ├── ShareController.php │ ├── StartController.php │ ├── TemplateController.php │ └── TrashController.php ├── Dashboard │ └── RecentPagesWidget.php ├── Db │ ├── Collective.php │ ├── CollectiveMapper.php │ ├── CollectiveShare.php │ ├── CollectiveShareMapper.php │ ├── CollectiveUserSettings.php │ ├── CollectiveUserSettingsMapper.php │ ├── Page.php │ ├── PageGarbageCollector.php │ ├── PageMapper.php │ ├── Session.php │ └── SessionMapper.php ├── Events │ └── CollectivesLoadAdditionalScriptsEvent.php ├── Fs │ ├── NodeHelper.php │ └── UserFolderHelper.php ├── Listeners │ ├── BeforeTemplateRenderedListener.php │ ├── CircleDestroyedListener.php │ ├── CollectivesReferenceListener.php │ ├── ShareDeletedListener.php │ └── TextMentionListener.php ├── Migration │ ├── MigrateTemplates.php │ ├── Version000003Date20200720000000.php │ ├── Version000200Date20200822000000.php │ ├── Version000400Date20210324000000.php │ ├── Version000400Date20210412000000.php │ ├── Version000500Date20210421000000.php │ ├── Version000900Date20210614000000.php │ ├── Version001600Date20211025000000.php │ ├── Version002000Date20220103000000.php │ ├── Version002000Date20220210000000.php │ ├── Version010200Date20220616000000.php │ ├── Version010300Date20220623000000.php │ ├── Version010500Date20220722000000.php │ ├── Version010500Date20220811000000.php │ ├── Version020100Date20221111000000.php │ ├── Version020600Date20230412160400.php │ ├── Version020600Date20230519000000.php │ ├── Version020802Date20231004000000.php │ ├── Version021000Date20231206000000.php │ ├── Version021200Date20240522000000.php │ └── Version021200Date20240725154232.php ├── Model │ ├── PageInfo.php │ └── RecentPage.php ├── Mount │ ├── CollectiveFolderManager.php │ ├── CollectiveMountPoint.php │ ├── CollectiveStorage.php │ ├── MountProvider.php │ ├── NoExcludePropagatorStorageWrapper.php │ └── RootEntryCache.php ├── Reference │ ├── SearchablePageReferenceProvider.php │ └── SearchablePageReferenceProvider29.php ├── Search │ ├── CollectiveProvider.php │ ├── FileSearch │ │ ├── ClauseTokenizer.php │ │ ├── FileIndexer.php │ │ ├── FileSearchException.php │ │ ├── FileSearcher.php │ │ └── WordTokenizer.php │ ├── PageContentProvider.php │ └── PageProvider.php ├── Service │ ├── AttachmentService.php │ ├── CircleExistsException.php │ ├── CircleHelper.php │ ├── CollectiveHelper.php │ ├── CollectiveService.php │ ├── CollectiveServiceBase.php │ ├── CollectiveShareService.php │ ├── CollectiveUserSettingsService.php │ ├── MissingDependencyException.php │ ├── NotFoundException.php │ ├── NotPermittedException.php │ ├── PageService.php │ ├── RecentPagesService.php │ ├── SearchService.php │ ├── ServiceException.php │ ├── SessionService.php │ ├── SharePageService.php │ ├── SubpageOrderService.php │ ├── TemplateService.php │ └── UnprocessableEntityException.php ├── SetupChecks │ ├── CirclesAppIsEnableCheck.php │ └── PDOSQLiteDriverIsEnableCheck.php ├── Team │ └── CollectiveTeamResourceProvider.php ├── Trash │ ├── CollectivePageTrashItem.php │ ├── PageTrashBackend.php │ └── PageTrashManager.php └── Versions │ ├── CollectiveVersion.php │ ├── CollectiveVersionsExpireManager.php │ ├── ExpireManager.php │ └── VersionsBackend.php ├── package-lock.json ├── package.json ├── psalm.xml ├── rector.php ├── renovate.json ├── skeleton ├── Readme.cs.md ├── Readme.da.md ├── Readme.de.md ├── Readme.de_DE.md ├── Readme.en.md ├── Readme.es.md ├── Readme.fr.md ├── Readme.it.md ├── Readme.ja.md ├── Readme.nb_NO.md ├── Readme.nl.md ├── Readme.pl.md ├── Readme.pt.md ├── Readme.pt_BR.md ├── Readme.si.md └── Readme.sl.md ├── src ├── Collectives.vue ├── apis │ └── collectives │ │ ├── collectives.js │ │ ├── index.js │ │ ├── pages.js │ │ ├── sessions.js │ │ ├── settings.js │ │ ├── shares.js │ │ ├── templates.js │ │ ├── urls.js │ │ └── userSettings.js ├── components │ ├── Collective.vue │ ├── Collective │ │ └── CollectiveActions.vue │ ├── CollectiveNotFound.vue │ ├── CollectivePrint.vue │ ├── Icon │ │ ├── CollectivesIcon.vue │ │ ├── PageIcon.vue │ │ ├── PageTemplateIcon.vue │ │ ├── PagesTemplateIcon.vue │ │ └── TeamsIcon.vue │ ├── LastUserBubble.vue │ ├── Member │ │ ├── CurrentMembers.vue │ │ ├── Hint.vue │ │ ├── Member.vue │ │ ├── MemberPicker.vue │ │ ├── MemberSearchResults.vue │ │ └── SelectedMembers.vue │ ├── Nav │ │ ├── CollectiveListItem.vue │ │ ├── CollectiveMembersModal.vue │ │ ├── CollectiveSettings.vue │ │ ├── CollectivesGlobalSettings.vue │ │ ├── CollectivesTrash.vue │ │ ├── NewCollectiveModal.vue │ │ ├── TemplateListItem.vue │ │ └── TemplatesDialog.vue │ ├── Navigation.vue │ ├── Page.vue │ ├── Page │ │ ├── EditButton.vue │ │ ├── LandingPageWidgets.vue │ │ ├── LandingPageWidgets │ │ │ ├── MembersWidget.vue │ │ │ ├── RecentPageTile.vue │ │ │ ├── RecentPagesWidget.vue │ │ │ └── WidgetHeading.vue │ │ ├── MoveOrCopyModal.vue │ │ ├── PageActionLastUser.vue │ │ ├── PageActionMenu.vue │ │ ├── PageInfoBar.vue │ │ ├── PageNotFound.vue │ │ ├── PagePicker.vue │ │ ├── PageTitle.vue │ │ ├── PageTitleBar.vue │ │ ├── SearchDialog.vue │ │ └── TextEditor.vue │ ├── PageList.vue │ ├── PageList │ │ ├── Draggable.vue │ │ ├── Item.vue │ │ ├── NewPageDialog.vue │ │ ├── PageFavorites.vue │ │ ├── PageTrash.vue │ │ └── SubpageList.vue │ ├── PagePrint.vue │ ├── PageSidebar.vue │ ├── PageSidebar │ │ ├── SharingEntryLink.vue │ │ ├── SidebarTabAttachments.vue │ │ ├── SidebarTabBacklinks.vue │ │ ├── SidebarTabSharing.vue │ │ └── SidebarTabVersions.vue │ ├── PageVersion.vue │ └── SkeletonLoading.vue ├── constants.js ├── css │ ├── animation.scss │ └── editor.scss ├── files.js ├── files │ └── FilesCollectiveHeader.js ├── init.js ├── main.js ├── mixins │ ├── CopyToClipboardMixin.js │ ├── editorMixin.js │ ├── linkHandlerMixin.js │ ├── pageContentMixin.js │ ├── pageMixin.js │ ├── serverCapabilities.js │ └── uniqueIdMixin.js ├── reference.js ├── router.js ├── shared-init.js ├── stores │ ├── circles.js │ ├── collectives.js │ ├── pageExtracts.js │ ├── pages.js │ ├── root.js │ ├── search.js │ ├── sessions.js │ ├── settings.js │ ├── shares.js │ ├── templates.js │ └── versions.js ├── tests │ └── util │ │ ├── randomEmoji.test.js │ │ └── sortOrders.spec.js ├── util │ ├── displayError.js │ ├── randomEmoji.js │ ├── scrollToElement.js │ ├── sortOrders.js │ └── xmlToVersionsList.js └── views │ ├── CollectivePrintView.vue │ ├── CollectiveView.vue │ ├── FileListInfo.vue │ ├── Home.vue │ └── PageReferenceWidget.vue ├── stylelint.config.js ├── templates ├── error.php └── main.php ├── tests ├── Integration │ ├── config │ │ └── behat.yml │ └── features │ │ ├── bootstrap │ │ └── FeatureContext.php │ │ ├── collective.feature │ │ ├── collectiveSession.feature │ │ ├── fixtures │ │ └── test.png │ │ ├── mountpoint.feature │ │ ├── pages.feature │ │ ├── pagesDisabledTrashAndVersion.feature │ │ ├── publicCollectiveShare.feature │ │ ├── publicPageShare.feature │ │ ├── settings.feature │ │ ├── templates.feature │ │ └── userSettings.feature ├── Unit │ ├── ACL │ │ └── ACLStorageWrapperTest.php │ ├── BackgroundJob │ │ └── CollectiveVersionsExpireManagerTest.php │ ├── Controller │ │ └── SettingsControllerTest.php │ ├── Db │ │ ├── CollectiveTest.php │ │ ├── CollectiveUserSettingsMapperTest.php │ │ └── CollectiveUserSettingsTest.php │ ├── Fs │ │ ├── NodeHelperTest.php │ │ └── UserFolderHelperTest.php │ ├── Model │ │ └── PageInfoTest.php │ ├── Mount │ │ └── CollectiveFolderManagerTest.php │ ├── Search │ │ ├── PageContentProviderTest.php │ │ └── SearchablePageReferenceProviderTest.php │ └── Service │ │ ├── AttachmentServiceTest.php │ │ ├── CollectiveServiceTest.php │ │ ├── CollectiveShareServiceTest.php │ │ ├── CollectiveUserSettingsServiceTest.php │ │ ├── PageServiceTest.php │ │ ├── RecentPagesServiceTest.php │ │ └── SubpageOrderServiceTest.php ├── bootstrap.php ├── phpunit.xml ├── psalm-baseline.xml └── stub.phpstub ├── vendor-bin ├── behat │ ├── composer.json │ └── composer.lock ├── cs-fixer │ ├── composer.json │ └── composer.lock ├── phpunit │ ├── composer.json │ └── composer.lock └── psalm │ ├── composer.json │ └── composer.lock └── webpack.js /.dockerignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | node_modules/ 3 | build/ 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_size = 4 9 | indent_style = tab 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.feature] 14 | indent_size = 2 15 | indent_style = space 16 | 17 | [*.yml] 18 | indent_size = 2 19 | indent_style = space 20 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | module.exports = { 7 | extends: [ 8 | '@nextcloud', 9 | "plugin:cypress/recommended", 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | # App maintainers 5 | * @max-nextcloud @mejo- 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | labels: bug 5 | --- 6 | 7 | **Describe the bug** 8 | A clear and concise description of what the bug is. 9 | 10 | **To Reproduce** 11 | Steps to reproduce the behavior: 12 | 1. Go to '...' 13 | 2. Click on '....' 14 | 3. Scroll down to '....' 15 | 4. See error 16 | 17 | **Expected behavior** 18 | A clear and concise description of what you expected to happen. 19 | 20 | **Screenshots** 21 | If applicable, add screenshots to help explain your problem. 22 | 23 | **Server details:** 24 | - Collectives app version: [e.g. 2.16.1; see Nextcloud apps page] 25 | - Nextcloud version: [e.g. 31.0.1] 26 | - PHP Version: [e.g. 8.3] 27 | - Database: [e.g. MariaDB 10.6] 28 | 29 | **Client details:** 30 | - OS: [e.g. Windows/macOS/Ubuntu] 31 | - Browser: [e.g. Firefox, Chrome] 32 | - Browser version: [e.g. 112] 33 | - Device: [e.g. iPhone13, desktop] 34 | 35 |
36 | Logs 37 | 38 | #### Nextcloud log (data/nextcloud.log) 39 | ``` 40 | Insert your Nextcloud log here 41 | ``` 42 | 43 | #### Browser log 44 | ``` 45 | Insert your browser log here, this could for example include: 46 | 47 | a) The javascript console log 48 | b) The network log 49 | c) ... 50 | ``` 51 | 52 |
53 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | labels: enhancement 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | version: 2 5 | updates: 6 | - package-ecosystem: composer 7 | directory: "/" 8 | schedule: 9 | interval: weekly 10 | day: monday 11 | time: "03:00" 12 | timezone: Europe/Paris 13 | open-pull-requests-limit: 10 14 | labels: 15 | - 3. to review 16 | - dependencies 17 | reviewers: 18 | - mejo- 19 | - max-nextcloud 20 | 21 | - package-ecosystem: composer 22 | directories: 23 | - "/vendor-bin/behat" 24 | - "/vendor-bin/cs-fixer" 25 | - "/vendor-bin/phpunit" 26 | - "/vendor-bin/psalm" 27 | schedule: 28 | interval: weekly 29 | day: monday 30 | time: "03:00" 31 | timezone: Europe/Paris 32 | open-pull-requests-limit: 10 33 | labels: 34 | - 3. to review 35 | - dependencies 36 | reviewers: 37 | - mejo- 38 | - max-nextcloud 39 | 40 | - package-ecosystem: github-actions 41 | directory: "/" 42 | schedule: 43 | interval: weekly 44 | day: monday 45 | time: "03:00" 46 | timezone: Europe/Paris 47 | open-pull-requests-limit: 10 48 | labels: 49 | - 3. to review 50 | - dependencies 51 | reviewers: 52 | - mejo- 53 | - max-nextcloud 54 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### 📝 Summary 2 | 3 | * Resolves: # 4 | 5 | 6 | 7 | #### 🖼️ Screenshots 8 | 9 | 🏚️ Before | 🏡 After 10 | ---|--- 11 | B | A 12 | 13 | 14 | ### 🚧 TODO 15 | 16 | - [ ] ... 17 | 18 | ### 🏁 Checklist 19 | 20 | - [ ] Code is properly formatted (`npm run lint` / `npm run stylelint` / `composer run cs:check`) 21 | - [ ] [Sign-off message](https://probot.github.io/apps/dco/) is added to all commits 22 | - [ ] Tests (unit, integration and/or end-to-end) passing and the changes are covered with tests 23 | - [ ] Documentation ([README](https://github.com/nextcloud/collectives/blob/main/README.md) or [documentation](https://github.com/nextcloud/collectives/blob/main/docs/)) has been updated or is not required 24 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | # Number of days of inactivity before an issue becomes stale 5 | daysUntilStale: 30 6 | # Number of days of inactivity before a stale issue is closed 7 | daysUntilClose: 7 8 | # Issues with these labels will never be considered stale 9 | onlyLabels: 10 | - "needs info" 11 | # Label to use when marking an issue as stale 12 | staleLabel: wontfix 13 | # Comment to post when marking an issue as stale. Set to `false` to disable 14 | markComment: > 15 | This issue has been automatically marked as stale because it has not had 16 | recent activity. It will be closed if no further activity occurs. Thank you 17 | for your contributions. 18 | # Comment to post when closing a stale issue. Set to `false` to disable 19 | closeComment: false 20 | -------------------------------------------------------------------------------- /.github/workflows/lint-info-xml.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint info.xml 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-info-xml-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | xml-linters: 22 | runs-on: ubuntu-latest-low 23 | 24 | name: info.xml lint 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 28 | with: 29 | persist-credentials: false 30 | 31 | - name: Download schema 32 | run: wget https://raw.githubusercontent.com/nextcloud/appstore/master/nextcloudappstore/api/v1/release/info.xsd 33 | 34 | - name: Lint info.xml 35 | uses: ChristophWurst/xmllint-action@36f2a302f84f8c83fceea0b9c59e1eb4a616d3c1 # v1.2 36 | with: 37 | xml-file: ./appinfo/info.xml 38 | xml-schema-file: ./info.xsd 39 | -------------------------------------------------------------------------------- /.github/workflows/reuse.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | 6 | # SPDX-FileCopyrightText: 2022 Free Software Foundation Europe e.V. 7 | # 8 | # SPDX-License-Identifier: CC0-1.0 9 | 10 | name: REUSE Compliance Check 11 | 12 | on: [pull_request] 13 | 14 | permissions: 15 | contents: read 16 | 17 | jobs: 18 | reuse-compliance-check: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - name: Checkout 22 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 23 | with: 24 | persist-credentials: false 25 | 26 | - name: REUSE Compliance Check 27 | uses: fsfe/reuse-action@bb774aa972c2a89ff34781233d275075cbddf542 # v5.0.0 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | node_modules/ 3 | /vendor/ 4 | /vendor-bin/*/vendor 5 | 6 | # Editor directories and files 7 | .idea/ 8 | js/* 9 | 10 | # PHPunit cache 11 | .phpunit.result.cache 12 | 13 | # PHP-CS-Fixer cache 14 | .php-cs-fixer.cache 15 | 16 | # Cypress test artifacts 17 | cypress/screenshots/ 18 | cypress/videos/ 19 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "docs/themes/docdock"] 2 | path = docs/themes/docdock 3 | url = https://github.com/vjeantet/hugo-theme-docdock.git 4 | -------------------------------------------------------------------------------- /.l10nignore: -------------------------------------------------------------------------------- 1 | js 2 | node_modules 3 | vendor 4 | build 5 | docs 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | cypress/** 2 | -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | getFinder() 13 | ->ignoreVCSIgnored(true) 14 | ->notPath('build') 15 | ->notPath('l10n') 16 | ->notPath('src') 17 | ->notPath('vendor') 18 | ->in(__DIR__); 19 | return $config; 20 | -------------------------------------------------------------------------------- /.tx/backport: -------------------------------------------------------------------------------- 1 | stable1 2 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk 4 | 5 | [o:nextcloud:p:nextcloud:r:collectives] 6 | file_filter = translationfiles//collectives.po 7 | source_file = translationfiles/templates/collectives.pot 8 | source_lang = en 9 | type = PO 10 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | 5 | 6 | # Authors 7 | 8 | - Arthur Schiwon 9 | - Azul 10 | - Carl Schwan 11 | - Elizabeth Danzberger 12 | - Ferdinand Thiessen 13 | - Hoang Pham 14 | - Jan C. Borchardt 15 | - Jonas 16 | - Julien Veyssier 17 | - Julius Härtl 18 | - Kate 19 | - Konstantin Myakshin 20 | - Luka Trovic 21 | - Max 22 | - Raul 23 | - Salim Belakkaf 24 | - Thomas Citharel 25 | - Vinicius Reis 26 | -------------------------------------------------------------------------------- /LICENSES/MIT.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const babelConfig = require('@nextcloud/babel-config') 7 | 8 | module.exports = babelConfig 9 | -------------------------------------------------------------------------------- /css/collectives.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | .icon-collectives { 7 | background-image: url('../img/collectives-dark.svg'); 8 | filter: var(--background-invert-if-dark); 9 | } 10 | 11 | .icon-collectives-page { 12 | background-image: url('../img/page.svg'); 13 | filter: var(--background-invert-if-dark); 14 | } 15 | -------------------------------------------------------------------------------- /cypress.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const { defineConfig } = require('cypress') 7 | const cypressSplit = require('cypress-split') 8 | 9 | module.exports = defineConfig({ 10 | viewportWidth: 1280, 11 | viewportHeight: 900, 12 | e2e: { 13 | setupNodeEvents(on, config) { 14 | const browserify = require('@cypress/browserify-preprocessor') 15 | const webpack = require('@cypress/webpack-preprocessor') 16 | 17 | on('file:preprocessor', browserify()) 18 | on('file:preprocessor', webpack()) 19 | 20 | cypressSplit(on, config) 21 | 22 | return config 23 | }, 24 | 25 | baseUrl: 'http://localhost:8081/index.php/', 26 | specPattern: 'cypress/e2e/**/*.{js,jsx,ts,tsx}', 27 | }, 28 | defaultCommandTimeout: 7000, 29 | retries: { 30 | runMode: 2, 31 | // do not retry in `cypress open` 32 | openMode: 0, 33 | }, 34 | numTestsKeptInMemory: 5, 35 | }) 36 | -------------------------------------------------------------------------------- /cypress/Dockerfile: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021-2023 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | FROM nextcloud:latest as source 5 | 6 | WORKDIR /tmp 7 | 8 | RUN set -ex; \ 9 | apt-get update; \ 10 | apt-get install -y --no-install-recommends git; 11 | 12 | RUN set -ex; \ 13 | git clone --depth 1 https://github.com/nextcloud/server.git; \ 14 | git clone --depth 1 https://github.com/nextcloud/circles.git server/apps/circles; \ 15 | git clone --depth 1 https://github.com/nextcloud/text.git server/apps/text; \ 16 | git clone --depth 1 https://github.com/nextcloud/viewer.git server/apps/viewer; 17 | 18 | RUN set -ex; \ 19 | cd server; \ 20 | git submodule update --init; 21 | 22 | RUN set -ex; \ 23 | cp -r -v /usr/src/nextcloud/config /tmp/server; 24 | 25 | FROM nextcloud:latest 26 | 27 | RUN set -ex; \ 28 | rm -rf /usr/src/nextcloud; 29 | 30 | COPY --from=source --chown=www-data:www-data /tmp/server /usr/src/nextcloud 31 | 32 | RUN set -ex; \ 33 | cd /usr/src/nextcloud; \ 34 | mkdir data; \ 35 | mkdir custom_apps; \ 36 | chown -R www-data:www-data config data apps custom_apps; 37 | 38 | ENV NEXTCLOUD_ADMIN_PASSWORD=admin 39 | ENV NEXTCLOUD_ADMIN_USER=admin 40 | ENV SQLITE_DATABASE=sqlite_db 41 | 42 | RUN mv /entrypoint.sh /original_entrypoint.sh 43 | 44 | COPY --chown=www-data:www-data --chmod=0755 ./entrypoint.sh /entrypoint.sh 45 | -------------------------------------------------------------------------------- /cypress/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | version: '3' 5 | 6 | services: 7 | nextcloud_cypress: 8 | build: 9 | context: . 10 | network: host 11 | restart: always 12 | ports: 13 | - 8081:80 14 | environment: 15 | - CYPRESS_baseUrl 16 | - APP_SOURCE 17 | volumes: 18 | - type: bind 19 | read_only: true 20 | source: ${APP_SOURCE} 21 | target: /var/www/html/custom_apps/collectives 22 | -------------------------------------------------------------------------------- /cypress/e2e/apps.spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | describe('The apps', function() { 7 | describe('Collectives', function() { 8 | 9 | it('allows creating a new collective', function() { 10 | cy.loginAs('jane') 11 | cy.visit('apps/collectives') 12 | cy.get('#app-navigation-vue') 13 | .should('contain', 'New collective') 14 | }) 15 | }) 16 | 17 | /** 18 | * Regression test for #110 and #117. 19 | * Without the teams app the whole server became unresponsive. 20 | * If we have this regression this test will not only fail 21 | * it will also break all following tests. 22 | * 23 | */ 24 | describe('Disabled teams app does not break files view', function() { 25 | 26 | before(function() { 27 | cy.loginAs('admin') 28 | cy.disableApp('circles') 29 | }) 30 | 31 | after(function() { 32 | cy.loginAs('admin') 33 | cy.enableApp('circles') 34 | }) 35 | 36 | it('Renders the default files list', function() { 37 | cy.loginAs('jane') 38 | cy.visit('apps/files') 39 | cy.fileList().should('contain', 'welcome') 40 | }) 41 | 42 | }) 43 | }) 44 | -------------------------------------------------------------------------------- /cypress/e2e/circle-with-group.spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | /** 7 | * Regression test for #121. 8 | * When user is not a direct member of a team, 9 | * but is a member of a group linked to the team, 10 | * then access to the collective only works half-way: 11 | * You can see the collective on the list, 12 | * but you can't see a list of pages or access any page. 13 | * 14 | */ 15 | describe('Pages are accessible via group membership to team', function() { 16 | before(function() { 17 | cy.loginAs('jane') 18 | cy.deleteAndSeedCollective('Group Collective') 19 | cy.circleFind('Group Collective') 20 | .circleAddMember('Bobs Group', 2) 21 | .circleSetMemberLevel(8) 22 | }) 23 | 24 | it('Lists the collective', function() { 25 | cy.loginAs('bob') 26 | cy.visit('apps/collectives') 27 | cy.get('.app-navigation').contains('Group Collective').click() 28 | cy.getReadOnlyEditor() 29 | .find('h1').should('contain', 'Welcome to your new collective') 30 | }) 31 | }) 32 | -------------------------------------------------------------------------------- /cypress/e2e/collective-page-mode.spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | describe('Collective page mode', function() { 7 | 8 | before(function() { 9 | cy.loginAs('bob') 10 | cy.deleteAndSeedCollective('Our Garden') 11 | .seedPage('Day 1', '', 'Readme.md') 12 | .seedPage('Day 2', '', 'Readme.md') 13 | }) 14 | 15 | beforeEach(function() { 16 | cy.loginAs('bob') 17 | }) 18 | 19 | describe('Changing page mode', function() { 20 | it('Opens edit mode per default', function() { 21 | cy.seedCollectivePageMode('Our Garden', 1) 22 | cy.visit('/apps/collectives/Our Garden') 23 | // make sure the page list loaded properly 24 | cy.contains('.app-content-list-item a', 'Day 1') 25 | cy.openPage('Day 2') 26 | cy.getEditor() 27 | .should('be.visible') 28 | cy.getReadOnlyEditor() 29 | .should('not.be.visible') 30 | }) 31 | 32 | it('Opens view mode per default', function() { 33 | cy.seedCollectivePageMode('Our Garden', 0) 34 | cy.visit('/apps/collectives/Our Garden') 35 | // make sure the page list loaded properly 36 | cy.contains('.app-content-list-item a', 'Day 1') 37 | cy.openPage('Day 2') 38 | cy.getReadOnlyEditor() 39 | .should('be.visible') 40 | cy.getEditor() 41 | .should('not.be.visible') 42 | }) 43 | }) 44 | }) 45 | -------------------------------------------------------------------------------- /cypress/e2e/collective-readonly.spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | describe('Read-only collective', function() { 7 | 8 | before(function() { 9 | cy.loginAs('alice') 10 | cy.deleteAndSeedCollective('PermissionCollective') 11 | .seedPage('SecondPage') 12 | cy.circleFind('PermissionCollective') 13 | .circleAddMember('bob') 14 | cy.seedCollectivePermissions('PermissionCollective', 'edit', 4) 15 | }) 16 | 17 | describe('in read-only collective', function() { 18 | beforeEach(function() { 19 | cy.loginAs('bob') 20 | cy.visit('/apps/collectives/PermissionCollective/SecondPage') 21 | }) 22 | 23 | it('not able to edit collective', function() { 24 | cy.get('[data-cy-collectives="page-title-container"] input').should('have.attr', 'disabled') 25 | cy.get('button.titleform-button').should('not.exist') 26 | cy.get('.app-content-list-item.toplevel') 27 | .find('button.icon.add') 28 | .should('not.exist') 29 | cy.getEditor() 30 | .should('not.exist') 31 | }) 32 | 33 | it('actions menu with outline toggle is there', function() { 34 | cy.get('[data-cy-collectives="page-title-container"] button.action-item__menutoggle') 35 | .click() 36 | cy.get('button.action-button') 37 | .contains('Show outline') 38 | }) 39 | }) 40 | }) 41 | -------------------------------------------------------------------------------- /cypress/e2e/dashboard-widget.spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | describe('Collectives dashboard widget', function() { 7 | describe('Open dashboard widget', function() { 8 | before(function() { 9 | cy.loginAs('bob') 10 | cy.enableDashboardWidget('collectives-recent-pages') 11 | cy.deleteAndSeedCollective('Dashboard Collective1') 12 | .seedPage('Page 1', '', 'Readme.md') 13 | }) 14 | it('Lists pages in the dashboard widget', function() { 15 | cy.visit('/apps/dashboard/') 16 | cy.get('.panel--header') 17 | .contains('Recent pages') 18 | cy.get('.panel--content').as('panelContent') 19 | cy.get('@panelContent') 20 | .find('li').should('contain', 'Landing page') 21 | cy.get('@panelContent') 22 | .find('li').should('contain', 'Page 1') 23 | }) 24 | }) 25 | }) 26 | -------------------------------------------------------------------------------- /cypress/e2e/page-mentions.spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | describe('Page mentions', function() { 7 | if (!['stable29', 'stable30'].includes(Cypress.env('ncVersion'))) { 8 | before(function() { 9 | cy.loginAs('bob') 10 | cy.deleteAndSeedCollective('Mention Collective') 11 | .seedPage('Page 1', '', 'Readme.md') 12 | cy.circleFind('Mention Collective') 13 | .circleAddMember('alice') 14 | 15 | cy.visit('/apps/collectives/Mention Collective/Page 1') 16 | cy.getEditorContent(true) 17 | .type('Bob mentions @alice') 18 | cy.get('.tippy-content') 19 | .contains('alice') 20 | .click() 21 | cy.getEditor() 22 | .find('.save-status') 23 | .click() 24 | }) 25 | 26 | describe('Mentioning another member in a page', function() { 27 | it('Notification is shown to mentioned member', function() { 28 | cy.loginAs('alice') 29 | cy.visit('/apps/collectives/Mention Collective') 30 | cy.get('.notifications-button') 31 | .click() 32 | 33 | cy.get('#header-menu-notifications') 34 | .find('.notification .rich-text--wrapper') 35 | .invoke('text') 36 | .should('match', /bob \s*has mentioned you in .*Mention Collective - .*Page 1/) 37 | }) 38 | }) 39 | } 40 | }) 41 | -------------------------------------------------------------------------------- /cypress/fixtures/test.md: -------------------------------------------------------------------------------- 1 | ## Hello world 2 | -------------------------------------------------------------------------------- /cypress/fixtures/test.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/cypress/fixtures/test.pdf -------------------------------------------------------------------------------- /cypress/fixtures/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/cypress/fixtures/test.png -------------------------------------------------------------------------------- /cypress/runLocal.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | # SPDX-License-Identifier: AGPL-3.0-or-later 4 | 5 | export CYPRESS_baseUrl="${CYPRESS_baseUrl:-http://localhost:8081/index.php}" 6 | export CYPRESS_ncVersion="${CYPRESS_ncVersion:-master}" 7 | export APP_SOURCE="$PWD/.." 8 | export LANG="en_EN.UTF-8" 9 | 10 | function finish { 11 | docker-compose down 12 | } 13 | trap finish EXIT 14 | 15 | if ! npm exec wait-on >/dev/null; then 16 | npm install --no-save wait-on 17 | fi 18 | 19 | # start server if it's not running yet 20 | if npm exec wait-on -- -i 500 -t 2000 "$CYPRESS_baseUrl" 2>/dev/null; then 21 | echo Server is up at "$CYPRESS_baseUrl" 22 | else 23 | echo No server reached at "$CYPRESS_baseUrl" - starting containers. 24 | DOCKER_BUILDKIT=1 docker-compose up -d 25 | if ! npm exec wait-on -- -i 500 -t 240000 "$CYPRESS_baseUrl" 2>/dev/null; then 26 | echo Waiting for "$CYPRESS_baseUrl" timed out. 27 | echo Container logs: 28 | docker-compose logs 29 | exit 1 30 | fi 31 | fi 32 | 33 | (cd .. && npm exec cypress -- "$@") 34 | -------------------------------------------------------------------------------- /cypress/support/e2e.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | // This file is loaded before all e2e tests 7 | 8 | import './commands.js' 9 | import './navigation.js' 10 | -------------------------------------------------------------------------------- /cypress/utils/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const getSearchParams = url => { 7 | return url 8 | .split(/[?&]/) 9 | .reduce((acc, cur) => { 10 | const parts = cur.split('=') 11 | parts[1] && (acc[parts[0]] = parts[1]) 12 | return acc 13 | }, {}) 14 | } 15 | 16 | const randHash = () => Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 10) 17 | 18 | export default { getSearchParams, randHash } 19 | -------------------------------------------------------------------------------- /docs/archetypes/default.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{ replace .Name "-" " " | title }}" 3 | date: {{ .Date }} 4 | draft: true 5 | --- 6 | -------------------------------------------------------------------------------- /docs/content/development/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Developer Documentation" 3 | description = "" 4 | weight = 3 5 | alwaysopen = false 6 | +++ 7 | -------------------------------------------------------------------------------- /docs/static/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | .left { 7 | margin-left: 0; 8 | } 9 | article figure.left > a > img { 10 | margin-left: 0; 11 | } 12 | -------------------------------------------------------------------------------- /docs/static/images/apps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/docs/static/images/apps.png -------------------------------------------------------------------------------- /docs/static/images/bmbf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/docs/static/images/bmbf.jpg -------------------------------------------------------------------------------- /docs/static/images/create-collective.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/docs/static/images/create-collective.gif -------------------------------------------------------------------------------- /docs/static/images/prototype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/docs/static/images/prototype.png -------------------------------------------------------------------------------- /docs/static/images/screenshot-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/docs/static/images/screenshot-small.png -------------------------------------------------------------------------------- /docs/static/images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/docs/static/images/screenshot.png -------------------------------------------------------------------------------- /docs/themes/custom-css/layouts/partials/custom-head.html: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | {{ with .Site.Params.author }}{{ end }} 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/themes/custom-css/theme.toml: -------------------------------------------------------------------------------- 1 | # theme.toml template for a Hugo theme 2 | # See https://github.com/spf13/hugoThemes#themetoml for an example 3 | 4 | # SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 5 | # SPDX-License-Identifier: AGPL-3.0-or-later 6 | 7 | name = "custom" 8 | license = "MIT" 9 | licenselink = "https://github.com/vjeantet/hugo-theme-docdock/blob/master/LICENSE.md" 10 | description = "Customization of the docdock theme for collectives" 11 | tags = ["documentation", "custom"] 12 | min_version = 0.42 13 | 14 | [author] 15 | name = "Azul" 16 | -------------------------------------------------------------------------------- /img/collectives-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /img/collectives.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /img/folder-collective.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /img/page.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /jest.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "verbose": true, 3 | "transform": { 4 | "^.+\\.js$": "/node_modules/babel-jest" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "vueCompilerOptions": { 3 | "target": 2.7 4 | }, 5 | "include": [ 6 | "./src/**/*" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /l10n/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /l10n/af.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Deel skakel", 5 | "Settings" : "Instellings", 6 | "Loading…" : "Laai…", 7 | "View" : "Bekyk", 8 | "Edit" : "Wysig", 9 | "Choose" : "Kies", 10 | "Restore" : "Herstel", 11 | "Delete permanently" : "Skrap permanent", 12 | "Cancel" : "Kanselleer", 13 | "Create" : "Skep", 14 | "Back" : "Terug", 15 | "Delete" : "Skrap", 16 | "Done" : "Gereed", 17 | "Move or copy" : "Kopieer of skuif", 18 | "Title" : "Titel", 19 | "Favorites" : "Gunstelinge", 20 | "Deleted" : "Geskrap", 21 | "Can edit" : "Kan redigeer", 22 | "Advanced settings" : "Gevorderde instellings", 23 | "Unshare" : "Ontdeel", 24 | "Download" : "Laai af", 25 | "Versions" : "Weergawes", 26 | "Link copied" : "Skakel gekopieer", 27 | "Copied" : "Gekopieer" 28 | }, 29 | "nplurals=2; plural=(n != 1);"); 30 | -------------------------------------------------------------------------------- /l10n/af.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Deel skakel", 3 | "Settings" : "Instellings", 4 | "Loading…" : "Laai…", 5 | "View" : "Bekyk", 6 | "Edit" : "Wysig", 7 | "Choose" : "Kies", 8 | "Restore" : "Herstel", 9 | "Delete permanently" : "Skrap permanent", 10 | "Cancel" : "Kanselleer", 11 | "Create" : "Skep", 12 | "Back" : "Terug", 13 | "Delete" : "Skrap", 14 | "Done" : "Gereed", 15 | "Move or copy" : "Kopieer of skuif", 16 | "Title" : "Titel", 17 | "Favorites" : "Gunstelinge", 18 | "Deleted" : "Geskrap", 19 | "Can edit" : "Kan redigeer", 20 | "Advanced settings" : "Gevorderde instellings", 21 | "Unshare" : "Ontdeel", 22 | "Download" : "Laai af", 23 | "Versions" : "Weergawes", 24 | "Link copied" : "Skakel gekopieer", 25 | "Copied" : "Gekopieer" 26 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 27 | } -------------------------------------------------------------------------------- /l10n/az.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "%s-in yayimlanmasına sizə izin verilmir", 5 | "Share link" : "Linki yayımla", 6 | "Settings" : "Quraşdırmalar", 7 | "Edit" : "Dəyişiklik et", 8 | "Choose" : "Seç", 9 | "Restore" : "Geri qaytar", 10 | "Delete permanently" : "Həmişəlik sil", 11 | "Cancel" : "Dayandır", 12 | "Create" : "Yarat", 13 | "Back" : "Geri", 14 | "Delete" : "Sil", 15 | "Rename" : "Adı dəyiş", 16 | "Done" : "Done", 17 | "Move or copy" : "Köçürt və ya kopyala", 18 | "Title" : "Başlıq", 19 | "Favorite" : "İstəkli", 20 | "Favorites" : "Sevimlilər", 21 | "Deleted" : "Silinib", 22 | "Add another link" : "Başqa link əlavə edin", 23 | "Advanced settings" : "İrəliləmiş quraşdırmalar", 24 | "Unshare" : "Paylaşımı durdur", 25 | "Download" : "Yüklə", 26 | "No other versions available" : "Başqa versiyalar mövcud deyil", 27 | "Sharing" : "Paylaşılır", 28 | "Versions" : "Versiyaları", 29 | "Link copied" : "Link kopyalandı" 30 | }, 31 | "nplurals=2; plural=(n != 1);"); 32 | -------------------------------------------------------------------------------- /l10n/az.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "%s-in yayimlanmasına sizə izin verilmir", 3 | "Share link" : "Linki yayımla", 4 | "Settings" : "Quraşdırmalar", 5 | "Edit" : "Dəyişiklik et", 6 | "Choose" : "Seç", 7 | "Restore" : "Geri qaytar", 8 | "Delete permanently" : "Həmişəlik sil", 9 | "Cancel" : "Dayandır", 10 | "Create" : "Yarat", 11 | "Back" : "Geri", 12 | "Delete" : "Sil", 13 | "Rename" : "Adı dəyiş", 14 | "Done" : "Done", 15 | "Move or copy" : "Köçürt və ya kopyala", 16 | "Title" : "Başlıq", 17 | "Favorite" : "İstəkli", 18 | "Favorites" : "Sevimlilər", 19 | "Deleted" : "Silinib", 20 | "Add another link" : "Başqa link əlavə edin", 21 | "Advanced settings" : "İrəliləmiş quraşdırmalar", 22 | "Unshare" : "Paylaşımı durdur", 23 | "Download" : "Yüklə", 24 | "No other versions available" : "Başqa versiyalar mövcud deyil", 25 | "Sharing" : "Paylaşılır", 26 | "Versions" : "Versiyaları", 27 | "Link copied" : "Link kopyalandı" 28 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 29 | } -------------------------------------------------------------------------------- /l10n/bn_BD.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা", 5 | "Share link" : "লিংক ভাগাভাগি করেন", 6 | "Settings" : "সেটিংস", 7 | "Edit" : "সম্পাদনা", 8 | "Choose" : "বেছে নিন", 9 | "Restore" : "ফিরিয়ে দাও", 10 | "Cancel" : "বাতির", 11 | "Create" : "তৈরী কর", 12 | "Back" : "পেছনে যাও", 13 | "Delete" : "মুছে", 14 | "Rename" : "পূনঃনামকরণ", 15 | "Done" : "Done", 16 | "Title" : "শিরোনাম", 17 | "Favorite" : "প্রিয়জন", 18 | "Favorites" : "প্রিয়জন", 19 | "Deleted" : "মুছে ফেলা", 20 | "Unshare" : "ভাগাভাগি বাতিল ", 21 | "Download" : "ডাউনলোড", 22 | "No other versions available" : "আর কোন সংষ্করণ প্রাপ্তব্য নয়", 23 | "Sharing" : "ভাগাভাগিরত", 24 | "Versions" : "সংষ্করন" 25 | }, 26 | "nplurals=2; plural=(n != 1);"); 27 | -------------------------------------------------------------------------------- /l10n/bn_BD.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "আপনি %s ভাগাভাগি করতে পারবেননা", 3 | "Share link" : "লিংক ভাগাভাগি করেন", 4 | "Settings" : "সেটিংস", 5 | "Edit" : "সম্পাদনা", 6 | "Choose" : "বেছে নিন", 7 | "Restore" : "ফিরিয়ে দাও", 8 | "Cancel" : "বাতির", 9 | "Create" : "তৈরী কর", 10 | "Back" : "পেছনে যাও", 11 | "Delete" : "মুছে", 12 | "Rename" : "পূনঃনামকরণ", 13 | "Done" : "Done", 14 | "Title" : "শিরোনাম", 15 | "Favorite" : "প্রিয়জন", 16 | "Favorites" : "প্রিয়জন", 17 | "Deleted" : "মুছে ফেলা", 18 | "Unshare" : "ভাগাভাগি বাতিল ", 19 | "Download" : "ডাউনলোড", 20 | "No other versions available" : "আর কোন সংষ্করণ প্রাপ্তব্য নয়", 21 | "Sharing" : "ভাগাভাগিরত", 22 | "Versions" : "সংষ্করন" 23 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 24 | } -------------------------------------------------------------------------------- /l10n/bs.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Podijelite vezu", 5 | "Settings" : "Podešavanje", 6 | "Members" : "Članovi", 7 | "Edit" : "Izmjeni", 8 | "Choose" : "Izaberite", 9 | "Restore" : "Obnovi", 10 | "Cancel" : "Otkaži", 11 | "Create" : "Ustvari", 12 | "Delete" : "Obriši", 13 | "Rename" : "Preimenuj", 14 | "Done" : "Done", 15 | "Title" : "Naslov", 16 | "Favorite" : "Favorit", 17 | "Favorites" : "Favoriti", 18 | "Unshare" : "Prestani dijeliti", 19 | "Download" : "Preuzmi", 20 | "No other versions available" : "Druge verzije su nedostupne", 21 | "Sharing" : "Dijeljenje", 22 | "Versions" : "Verzije" 23 | }, 24 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 25 | -------------------------------------------------------------------------------- /l10n/bs.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Podijelite vezu", 3 | "Settings" : "Podešavanje", 4 | "Members" : "Članovi", 5 | "Edit" : "Izmjeni", 6 | "Choose" : "Izaberite", 7 | "Restore" : "Obnovi", 8 | "Cancel" : "Otkaži", 9 | "Create" : "Ustvari", 10 | "Delete" : "Obriši", 11 | "Rename" : "Preimenuj", 12 | "Done" : "Done", 13 | "Title" : "Naslov", 14 | "Favorite" : "Favorit", 15 | "Favorites" : "Favoriti", 16 | "Unshare" : "Prestani dijeliti", 17 | "Download" : "Preuzmi", 18 | "No other versions available" : "Druge verzije su nedostupne", 19 | "Sharing" : "Dijeljenje", 20 | "Versions" : "Verzije" 21 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" 22 | } -------------------------------------------------------------------------------- /l10n/cy_GB.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Rhannu dolen", 5 | "Settings" : "Gosodiadau", 6 | "Loading…" : "Yn llwytho…", 7 | "View" : "Golwg", 8 | "Edit" : "Golygu", 9 | "Choose" : "Dewisa", 10 | "Restore" : "Adfer", 11 | "Delete permanently" : "Dileu'n barhaol", 12 | "Cancel" : "Diddymu", 13 | "Create" : "Creu", 14 | "Back" : "Nôl", 15 | "Delete" : "Dileu", 16 | "Rename" : "Ailenwi", 17 | "Done" : "Done", 18 | "Title" : "Teitl", 19 | "Favorite" : "Ffefryn", 20 | "Favorites" : "Ffefrynnau", 21 | "Deleted" : "Wedi dileu", 22 | "Add another link" : "Ychwanegu dolen arall", 23 | "Unshare" : "Dad-rannu", 24 | "Download" : "Llwytho i lawr", 25 | "Link copied" : "Dolen wedi'i gopïo", 26 | "Copied" : "Copïwyd" 27 | }, 28 | "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); 29 | -------------------------------------------------------------------------------- /l10n/cy_GB.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Rhannu dolen", 3 | "Settings" : "Gosodiadau", 4 | "Loading…" : "Yn llwytho…", 5 | "View" : "Golwg", 6 | "Edit" : "Golygu", 7 | "Choose" : "Dewisa", 8 | "Restore" : "Adfer", 9 | "Delete permanently" : "Dileu'n barhaol", 10 | "Cancel" : "Diddymu", 11 | "Create" : "Creu", 12 | "Back" : "Nôl", 13 | "Delete" : "Dileu", 14 | "Rename" : "Ailenwi", 15 | "Done" : "Done", 16 | "Title" : "Teitl", 17 | "Favorite" : "Ffefryn", 18 | "Favorites" : "Ffefrynnau", 19 | "Deleted" : "Wedi dileu", 20 | "Add another link" : "Ychwanegu dolen arall", 21 | "Unshare" : "Dad-rannu", 22 | "Download" : "Llwytho i lawr", 23 | "Link copied" : "Dolen wedi'i gopïo", 24 | "Copied" : "Copïwyd" 25 | },"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" 26 | } -------------------------------------------------------------------------------- /l10n/es_419.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Ajustes", 7 | "Members" : "Miembros", 8 | "Permissions" : "Permisos", 9 | "Edit" : "Editar", 10 | "Choose" : "Seleccionar", 11 | "Restore" : "Restaurar", 12 | "Delete permanently" : "Borrar permanentemente", 13 | "Cancel" : "Cancelar", 14 | "Create" : "Crear", 15 | "Back" : "Atrás", 16 | "Delete" : "Borrar", 17 | "Done" : "Terminado", 18 | "Add to favorites" : "Agregar a favoritos", 19 | "Move or copy" : "Mover o copiar", 20 | "Title" : "Título", 21 | "Favorite" : "Favorito", 22 | "Favorites" : "Favoritos", 23 | "Deleted" : "Borrado", 24 | "Password" : "Clave", 25 | "Add another link" : "Agregar otra liga", 26 | "Advanced settings" : "Configuraciones avanzados", 27 | "Unshare" : "Dejar de compartir", 28 | "Download" : "Descargar", 29 | "Sharing" : "Compartiendo", 30 | "Versions" : "Versiones" 31 | }, 32 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 33 | -------------------------------------------------------------------------------- /l10n/es_419.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Ajustes", 5 | "Members" : "Miembros", 6 | "Permissions" : "Permisos", 7 | "Edit" : "Editar", 8 | "Choose" : "Seleccionar", 9 | "Restore" : "Restaurar", 10 | "Delete permanently" : "Borrar permanentemente", 11 | "Cancel" : "Cancelar", 12 | "Create" : "Crear", 13 | "Back" : "Atrás", 14 | "Delete" : "Borrar", 15 | "Done" : "Terminado", 16 | "Add to favorites" : "Agregar a favoritos", 17 | "Move or copy" : "Mover o copiar", 18 | "Title" : "Título", 19 | "Favorite" : "Favorito", 20 | "Favorites" : "Favoritos", 21 | "Deleted" : "Borrado", 22 | "Password" : "Clave", 23 | "Add another link" : "Agregar otra liga", 24 | "Advanced settings" : "Configuraciones avanzados", 25 | "Unshare" : "Dejar de compartir", 26 | "Download" : "Descargar", 27 | "Sharing" : "Compartiendo", 28 | "Versions" : "Versiones" 29 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 30 | } -------------------------------------------------------------------------------- /l10n/es_CL.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Remove" : "Remover", 9 | "Loading…" : "Cargando...", 10 | "Permissions" : "Permisos", 11 | "Edit" : "Editar", 12 | "Choose" : "Seleccionar", 13 | "Restore" : "Restaurar", 14 | "Delete permanently" : "Borrar permanentemente", 15 | "Cancel" : "Cancelar", 16 | "Create" : "Crear", 17 | "Back" : "Atrás", 18 | "Delete" : "Eliminar", 19 | "Rename" : "Renombrar", 20 | "Done" : "Terminado", 21 | "Add to favorites" : "Agregar a favoritos", 22 | "Move or copy" : "Mover o copiar", 23 | "Title" : "Título", 24 | "Favorite" : "Favorito", 25 | "Favorites" : "Favoritos", 26 | "Deleted" : "Borrado", 27 | "Password" : "Clave", 28 | "Add another link" : "Agregar otro enlace", 29 | "Advanced settings" : "Configuraciones avanzados", 30 | "Unshare" : "Dejar de compartir", 31 | "Download" : "Descargar", 32 | "Sharing" : "Compartiendo", 33 | "Versions" : "Versiones" 34 | }, 35 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 36 | -------------------------------------------------------------------------------- /l10n/es_CL.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Remove" : "Remover", 7 | "Loading…" : "Cargando...", 8 | "Permissions" : "Permisos", 9 | "Edit" : "Editar", 10 | "Choose" : "Seleccionar", 11 | "Restore" : "Restaurar", 12 | "Delete permanently" : "Borrar permanentemente", 13 | "Cancel" : "Cancelar", 14 | "Create" : "Crear", 15 | "Back" : "Atrás", 16 | "Delete" : "Eliminar", 17 | "Rename" : "Renombrar", 18 | "Done" : "Terminado", 19 | "Add to favorites" : "Agregar a favoritos", 20 | "Move or copy" : "Mover o copiar", 21 | "Title" : "Título", 22 | "Favorite" : "Favorito", 23 | "Favorites" : "Favoritos", 24 | "Deleted" : "Borrado", 25 | "Password" : "Clave", 26 | "Add another link" : "Agregar otro enlace", 27 | "Advanced settings" : "Configuraciones avanzados", 28 | "Unshare" : "Dejar de compartir", 29 | "Download" : "Descargar", 30 | "Sharing" : "Compartiendo", 31 | "Versions" : "Versiones" 32 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 33 | } -------------------------------------------------------------------------------- /l10n/es_CO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir enlace", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Done" : "Terminado", 19 | "Add to favorites" : "Agregar a favoritos", 20 | "Move or copy" : "Mover o copiar", 21 | "Title" : "Título", 22 | "Favorites" : "Favoritos", 23 | "Deleted" : "Borrado", 24 | "Can edit" : "Puede editar", 25 | "Add another link" : "Añadir otro enlace", 26 | "Advanced settings" : "Configuraciones avanzados", 27 | "Unshare" : "Dejar de compartir", 28 | "Sharing" : "Compartiendo", 29 | "Versions" : "Versiones", 30 | "Link copied" : "Enlace copiado" 31 | }, 32 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 33 | -------------------------------------------------------------------------------- /l10n/es_CO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir enlace", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Done" : "Terminado", 17 | "Add to favorites" : "Agregar a favoritos", 18 | "Move or copy" : "Mover o copiar", 19 | "Title" : "Título", 20 | "Favorites" : "Favoritos", 21 | "Deleted" : "Borrado", 22 | "Can edit" : "Puede editar", 23 | "Add another link" : "Añadir otro enlace", 24 | "Advanced settings" : "Configuraciones avanzados", 25 | "Unshare" : "Dejar de compartir", 26 | "Sharing" : "Compartiendo", 27 | "Versions" : "Versiones", 28 | "Link copied" : "Enlace copiado" 29 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 30 | } -------------------------------------------------------------------------------- /l10n/es_CR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando...", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Done" : "Terminado", 19 | "Add to favorites" : "Agregar a favoritos", 20 | "Move or copy" : "Mover o copiar", 21 | "Title" : "Título", 22 | "Favorite" : "Favorito", 23 | "Favorites" : "Favoritos", 24 | "Deleted" : "Borrado", 25 | "Can edit" : "Puede editar", 26 | "Advanced settings" : "Configuraciones avanzados", 27 | "Unshare" : "Dejar de compartir", 28 | "Sharing" : "Compartiendo", 29 | "Versions" : "Versiones" 30 | }, 31 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 32 | -------------------------------------------------------------------------------- /l10n/es_CR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando...", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Done" : "Terminado", 17 | "Add to favorites" : "Agregar a favoritos", 18 | "Move or copy" : "Mover o copiar", 19 | "Title" : "Título", 20 | "Favorite" : "Favorito", 21 | "Favorites" : "Favoritos", 22 | "Deleted" : "Borrado", 23 | "Can edit" : "Puede editar", 24 | "Advanced settings" : "Configuraciones avanzados", 25 | "Unshare" : "Dejar de compartir", 26 | "Sharing" : "Compartiendo", 27 | "Versions" : "Versiones" 28 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 29 | } -------------------------------------------------------------------------------- /l10n/es_DO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando...", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Rename" : "Renombrar", 19 | "Done" : "Terminado", 20 | "Add to favorites" : "Agregar a favoritos", 21 | "Move or copy" : "Mover o copiar", 22 | "Title" : "Título", 23 | "Favorite" : "Favorito", 24 | "Favorites" : "Favoritos", 25 | "Deleted" : "Borrado", 26 | "Can edit" : "Puede editar", 27 | "Add another link" : "Añadir otro enlace", 28 | "Advanced settings" : "Configuraciones avanzados", 29 | "Unshare" : "Dejar de compartir", 30 | "Download" : "Descargar", 31 | "Sharing" : "Compartiendo", 32 | "Versions" : "Versiones" 33 | }, 34 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 35 | -------------------------------------------------------------------------------- /l10n/es_DO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando...", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Rename" : "Renombrar", 17 | "Done" : "Terminado", 18 | "Add to favorites" : "Agregar a favoritos", 19 | "Move or copy" : "Mover o copiar", 20 | "Title" : "Título", 21 | "Favorite" : "Favorito", 22 | "Favorites" : "Favoritos", 23 | "Deleted" : "Borrado", 24 | "Can edit" : "Puede editar", 25 | "Add another link" : "Añadir otro enlace", 26 | "Advanced settings" : "Configuraciones avanzados", 27 | "Unshare" : "Dejar de compartir", 28 | "Download" : "Descargar", 29 | "Sharing" : "Compartiendo", 30 | "Versions" : "Versiones" 31 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 32 | } -------------------------------------------------------------------------------- /l10n/es_GT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Rename" : "Renombrar", 19 | "Done" : "Terminado", 20 | "Add to favorites" : "Agregar a favoritos", 21 | "Move or copy" : "Mover o copiar", 22 | "Title" : "Título", 23 | "Favorite" : "Favorito", 24 | "Favorites" : "Favoritos", 25 | "Deleted" : "Borrado", 26 | "Can edit" : "Puede editar", 27 | "Advanced settings" : "Configuraciones avanzados", 28 | "Unshare" : "Dejar de compartir", 29 | "Download" : "Descargar", 30 | "Sharing" : "Compartiendo", 31 | "Versions" : "Versiones" 32 | }, 33 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 34 | -------------------------------------------------------------------------------- /l10n/es_GT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Rename" : "Renombrar", 17 | "Done" : "Terminado", 18 | "Add to favorites" : "Agregar a favoritos", 19 | "Move or copy" : "Mover o copiar", 20 | "Title" : "Título", 21 | "Favorite" : "Favorito", 22 | "Favorites" : "Favoritos", 23 | "Deleted" : "Borrado", 24 | "Can edit" : "Puede editar", 25 | "Advanced settings" : "Configuraciones avanzados", 26 | "Unshare" : "Dejar de compartir", 27 | "Download" : "Descargar", 28 | "Sharing" : "Compartiendo", 29 | "Versions" : "Versiones" 30 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 31 | } -------------------------------------------------------------------------------- /l10n/es_HN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando...", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Rename" : "Renombrar", 19 | "Done" : "Terminado", 20 | "Add to favorites" : "Agregar a favoritos", 21 | "Move or copy" : "Mover o copiar", 22 | "Title" : "Título", 23 | "Favorite" : "Favorito", 24 | "Favorites" : "Favoritos", 25 | "Deleted" : "Borrado", 26 | "Advanced settings" : "Configuraciones avanzados", 27 | "Unshare" : "Dejar de compartir", 28 | "Download" : "Descargar", 29 | "Sharing" : "Compartiendo", 30 | "Versions" : "Versiones" 31 | }, 32 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 33 | -------------------------------------------------------------------------------- /l10n/es_HN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando...", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Rename" : "Renombrar", 17 | "Done" : "Terminado", 18 | "Add to favorites" : "Agregar a favoritos", 19 | "Move or copy" : "Mover o copiar", 20 | "Title" : "Título", 21 | "Favorite" : "Favorito", 22 | "Favorites" : "Favoritos", 23 | "Deleted" : "Borrado", 24 | "Advanced settings" : "Configuraciones avanzados", 25 | "Unshare" : "Dejar de compartir", 26 | "Download" : "Descargar", 27 | "Sharing" : "Compartiendo", 28 | "Versions" : "Versiones" 29 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 30 | } -------------------------------------------------------------------------------- /l10n/es_NI.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando...", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Done" : "Terminado", 19 | "Add to favorites" : "Agregar a favoritos", 20 | "Move or copy" : "Mover o copiar", 21 | "Title" : "Título", 22 | "Favorite" : "Favorito", 23 | "Favorites" : "Favoritos", 24 | "Deleted" : "Borrado", 25 | "Advanced settings" : "Configuraciones avanzados", 26 | "Unshare" : "Dejar de compartir", 27 | "Download" : "Descargar", 28 | "Sharing" : "Compartiendo", 29 | "Versions" : "Versiones" 30 | }, 31 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 32 | -------------------------------------------------------------------------------- /l10n/es_NI.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando...", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Done" : "Terminado", 17 | "Add to favorites" : "Agregar a favoritos", 18 | "Move or copy" : "Mover o copiar", 19 | "Title" : "Título", 20 | "Favorite" : "Favorito", 21 | "Favorites" : "Favoritos", 22 | "Deleted" : "Borrado", 23 | "Advanced settings" : "Configuraciones avanzados", 24 | "Unshare" : "Dejar de compartir", 25 | "Download" : "Descargar", 26 | "Sharing" : "Compartiendo", 27 | "Versions" : "Versiones" 28 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 29 | } -------------------------------------------------------------------------------- /l10n/es_PA.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Permissions" : "Permisos", 9 | "Edit" : "Editar", 10 | "Choose" : "Seleccionar", 11 | "Restore" : "Restaurar", 12 | "Delete permanently" : "Borrar permanentemente", 13 | "Cancel" : "Cancelar", 14 | "Create" : "Crear", 15 | "Back" : "Atrás", 16 | "Delete" : "Borrar", 17 | "Rename" : "Renombrar", 18 | "Done" : "Terminado", 19 | "Add to favorites" : "Agregar a favoritos", 20 | "Move or copy" : "Mover o copiar", 21 | "Title" : "Título", 22 | "Favorite" : "Favorito", 23 | "Favorites" : "Favoritos", 24 | "Deleted" : "Borrado", 25 | "Can edit" : "Puede editar", 26 | "Advanced settings" : "Configuraciones avanzados", 27 | "Unshare" : "Dejar de compartir", 28 | "Download" : "Descargar", 29 | "Sharing" : "Compartiendo", 30 | "Versions" : "Versiones" 31 | }, 32 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 33 | -------------------------------------------------------------------------------- /l10n/es_PA.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Permissions" : "Permisos", 7 | "Edit" : "Editar", 8 | "Choose" : "Seleccionar", 9 | "Restore" : "Restaurar", 10 | "Delete permanently" : "Borrar permanentemente", 11 | "Cancel" : "Cancelar", 12 | "Create" : "Crear", 13 | "Back" : "Atrás", 14 | "Delete" : "Borrar", 15 | "Rename" : "Renombrar", 16 | "Done" : "Terminado", 17 | "Add to favorites" : "Agregar a favoritos", 18 | "Move or copy" : "Mover o copiar", 19 | "Title" : "Título", 20 | "Favorite" : "Favorito", 21 | "Favorites" : "Favoritos", 22 | "Deleted" : "Borrado", 23 | "Can edit" : "Puede editar", 24 | "Advanced settings" : "Configuraciones avanzados", 25 | "Unshare" : "Dejar de compartir", 26 | "Download" : "Descargar", 27 | "Sharing" : "Compartiendo", 28 | "Versions" : "Versiones" 29 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 30 | } -------------------------------------------------------------------------------- /l10n/es_PE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Ajustes", 7 | "Members" : "Miembros", 8 | "Permissions" : "Permisos", 9 | "Edit" : "Editar", 10 | "Choose" : "Seleccionar", 11 | "Restore" : "Restaurar", 12 | "Delete permanently" : "Borrar permanentemente", 13 | "Cancel" : "Cancelar", 14 | "Create" : "Crear", 15 | "Back" : "Atrás", 16 | "Delete" : "Borrar", 17 | "Rename" : "Renombrar", 18 | "Done" : "Terminado", 19 | "Add to favorites" : "Agregar a favoritos", 20 | "Move or copy" : "Mover o copiar", 21 | "Title" : "Título", 22 | "Favorite" : "Favorito", 23 | "Favorites" : "Favoritos", 24 | "Deleted" : "Borrado", 25 | "Can edit" : "Puede editar", 26 | "Advanced settings" : "Configuraciones avanzados", 27 | "Unshare" : "Dejar de compartir", 28 | "Download" : "Descargar", 29 | "Sharing" : "Compartiendo", 30 | "Versions" : "Versiones" 31 | }, 32 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 33 | -------------------------------------------------------------------------------- /l10n/es_PE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Ajustes", 5 | "Members" : "Miembros", 6 | "Permissions" : "Permisos", 7 | "Edit" : "Editar", 8 | "Choose" : "Seleccionar", 9 | "Restore" : "Restaurar", 10 | "Delete permanently" : "Borrar permanentemente", 11 | "Cancel" : "Cancelar", 12 | "Create" : "Crear", 13 | "Back" : "Atrás", 14 | "Delete" : "Borrar", 15 | "Rename" : "Renombrar", 16 | "Done" : "Terminado", 17 | "Add to favorites" : "Agregar a favoritos", 18 | "Move or copy" : "Mover o copiar", 19 | "Title" : "Título", 20 | "Favorite" : "Favorito", 21 | "Favorites" : "Favoritos", 22 | "Deleted" : "Borrado", 23 | "Can edit" : "Puede editar", 24 | "Advanced settings" : "Configuraciones avanzados", 25 | "Unshare" : "Dejar de compartir", 26 | "Download" : "Descargar", 27 | "Sharing" : "Compartiendo", 28 | "Versions" : "Versiones" 29 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 30 | } -------------------------------------------------------------------------------- /l10n/es_PR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando...", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Rename" : "Renombrar", 19 | "Done" : "Terminado", 20 | "Add to favorites" : "Agregar a favoritos", 21 | "Move or copy" : "Mover o copiar", 22 | "Title" : "Título", 23 | "Favorite" : "Favorito", 24 | "Favorites" : "Favoritos", 25 | "Deleted" : "Borrado", 26 | "Can edit" : "Puede editar", 27 | "Advanced settings" : "Configuraciones avanzados", 28 | "Unshare" : "Dejar de compartir", 29 | "Download" : "Descargar", 30 | "Sharing" : "Compartiendo", 31 | "Versions" : "Versiones" 32 | }, 33 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 34 | -------------------------------------------------------------------------------- /l10n/es_PR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando...", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Rename" : "Renombrar", 17 | "Done" : "Terminado", 18 | "Add to favorites" : "Agregar a favoritos", 19 | "Move or copy" : "Mover o copiar", 20 | "Title" : "Título", 21 | "Favorite" : "Favorito", 22 | "Favorites" : "Favoritos", 23 | "Deleted" : "Borrado", 24 | "Can edit" : "Puede editar", 25 | "Advanced settings" : "Configuraciones avanzados", 26 | "Unshare" : "Dejar de compartir", 27 | "Download" : "Descargar", 28 | "Sharing" : "Compartiendo", 29 | "Versions" : "Versiones" 30 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 31 | } -------------------------------------------------------------------------------- /l10n/es_PY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando...", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Done" : "Terminado", 19 | "Add to favorites" : "Agregar a favoritos", 20 | "Move or copy" : "Mover o copiar", 21 | "Title" : "Título", 22 | "Favorite" : "Favorito", 23 | "Favorites" : "Favoritos", 24 | "Deleted" : "Borrado", 25 | "Can edit" : "Puede editar", 26 | "Advanced settings" : "Configuraciones avanzados", 27 | "Unshare" : "Dejar de compartir", 28 | "Download" : "Descargar", 29 | "Sharing" : "Compartiendo", 30 | "Versions" : "Versiones" 31 | }, 32 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 33 | -------------------------------------------------------------------------------- /l10n/es_PY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando...", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Done" : "Terminado", 17 | "Add to favorites" : "Agregar a favoritos", 18 | "Move or copy" : "Mover o copiar", 19 | "Title" : "Título", 20 | "Favorite" : "Favorito", 21 | "Favorites" : "Favoritos", 22 | "Deleted" : "Borrado", 23 | "Can edit" : "Puede editar", 24 | "Advanced settings" : "Configuraciones avanzados", 25 | "Unshare" : "Dejar de compartir", 26 | "Download" : "Descargar", 27 | "Sharing" : "Compartiendo", 28 | "Versions" : "Versiones" 29 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 30 | } -------------------------------------------------------------------------------- /l10n/es_SV.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando...", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Rename" : "Renombrar", 19 | "Done" : "Terminado", 20 | "Add to favorites" : "Agregar a favoritos", 21 | "Move or copy" : "Mover o copiar", 22 | "Title" : "Título", 23 | "Favorite" : "Favorito", 24 | "Favorites" : "Favoritos", 25 | "Deleted" : "Borrado", 26 | "Can edit" : "Puede editar", 27 | "Advanced settings" : "Configuraciones avanzados", 28 | "Unshare" : "Dejar de compartir", 29 | "Download" : "Descargar", 30 | "Sharing" : "Compartiendo", 31 | "Versions" : "Versiones" 32 | }, 33 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 34 | -------------------------------------------------------------------------------- /l10n/es_SV.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando...", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Rename" : "Renombrar", 17 | "Done" : "Terminado", 18 | "Add to favorites" : "Agregar a favoritos", 19 | "Move or copy" : "Mover o copiar", 20 | "Title" : "Título", 21 | "Favorite" : "Favorito", 22 | "Favorites" : "Favoritos", 23 | "Deleted" : "Borrado", 24 | "Can edit" : "Puede editar", 25 | "Advanced settings" : "Configuraciones avanzados", 26 | "Unshare" : "Dejar de compartir", 27 | "Download" : "Descargar", 28 | "Sharing" : "Compartiendo", 29 | "Versions" : "Versiones" 30 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 31 | } -------------------------------------------------------------------------------- /l10n/es_UY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 5 | "Share link" : "Compartir liga", 6 | "Settings" : "Configuraciones ", 7 | "Members" : "Miembros", 8 | "Loading…" : "Cargando...", 9 | "Permissions" : "Permisos", 10 | "Edit" : "Editar", 11 | "Choose" : "Seleccionar", 12 | "Restore" : "Restaurar", 13 | "Delete permanently" : "Borrar permanentemente", 14 | "Cancel" : "Cancelar", 15 | "Create" : "Crear", 16 | "Back" : "Atrás", 17 | "Delete" : "Borrar", 18 | "Rename" : "Renombrar", 19 | "Done" : "Terminado", 20 | "Add to favorites" : "Agregar a favoritos", 21 | "Move or copy" : "Mover o copiar", 22 | "Title" : "Título", 23 | "Favorite" : "Favorito", 24 | "Favorites" : "Favoritos", 25 | "Deleted" : "Borrado", 26 | "Add another link" : "Añadir otro enlace", 27 | "Advanced settings" : "Configuraciones avanzados", 28 | "Unshare" : "Dejar de compartir", 29 | "Download" : "Descargar", 30 | "Sharing" : "Compartiendo", 31 | "Versions" : "Versiones" 32 | }, 33 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 34 | -------------------------------------------------------------------------------- /l10n/es_UY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "No tienes permitido compartir %s", 3 | "Share link" : "Compartir liga", 4 | "Settings" : "Configuraciones ", 5 | "Members" : "Miembros", 6 | "Loading…" : "Cargando...", 7 | "Permissions" : "Permisos", 8 | "Edit" : "Editar", 9 | "Choose" : "Seleccionar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Borrar permanentemente", 12 | "Cancel" : "Cancelar", 13 | "Create" : "Crear", 14 | "Back" : "Atrás", 15 | "Delete" : "Borrar", 16 | "Rename" : "Renombrar", 17 | "Done" : "Terminado", 18 | "Add to favorites" : "Agregar a favoritos", 19 | "Move or copy" : "Mover o copiar", 20 | "Title" : "Título", 21 | "Favorite" : "Favorito", 22 | "Favorites" : "Favoritos", 23 | "Deleted" : "Borrado", 24 | "Add another link" : "Añadir otro enlace", 25 | "Advanced settings" : "Configuraciones avanzados", 26 | "Unshare" : "Dejar de compartir", 27 | "Download" : "Descargar", 28 | "Sharing" : "Compartiendo", 29 | "Versions" : "Versiones" 30 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 31 | } -------------------------------------------------------------------------------- /l10n/gd.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Ceangal co-roinnidh", 5 | "Settings" : "Roghainnean", 6 | "Remove" : "Thoir air falbh", 7 | "Loading…" : "’Ga luchdadh…", 8 | "Edit" : "Deasaich", 9 | "Choose" : "Tagh", 10 | "Cancel" : "Sguir dheth", 11 | "Create" : "Cruthaich", 12 | "Back" : "Air ais", 13 | "Delete" : "Sguab às", 14 | "Rename" : "Thoir ainm ùr air", 15 | "Add to favorites" : "Cuir ris na h-annsachdan", 16 | "Favorite" : "Annsachd", 17 | "Favorites" : "Annsachdan", 18 | "Deleted" : "Chaidh a sguabadh às", 19 | "Set password" : "Suidhich facal-faire", 20 | "Password" : "Facal-faire", 21 | "Add another link" : "Cuir ceangal eile ris", 22 | "Unshare" : "Na co-roinn tuilleadh", 23 | "Download" : "Luchdaich a-nuas", 24 | "Sharing" : "Co-roinneadh", 25 | "Link copied" : "Chaidh lethbhreac dhen cheangal a dhèanamh" 26 | }, 27 | "nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;"); 28 | -------------------------------------------------------------------------------- /l10n/gd.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Ceangal co-roinnidh", 3 | "Settings" : "Roghainnean", 4 | "Remove" : "Thoir air falbh", 5 | "Loading…" : "’Ga luchdadh…", 6 | "Edit" : "Deasaich", 7 | "Choose" : "Tagh", 8 | "Cancel" : "Sguir dheth", 9 | "Create" : "Cruthaich", 10 | "Back" : "Air ais", 11 | "Delete" : "Sguab às", 12 | "Rename" : "Thoir ainm ùr air", 13 | "Add to favorites" : "Cuir ris na h-annsachdan", 14 | "Favorite" : "Annsachd", 15 | "Favorites" : "Annsachdan", 16 | "Deleted" : "Chaidh a sguabadh às", 17 | "Set password" : "Suidhich facal-faire", 18 | "Password" : "Facal-faire", 19 | "Add another link" : "Cuir ceangal eile ris", 20 | "Unshare" : "Na co-roinn tuilleadh", 21 | "Download" : "Luchdaich a-nuas", 22 | "Sharing" : "Co-roinneadh", 23 | "Link copied" : "Chaidh lethbhreac dhen cheangal a dhèanamh" 24 | },"pluralForm" :"nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;" 25 | } -------------------------------------------------------------------------------- /l10n/hy.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Կիսվել հղմամբ", 5 | "Settings" : "կարգավորումներ", 6 | "Edit" : "մշակել", 7 | "Choose" : "Ընտրել", 8 | "Restore" : "Վերականգնել", 9 | "Delete permanently" : "Ջնջել ընդմիշտ", 10 | "Cancel" : "ընդհատել", 11 | "Create" : "Ստեղծել", 12 | "Delete" : "հեռացնել", 13 | "Rename" : "Վերանվանել", 14 | "Done" : "Done", 15 | "Title" : "Վերնագիր", 16 | "Favorites" : "Սիրվածներ", 17 | "Deleted" : "Ջնջված", 18 | "Password" : "գախտնաբառ", 19 | "Unshare" : "Չկիսվել", 20 | "Download" : "Ներբեռնել", 21 | "No other versions available" : "Այլ տարբերակներ չկան", 22 | "Versions" : "Տարբերակներ" 23 | }, 24 | "nplurals=2; plural=(n != 1);"); 25 | -------------------------------------------------------------------------------- /l10n/hy.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Կիսվել հղմամբ", 3 | "Settings" : "կարգավորումներ", 4 | "Edit" : "մշակել", 5 | "Choose" : "Ընտրել", 6 | "Restore" : "Վերականգնել", 7 | "Delete permanently" : "Ջնջել ընդմիշտ", 8 | "Cancel" : "ընդհատել", 9 | "Create" : "Ստեղծել", 10 | "Delete" : "հեռացնել", 11 | "Rename" : "Վերանվանել", 12 | "Done" : "Done", 13 | "Title" : "Վերնագիր", 14 | "Favorites" : "Սիրվածներ", 15 | "Deleted" : "Ջնջված", 16 | "Password" : "գախտնաբառ", 17 | "Unshare" : "Չկիսվել", 18 | "Download" : "Ներբեռնել", 19 | "No other versions available" : "Այլ տարբերակներ չկան", 20 | "Versions" : "Տարբերակներ" 21 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 22 | } -------------------------------------------------------------------------------- /l10n/ia.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Compartir ligamine", 5 | "Settings" : "Configurationes", 6 | "Members" : "Membros", 7 | "Loading…" : "Cargante...", 8 | "View" : "Vider", 9 | "Edit" : "Modificar", 10 | "Restore" : "Restaurar", 11 | "Delete permanently" : "Deler permanentemente", 12 | "Cancel" : "Cancellar", 13 | "Create" : "Crear", 14 | "Back" : "Retro", 15 | "Delete" : "Deler", 16 | "Rename" : "Renominar", 17 | "Done" : "Preste", 18 | "Title" : "Titulo", 19 | "Favorite" : "Favorite", 20 | "Favorites" : "Favoritos", 21 | "Deleted" : "Delite", 22 | "Advanced settings" : "Configurationes avantiate", 23 | "Unshare" : "Cessa de compartir", 24 | "Download" : "Discargar", 25 | "No other versions available" : "Nulle altere versiones disponibile", 26 | "Attachments" : "Attachamentos", 27 | "Sharing" : "Compartente", 28 | "Versions" : "Versiones" 29 | }, 30 | "nplurals=2; plural=(n != 1);"); 31 | -------------------------------------------------------------------------------- /l10n/ia.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Compartir ligamine", 3 | "Settings" : "Configurationes", 4 | "Members" : "Membros", 5 | "Loading…" : "Cargante...", 6 | "View" : "Vider", 7 | "Edit" : "Modificar", 8 | "Restore" : "Restaurar", 9 | "Delete permanently" : "Deler permanentemente", 10 | "Cancel" : "Cancellar", 11 | "Create" : "Crear", 12 | "Back" : "Retro", 13 | "Delete" : "Deler", 14 | "Rename" : "Renominar", 15 | "Done" : "Preste", 16 | "Title" : "Titulo", 17 | "Favorite" : "Favorite", 18 | "Favorites" : "Favoritos", 19 | "Deleted" : "Delite", 20 | "Advanced settings" : "Configurationes avantiate", 21 | "Unshare" : "Cessa de compartir", 22 | "Download" : "Discargar", 23 | "No other versions available" : "Nulle altere versiones disponibile", 24 | "Attachments" : "Attachamentos", 25 | "Sharing" : "Compartente", 26 | "Versions" : "Versiones" 27 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 28 | } -------------------------------------------------------------------------------- /l10n/id.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "Anda tidak diizinkan untuk membagikan %s", 3 | "Share link" : "Bagikan tautan", 4 | "Settings" : "Setelan", 5 | "Members" : "Anggota", 6 | "No search results" : "Tidak ada hasil pencarian", 7 | "Remove" : "Hapus", 8 | "Loading…" : "Memuat…", 9 | "View" : "Tampilan", 10 | "Edit" : "Sunting", 11 | "Choose" : "Pilih", 12 | "Restore" : "Pulihkan", 13 | "Delete permanently" : "Hapus secara permanen", 14 | "Cancel" : "Membatalkan", 15 | "Create" : "Buat", 16 | "Back" : "Kembali", 17 | "Delete" : "Hapus", 18 | "Rename" : "Ubah nama", 19 | "Templates" : "Templat", 20 | "Done" : "Selesai", 21 | "Move or copy" : "Pindah atau salin", 22 | "Title" : "Judul", 23 | "Favorite" : "Favorit", 24 | "Favorites" : "Disukai", 25 | "Deleted" : "Dihapus", 26 | "View only" : "Hanya lihat", 27 | "Password" : "Kata sandi", 28 | "Add another link" : "Tambah tautan lain", 29 | "Advanced settings" : "Pengaturan Lanjutan", 30 | "Unshare" : "Batalkan berbagi", 31 | "Download" : "Unduh", 32 | "No other versions available" : "Tidak ada versi lain yang tersedia", 33 | "Attachments" : "Lampiran", 34 | "Sharing" : "Berbagi", 35 | "Versions" : "Versi", 36 | "Link copied" : "Link tersalin", 37 | "Copied" : "Tersalin" 38 | },"pluralForm" :"nplurals=1; plural=0;" 39 | } -------------------------------------------------------------------------------- /l10n/ka_GE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "You are not allowed to share %s" : "თქვენ არ გაქვთ უფლება გააზიაროთ %s", 5 | "Share link" : "ბმულის გაზიარება", 6 | "Settings" : "პარამეტრები", 7 | "Members" : "წევრები", 8 | "Promote to moderator" : "დაწინაურება მოდერატორზე", 9 | "Permissions" : "უფლებები", 10 | "Edit" : "შეცვლა", 11 | "Choose" : "აირჩიეთ", 12 | "Restore" : "აღდგენა", 13 | "Delete permanently" : "სამუდამოდ წაშლა", 14 | "Cancel" : "უარყოფა", 15 | "Create" : "შექმნა", 16 | "Back" : "უკან", 17 | "Delete" : "წაშლა", 18 | "Rename" : "სახელის შეცვლა", 19 | "Done" : "დასრულებულია", 20 | "Remove from favorites" : "რჩეულებიდან მოშორება", 21 | "Move or copy" : "გადაიტანეთ ან დააკოპირეთ", 22 | "Title" : "სათაური", 23 | "Favorite" : "რჩეული", 24 | "Favorites" : "რჩეულები", 25 | "Deleted" : "გაუქმდა", 26 | "Can edit" : "შეუძლია შეცვლა", 27 | "Password" : "პაროლ", 28 | "Advanced settings" : "დამატებითი პარამეტრები", 29 | "Unshare" : "გაზიარების შეწყვეტა", 30 | "Download" : "ჩამოტვირთვა", 31 | "Sharing" : "გაზიარება", 32 | "Versions" : "ვერსიები" 33 | }, 34 | "nplurals=2; plural=(n!=1);"); 35 | -------------------------------------------------------------------------------- /l10n/ka_GE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "თქვენ არ გაქვთ უფლება გააზიაროთ %s", 3 | "Share link" : "ბმულის გაზიარება", 4 | "Settings" : "პარამეტრები", 5 | "Members" : "წევრები", 6 | "Promote to moderator" : "დაწინაურება მოდერატორზე", 7 | "Permissions" : "უფლებები", 8 | "Edit" : "შეცვლა", 9 | "Choose" : "აირჩიეთ", 10 | "Restore" : "აღდგენა", 11 | "Delete permanently" : "სამუდამოდ წაშლა", 12 | "Cancel" : "უარყოფა", 13 | "Create" : "შექმნა", 14 | "Back" : "უკან", 15 | "Delete" : "წაშლა", 16 | "Rename" : "სახელის შეცვლა", 17 | "Done" : "დასრულებულია", 18 | "Remove from favorites" : "რჩეულებიდან მოშორება", 19 | "Move or copy" : "გადაიტანეთ ან დააკოპირეთ", 20 | "Title" : "სათაური", 21 | "Favorite" : "რჩეული", 22 | "Favorites" : "რჩეულები", 23 | "Deleted" : "გაუქმდა", 24 | "Can edit" : "შეუძლია შეცვლა", 25 | "Password" : "პაროლ", 26 | "Advanced settings" : "დამატებითი პარამეტრები", 27 | "Unshare" : "გაზიარების შეწყვეტა", 28 | "Download" : "ჩამოტვირთვა", 29 | "Sharing" : "გაზიარება", 30 | "Versions" : "ვერსიები" 31 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 32 | } -------------------------------------------------------------------------------- /l10n/kab.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Fren aseɣwen", 5 | "Settings" : "Iɣewwaṛen", 6 | "No search results" : "Ulac igmaḍ n unadi", 7 | "Remove" : "Kkes", 8 | "Loading…" : "Asali...", 9 | "Edit" : "Ẓreg", 10 | "Choose" : "Fren", 11 | "Cancel" : "Sefsex", 12 | "Create" : "Snulfu-d", 13 | "Back" : "Retour", 14 | "Delete" : "Kkes", 15 | "Rename" : "Beddel isem", 16 | "Done" : "Immed", 17 | "Remove from favorites" : "Kkes-it seg ismal", 18 | "Add to favorites" : "Rnu ismal", 19 | "Title" : "Azwel", 20 | "Favorite" : "Menyif", 21 | "Favorites" : "Imenyafen", 22 | "Deleted" : "Yettwakkes", 23 | "Set password" : "Sbadu awal uffir", 24 | "Add another link" : "Rnu aseɣwen-nniḍen", 25 | "Download" : "Sider", 26 | "Attachments" : "Ticeqqufin", 27 | "Sharing" : "Beṭṭu", 28 | "Link copied" : "Aseɣwen yettwanɣel" 29 | }, 30 | "nplurals=2; plural=(n != 1);"); 31 | -------------------------------------------------------------------------------- /l10n/kab.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Fren aseɣwen", 3 | "Settings" : "Iɣewwaṛen", 4 | "No search results" : "Ulac igmaḍ n unadi", 5 | "Remove" : "Kkes", 6 | "Loading…" : "Asali...", 7 | "Edit" : "Ẓreg", 8 | "Choose" : "Fren", 9 | "Cancel" : "Sefsex", 10 | "Create" : "Snulfu-d", 11 | "Back" : "Retour", 12 | "Delete" : "Kkes", 13 | "Rename" : "Beddel isem", 14 | "Done" : "Immed", 15 | "Remove from favorites" : "Kkes-it seg ismal", 16 | "Add to favorites" : "Rnu ismal", 17 | "Title" : "Azwel", 18 | "Favorite" : "Menyif", 19 | "Favorites" : "Imenyafen", 20 | "Deleted" : "Yettwakkes", 21 | "Set password" : "Sbadu awal uffir", 22 | "Add another link" : "Rnu aseɣwen-nniḍen", 23 | "Download" : "Sider", 24 | "Attachments" : "Ticeqqufin", 25 | "Sharing" : "Beṭṭu", 26 | "Link copied" : "Aseɣwen yettwanɣel" 27 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 28 | } -------------------------------------------------------------------------------- /l10n/km.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Share link", 5 | "Settings" : "ការកំណត់", 6 | "Edit" : "កែប្រែ", 7 | "Choose" : "ជ្រើស", 8 | "Restore" : "ស្ដារ​មក​វិញ", 9 | "Delete permanently" : "លុប​ជា​អចិន្ត្រៃយ៍", 10 | "Cancel" : "បោះបង់", 11 | "Create" : "បង្កើត", 12 | "Back" : "ត្រឡប់ក្រោយ", 13 | "Delete" : "លុប", 14 | "Rename" : "ប្ដូរ​ឈ្មោះ", 15 | "Done" : "Done", 16 | "Title" : "ចំណងជើង", 17 | "Favorites" : "Favorites", 18 | "Deleted" : "បាន​លុប", 19 | "Unshare" : "លែង​ចែក​រំលែក", 20 | "Download" : "ទាញយក", 21 | "No other versions available" : "មិន​មាន​កំណែ​ផ្សេង​ទៀត​ទេ", 22 | "Sharing" : "ការ​ចែក​រំលែក", 23 | "Versions" : "កំណែ" 24 | }, 25 | "nplurals=1; plural=0;"); 26 | -------------------------------------------------------------------------------- /l10n/km.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Share link", 3 | "Settings" : "ការកំណត់", 4 | "Edit" : "កែប្រែ", 5 | "Choose" : "ជ្រើស", 6 | "Restore" : "ស្ដារ​មក​វិញ", 7 | "Delete permanently" : "លុប​ជា​អចិន្ត្រៃយ៍", 8 | "Cancel" : "បោះបង់", 9 | "Create" : "បង្កើត", 10 | "Back" : "ត្រឡប់ក្រោយ", 11 | "Delete" : "លុប", 12 | "Rename" : "ប្ដូរ​ឈ្មោះ", 13 | "Done" : "Done", 14 | "Title" : "ចំណងជើង", 15 | "Favorites" : "Favorites", 16 | "Deleted" : "បាន​លុប", 17 | "Unshare" : "លែង​ចែក​រំលែក", 18 | "Download" : "ទាញយក", 19 | "No other versions available" : "មិន​មាន​កំណែ​ផ្សេង​ទៀត​ទេ", 20 | "Sharing" : "ការ​ចែក​រំលែក", 21 | "Versions" : "កំណែ" 22 | },"pluralForm" :"nplurals=1; plural=0;" 23 | } -------------------------------------------------------------------------------- /l10n/kn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "ಸಂಪರ್ಕ ಕೊಂಡಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು", 5 | "Settings" : "ಆಯ್ಕೆ", 6 | "Edit" : "ಸಂಪಾದಿಸು", 7 | "Choose" : "ಆಯ್ಕೆ", 8 | "Restore" : "ಮರುಸ್ಥಾಪಿಸು", 9 | "Cancel" : "ರದ್ದು", 10 | "Create" : "ಸೃಷ್ಟಿಸಿ", 11 | "Delete" : "ಅಳಿಸಿ", 12 | "Rename" : "ಮರುಹೆಸರಿಸು", 13 | "Done" : "Done", 14 | "Title" : "ಶೀರ್ಷಿಕೆ", 15 | "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", 16 | "Favorites" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", 17 | "Password" : "ಗುಪ್ತಪದ", 18 | "Unshare" : "ಹಂಚಿಕೆಯನ್ನು ಹಿಂತೆಗೆ", 19 | "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", 20 | "No other versions available" : "ಇನ್ನಿತರೆ ಯಾವುದೇ ಆವೃತ್ತಿಗಳು ಲಭ್ಯವಿಲ್ಲ", 21 | "Sharing" : "ಹಂಚಿಕೆ", 22 | "Versions" : "ಆವೃತ್ತಿಗಳು" 23 | }, 24 | "nplurals=2; plural=(n > 1);"); 25 | -------------------------------------------------------------------------------- /l10n/kn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "ಸಂಪರ್ಕ ಕೊಂಡಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು", 3 | "Settings" : "ಆಯ್ಕೆ", 4 | "Edit" : "ಸಂಪಾದಿಸು", 5 | "Choose" : "ಆಯ್ಕೆ", 6 | "Restore" : "ಮರುಸ್ಥಾಪಿಸು", 7 | "Cancel" : "ರದ್ದು", 8 | "Create" : "ಸೃಷ್ಟಿಸಿ", 9 | "Delete" : "ಅಳಿಸಿ", 10 | "Rename" : "ಮರುಹೆಸರಿಸು", 11 | "Done" : "Done", 12 | "Title" : "ಶೀರ್ಷಿಕೆ", 13 | "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", 14 | "Favorites" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", 15 | "Password" : "ಗುಪ್ತಪದ", 16 | "Unshare" : "ಹಂಚಿಕೆಯನ್ನು ಹಿಂತೆಗೆ", 17 | "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", 18 | "No other versions available" : "ಇನ್ನಿತರೆ ಯಾವುದೇ ಆವೃತ್ತಿಗಳು ಲಭ್ಯವಿಲ್ಲ", 19 | "Sharing" : "ಹಂಚಿಕೆ", 20 | "Versions" : "ಆವೃತ್ತಿಗಳು" 21 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 22 | } -------------------------------------------------------------------------------- /l10n/lb.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Link deelen", 5 | "Settings" : "Astellungen", 6 | "Loading…" : "Et gëtt gelueden", 7 | "Edit" : "Änneren", 8 | "Choose" : "Auswielen", 9 | "Restore" : "Zrécksetzen", 10 | "Delete permanently" : "Permanent läschen", 11 | "Cancel" : "Ofbriechen", 12 | "Create" : "Erstellen", 13 | "Back" : "Zeréck", 14 | "Delete" : "Läschen", 15 | "Rename" : "Ëmbenennen", 16 | "Done" : "Done", 17 | "Title" : "Titel", 18 | "Favorite" : "Favorit", 19 | "Favorites" : "Favoriten", 20 | "Deleted" : "Geläscht", 21 | "Add another link" : "Füügt en anere Link", 22 | "Advanced settings" : "Erweidert Astellungen", 23 | "Unshare" : "Net méi deelen", 24 | "Download" : "Eroflueden", 25 | "No other versions available" : "Keng aner Versiounen disponibel", 26 | "Sharing" : "Gedeelt", 27 | "Versions" : "Versiounen", 28 | "Link copied" : "Link kopéiert" 29 | }, 30 | "nplurals=2; plural=(n != 1);"); 31 | -------------------------------------------------------------------------------- /l10n/lb.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Link deelen", 3 | "Settings" : "Astellungen", 4 | "Loading…" : "Et gëtt gelueden", 5 | "Edit" : "Änneren", 6 | "Choose" : "Auswielen", 7 | "Restore" : "Zrécksetzen", 8 | "Delete permanently" : "Permanent läschen", 9 | "Cancel" : "Ofbriechen", 10 | "Create" : "Erstellen", 11 | "Back" : "Zeréck", 12 | "Delete" : "Läschen", 13 | "Rename" : "Ëmbenennen", 14 | "Done" : "Done", 15 | "Title" : "Titel", 16 | "Favorite" : "Favorit", 17 | "Favorites" : "Favoriten", 18 | "Deleted" : "Geläscht", 19 | "Add another link" : "Füügt en anere Link", 20 | "Advanced settings" : "Erweidert Astellungen", 21 | "Unshare" : "Net méi deelen", 22 | "Download" : "Eroflueden", 23 | "No other versions available" : "Keng aner Versiounen disponibel", 24 | "Sharing" : "Gedeelt", 25 | "Versions" : "Versiounen", 26 | "Link copied" : "Link kopéiert" 27 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 28 | } -------------------------------------------------------------------------------- /l10n/lo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "ແບ່ງປັນລິງ", 5 | "Settings" : "ການຕັ້ງຄ່າ", 6 | "Remove" : "ຍ້າຍອອກ", 7 | "Loading…" : "ກຳລັງໂຫຼດ", 8 | "Edit" : "ແກ້ໄຂ", 9 | "Choose" : "ເລືອກ", 10 | "Restore" : "ການກຸ້ຄຶນ", 11 | "Cancel" : "ຍົກເລີກ", 12 | "Create" : "ສ້າງ", 13 | "Back" : "ຫຼັງ", 14 | "Delete" : "ລຶບ", 15 | "Done" : "ສໍາເລັດ", 16 | "Add to favorites" : "ເພີ່ມລາຍການທີ່ມັກ", 17 | "Favorite" : "ລາຍການທີ່ມັກ", 18 | "Favorites" : "ລາຍການທີ່ມັກ", 19 | "Deleted" : "ລືບ", 20 | "Set password" : "ກຳນົດລະຫັດຜ່ານ", 21 | "Add another link" : "ເພີ່ມລິງອຶ່ນອີ", 22 | "Unshare" : "ຍົກເລີກການແບ່ງປັນ", 23 | "Download" : "ດາວໂຫລດ", 24 | "Sharing" : "ການແບ່ງປັນ", 25 | "Link copied" : "ສຳເນົາລິງ" 26 | }, 27 | "nplurals=1; plural=0;"); 28 | -------------------------------------------------------------------------------- /l10n/lo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "ແບ່ງປັນລິງ", 3 | "Settings" : "ການຕັ້ງຄ່າ", 4 | "Remove" : "ຍ້າຍອອກ", 5 | "Loading…" : "ກຳລັງໂຫຼດ", 6 | "Edit" : "ແກ້ໄຂ", 7 | "Choose" : "ເລືອກ", 8 | "Restore" : "ການກຸ້ຄຶນ", 9 | "Cancel" : "ຍົກເລີກ", 10 | "Create" : "ສ້າງ", 11 | "Back" : "ຫຼັງ", 12 | "Delete" : "ລຶບ", 13 | "Done" : "ສໍາເລັດ", 14 | "Add to favorites" : "ເພີ່ມລາຍການທີ່ມັກ", 15 | "Favorite" : "ລາຍການທີ່ມັກ", 16 | "Favorites" : "ລາຍການທີ່ມັກ", 17 | "Deleted" : "ລືບ", 18 | "Set password" : "ກຳນົດລະຫັດຜ່ານ", 19 | "Add another link" : "ເພີ່ມລິງອຶ່ນອີ", 20 | "Unshare" : "ຍົກເລີກການແບ່ງປັນ", 21 | "Download" : "ດາວໂຫລດ", 22 | "Sharing" : "ການແບ່ງປັນ", 23 | "Link copied" : "ສຳເນົາລິງ" 24 | },"pluralForm" :"nplurals=1; plural=0;" 25 | } -------------------------------------------------------------------------------- /l10n/mn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Холбоос хуваалцах", 5 | "Settings" : "Тохиргоо", 6 | "Members" : "Гишүүд", 7 | "Loading…" : "уншиж байна", 8 | "Edit" : "засварлах", 9 | "Choose" : "Сонгох", 10 | "Restore" : "Сэргээх", 11 | "Delete permanently" : "бүр мөсөн устгах", 12 | "Cancel" : "болиулах", 13 | "Create" : "Үүсгэх", 14 | "Back" : "буцах", 15 | "Delete" : "Устгах", 16 | "Rename" : "Нэрлэнэ үү", 17 | "Done" : "Хийсэн", 18 | "Move or copy" : "Зөөх эсвэл хуулах", 19 | "Title" : "Цол/Албан тушаал", 20 | "Favorite" : "Дуртай", 21 | "Favorites" : "Онцолсон", 22 | "Deleted" : "Устгагдсан", 23 | "View only" : "Зөвхөн үзэх", 24 | "Password" : "нууц үг", 25 | "Advanced settings" : "Нарийвчилсан тохиргоо", 26 | "Unshare" : "Түгээлтийг зогсоох", 27 | "Download" : "Татах", 28 | "Attachments" : "Хавсралт", 29 | "Sharing" : "Түгээх", 30 | "Versions" : "Хувилбарууд", 31 | "Copied" : "Хуулагдсан", 32 | "Cannot copy" : "Хуулагдаагүй" 33 | }, 34 | "nplurals=2; plural=(n != 1);"); 35 | -------------------------------------------------------------------------------- /l10n/mn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Холбоос хуваалцах", 3 | "Settings" : "Тохиргоо", 4 | "Members" : "Гишүүд", 5 | "Loading…" : "уншиж байна", 6 | "Edit" : "засварлах", 7 | "Choose" : "Сонгох", 8 | "Restore" : "Сэргээх", 9 | "Delete permanently" : "бүр мөсөн устгах", 10 | "Cancel" : "болиулах", 11 | "Create" : "Үүсгэх", 12 | "Back" : "буцах", 13 | "Delete" : "Устгах", 14 | "Rename" : "Нэрлэнэ үү", 15 | "Done" : "Хийсэн", 16 | "Move or copy" : "Зөөх эсвэл хуулах", 17 | "Title" : "Цол/Албан тушаал", 18 | "Favorite" : "Дуртай", 19 | "Favorites" : "Онцолсон", 20 | "Deleted" : "Устгагдсан", 21 | "View only" : "Зөвхөн үзэх", 22 | "Password" : "нууц үг", 23 | "Advanced settings" : "Нарийвчилсан тохиргоо", 24 | "Unshare" : "Түгээлтийг зогсоох", 25 | "Download" : "Татах", 26 | "Attachments" : "Хавсралт", 27 | "Sharing" : "Түгээх", 28 | "Versions" : "Хувилбарууд", 29 | "Copied" : "Хуулагдсан", 30 | "Cannot copy" : "Хуулагдаагүй" 31 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 32 | } -------------------------------------------------------------------------------- /l10n/ms_MY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Share link", 5 | "Settings" : "Tetapan", 6 | "Edit" : "Sunting", 7 | "Restore" : "Pulihkan", 8 | "Cancel" : "Batal", 9 | "Create" : "Buat", 10 | "Back" : "Kembali", 11 | "Delete" : "Padam", 12 | "Rename" : "Namakan", 13 | "Done" : "Done", 14 | "Title" : "Judul", 15 | "Favorites" : "Favorites", 16 | "Deleted" : "Dipadam", 17 | "Download" : "Muat turun", 18 | "No other versions available" : "Tiada lagi versi lain", 19 | "Versions" : "Versi" 20 | }, 21 | "nplurals=1; plural=0;"); 22 | -------------------------------------------------------------------------------- /l10n/ms_MY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Share link", 3 | "Settings" : "Tetapan", 4 | "Edit" : "Sunting", 5 | "Restore" : "Pulihkan", 6 | "Cancel" : "Batal", 7 | "Create" : "Buat", 8 | "Back" : "Kembali", 9 | "Delete" : "Padam", 10 | "Rename" : "Namakan", 11 | "Done" : "Done", 12 | "Title" : "Judul", 13 | "Favorites" : "Favorites", 14 | "Deleted" : "Dipadam", 15 | "Download" : "Muat turun", 16 | "No other versions available" : "Tiada lagi versi lain", 17 | "Versions" : "Versi" 18 | },"pluralForm" :"nplurals=1; plural=0;" 19 | } -------------------------------------------------------------------------------- /l10n/nn_NO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Del lenkje", 5 | "Settings" : "Innstillingar", 6 | "Promote to moderator" : "Fremje til moderator", 7 | "Loading…" : "Lastar...", 8 | "Edit" : "Rediger", 9 | "Choose" : "Vel", 10 | "Restore" : "Gjenopprett", 11 | "Delete permanently" : "Slett for godt", 12 | "Cancel" : "Avbryt", 13 | "Create" : "Lag", 14 | "Back" : "Tilbake", 15 | "Delete" : "Slett", 16 | "Rename" : "Endra namn", 17 | "Done" : "Ferdig", 18 | "Add to favorites" : "Legg til i favorittar", 19 | "Title" : "Tittel", 20 | "Favorite" : "Favoritt", 21 | "Favorites" : "Favorittar", 22 | "Deleted" : "Sletta", 23 | "Add another link" : "Legg til ei anna lenkje", 24 | "Advanced settings" : "Avanserte innstillingar", 25 | "Unshare" : "Fjern deling", 26 | "Download" : "Last ned", 27 | "No other versions available" : "Ingen andre utgåver tilgjengeleg", 28 | "Sharing" : "Deling", 29 | "Versions" : "Utgåver", 30 | "Link copied" : "Lenkje kopiert" 31 | }, 32 | "nplurals=2; plural=(n != 1);"); 33 | -------------------------------------------------------------------------------- /l10n/nn_NO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Del lenkje", 3 | "Settings" : "Innstillingar", 4 | "Promote to moderator" : "Fremje til moderator", 5 | "Loading…" : "Lastar...", 6 | "Edit" : "Rediger", 7 | "Choose" : "Vel", 8 | "Restore" : "Gjenopprett", 9 | "Delete permanently" : "Slett for godt", 10 | "Cancel" : "Avbryt", 11 | "Create" : "Lag", 12 | "Back" : "Tilbake", 13 | "Delete" : "Slett", 14 | "Rename" : "Endra namn", 15 | "Done" : "Ferdig", 16 | "Add to favorites" : "Legg til i favorittar", 17 | "Title" : "Tittel", 18 | "Favorite" : "Favoritt", 19 | "Favorites" : "Favorittar", 20 | "Deleted" : "Sletta", 21 | "Add another link" : "Legg til ei anna lenkje", 22 | "Advanced settings" : "Avanserte innstillingar", 23 | "Unshare" : "Fjern deling", 24 | "Download" : "Last ned", 25 | "No other versions available" : "Ingen andre utgåver tilgjengeleg", 26 | "Sharing" : "Deling", 27 | "Versions" : "Utgåver", 28 | "Link copied" : "Lenkje kopiert" 29 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 30 | } -------------------------------------------------------------------------------- /l10n/si.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Settings" : "සැකසුම්", 5 | "Remove" : "ඉවත් කරන්න", 6 | "Loading…" : "පූරණය වෙමින්…", 7 | "Edit" : "සංස්කරණය", 8 | "Choose" : "තෝරන්න", 9 | "Restore" : "ප්‍රතිෂ්ථාපනය", 10 | "Cancel" : "අවලංගු", 11 | "Create" : "සාදන්න", 12 | "Back" : "ආපසු", 13 | "Could not rename the page" : "පිටුව නැවත නම් කිරීමට නොහැකි විය", 14 | "Add a page" : "පිටුවක් එකතු කරන්න", 15 | "Favorite" : "ප්‍රියතම", 16 | "Favorites" : "ප්‍රියතම", 17 | "Add another link" : "තවත් සබැඳියක් එකතු කරන්න", 18 | "Download" : "බාගන්න", 19 | "Current version" : "වත්මන් අනුවාදය", 20 | "No other versions available" : "වෙනත් අනුවාද නැත", 21 | "Attachments" : "ඇමිණුම්", 22 | "Versions" : "අනුවාද", 23 | "Link copied" : "සබැඳිය පිටපත් කළා", 24 | "New Page" : "නව පිටුව" 25 | }, 26 | "nplurals=2; plural=(n != 1);"); 27 | -------------------------------------------------------------------------------- /l10n/si.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Settings" : "සැකසුම්", 3 | "Remove" : "ඉවත් කරන්න", 4 | "Loading…" : "පූරණය වෙමින්…", 5 | "Edit" : "සංස්කරණය", 6 | "Choose" : "තෝරන්න", 7 | "Restore" : "ප්‍රතිෂ්ථාපනය", 8 | "Cancel" : "අවලංගු", 9 | "Create" : "සාදන්න", 10 | "Back" : "ආපසු", 11 | "Could not rename the page" : "පිටුව නැවත නම් කිරීමට නොහැකි විය", 12 | "Add a page" : "පිටුවක් එකතු කරන්න", 13 | "Favorite" : "ප්‍රියතම", 14 | "Favorites" : "ප්‍රියතම", 15 | "Add another link" : "තවත් සබැඳියක් එකතු කරන්න", 16 | "Download" : "බාගන්න", 17 | "Current version" : "වත්මන් අනුවාදය", 18 | "No other versions available" : "වෙනත් අනුවාද නැත", 19 | "Attachments" : "ඇමිණුම්", 20 | "Versions" : "අනුවාද", 21 | "Link copied" : "සබැඳිය පිටපත් කළා", 22 | "New Page" : "නව පිටුව" 23 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 24 | } -------------------------------------------------------------------------------- /l10n/sq.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët", 3 | "Share link" : "Lidhje ndarjeje", 4 | "Settings" : "Rregullimet", 5 | "Members" : "Anëtar", 6 | "Remove" : "Hiqe", 7 | "Loading…" : "Duke u ngarkuar…", 8 | "Permissions" : "Lejet", 9 | "View" : "Shiko", 10 | "Edit" : "Përpuno", 11 | "Choose" : "Zgjidhni", 12 | "Restore" : "Rikthe", 13 | "Delete permanently" : "Fshije përgjithmonë", 14 | "Cancel" : "Anullo", 15 | "Create" : "Krijo", 16 | "Back" : "Prapa", 17 | "Delete" : "Fshi", 18 | "Rename" : "Riemërtoje", 19 | "Done" : "U krye", 20 | "Remove from favorites" : "Hiqeni nga të parapëlqyerat", 21 | "Add to favorites" : "U shtua te të parapëlqyerat", 22 | "Title" : "Titulli", 23 | "Favorite" : "E parapëlqyer", 24 | "Favorites" : "Favorites", 25 | "Deleted" : "E fshirë", 26 | "Can edit" : "Mund të editojë", 27 | "Password" : "Fjalëkalimi", 28 | "Advanced settings" : "Rregullime të mëtejshme", 29 | "Unshare" : "Hiqe ndarjen", 30 | "Download" : "Shkarko", 31 | "No other versions available" : "Nuk ka versione të tjera të gatshme", 32 | "Attachments" : "Bashkangjitjet", 33 | "Sharing" : "Ndarje", 34 | "Versions" : "Versione", 35 | "Link copied" : "Linku u kopjua", 36 | "Copied" : "Kopjuar" 37 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 38 | } -------------------------------------------------------------------------------- /l10n/sr@latin.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Podeli vezu", 5 | "Settings" : "Поставке", 6 | "Loading…" : "Učitavam…", 7 | "Edit" : "Izmeni", 8 | "Choose" : "Odaberi", 9 | "Delete permanently" : "Obriši zauvek", 10 | "Cancel" : "Otkaži", 11 | "Create" : "Napravi", 12 | "Back" : "Nazad", 13 | "Delete" : "Obriši", 14 | "Rename" : "Preimenuj", 15 | "Done" : "Gotovo", 16 | "Title" : "Naslov", 17 | "Favorite" : "Omiljene", 18 | "Favorites" : "Omiljene", 19 | "Deleted" : "Obrisano", 20 | "Unshare" : "Ukini deljenje", 21 | "Attachments" : "Prilozi", 22 | "Link copied" : "Veza iskopirana" 23 | }, 24 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 25 | -------------------------------------------------------------------------------- /l10n/sr@latin.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Podeli vezu", 3 | "Settings" : "Поставке", 4 | "Loading…" : "Učitavam…", 5 | "Edit" : "Izmeni", 6 | "Choose" : "Odaberi", 7 | "Delete permanently" : "Obriši zauvek", 8 | "Cancel" : "Otkaži", 9 | "Create" : "Napravi", 10 | "Back" : "Nazad", 11 | "Delete" : "Obriši", 12 | "Rename" : "Preimenuj", 13 | "Done" : "Gotovo", 14 | "Title" : "Naslov", 15 | "Favorite" : "Omiljene", 16 | "Favorites" : "Omiljene", 17 | "Deleted" : "Obrisano", 18 | "Unshare" : "Ukini deljenje", 19 | "Attachments" : "Prilozi", 20 | "Link copied" : "Veza iskopirana" 21 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" 22 | } -------------------------------------------------------------------------------- /l10n/tk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Baglanyşyk paýlaş", 5 | "Settings" : "Sazlamalar", 6 | "Remove" : "Aýyrmak", 7 | "Loading…" : "Ýüklenýär…", 8 | "Edit" : "Redaktirläň", 9 | "Choose" : "saýlamak", 10 | "Cancel" : "ýatyrmak", 11 | "Create" : "Dörediň", 12 | "Back" : "Yzyna", 13 | "Delete" : "Pozmak", 14 | "Rename" : "Adyny üýtgetmek", 15 | "Add to favorites" : "Saýlananlara goşuň", 16 | "Favorite" : "Halaýan", 17 | "Favorites" : "Halanýanlar", 18 | "Deleted" : "Öçürildi", 19 | "Set password" : "Paroly düzüň", 20 | "Password" : "Açarsöz", 21 | "Add another link" : "Başga bir baglanyşyk goşuň", 22 | "Unshare" : "Paýlaşma", 23 | "Download" : "Göçürip almak", 24 | "Sharing" : "Paýlaşmak", 25 | "Link copied" : "Link-yň nusgasy alyndy" 26 | }, 27 | "nplurals=2; plural=(n != 1);"); 28 | -------------------------------------------------------------------------------- /l10n/tk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Baglanyşyk paýlaş", 3 | "Settings" : "Sazlamalar", 4 | "Remove" : "Aýyrmak", 5 | "Loading…" : "Ýüklenýär…", 6 | "Edit" : "Redaktirläň", 7 | "Choose" : "saýlamak", 8 | "Cancel" : "ýatyrmak", 9 | "Create" : "Dörediň", 10 | "Back" : "Yzyna", 11 | "Delete" : "Pozmak", 12 | "Rename" : "Adyny üýtgetmek", 13 | "Add to favorites" : "Saýlananlara goşuň", 14 | "Favorite" : "Halaýan", 15 | "Favorites" : "Halanýanlar", 16 | "Deleted" : "Öçürildi", 17 | "Set password" : "Paroly düzüň", 18 | "Password" : "Açarsöz", 19 | "Add another link" : "Başga bir baglanyşyk goşuň", 20 | "Unshare" : "Paýlaşma", 21 | "Download" : "Göçürip almak", 22 | "Sharing" : "Paýlaşmak", 23 | "Link copied" : "Link-yň nusgasy alyndy" 24 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 25 | } -------------------------------------------------------------------------------- /l10n/uz.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "collectives", 3 | { 4 | "Share link" : "Share link", 5 | "Settings" : "Sozlamalar", 6 | "No search results" : "Qidiruv natijalari yo‘q", 7 | "Remove" : "Remove", 8 | "Loading…" : "Loading…", 9 | "Remove {name}" : " {name} ni o'chirish", 10 | "Add emoji" : "Emoji qo'shing", 11 | "Edit" : "Tahrirlash", 12 | "Choose" : "Tanlang", 13 | "Restore" : "Qayta tiklangan", 14 | "Delete permanently" : "Butunlay o'chirish", 15 | "Cancel" : "Cancel", 16 | "Create" : "Yaratish", 17 | "Back" : "Orqaga", 18 | "Delete" : "O'chirish", 19 | "Rename" : "Nomini o'zgartirish", 20 | "Done" : "Done", 21 | "Remove from favorites" : "Sevimlilardan olib tashlang", 22 | "Add to favorites" : "Sevimlilarga qo'shing", 23 | "Title" : "Sarlavha", 24 | "Clear search" : "Qidiruvni tozalash", 25 | "Favorite" : "Favorite", 26 | "Favorites" : "Favorites", 27 | "Deleted" : "O`chirilgan", 28 | "Can edit" : "Can edit", 29 | "Password" : "Password", 30 | "Create share" : "Tarqatish yaratish", 31 | "Unshare" : "Unshare", 32 | "Download" : "Download", 33 | "Attachments" : "Qo'shimchalar", 34 | "Sharing" : "Ulashish", 35 | "Versions" : "Versions", 36 | "Link copied" : "Havola nusxalandi" 37 | }, 38 | "nplurals=1; plural=0;"); 39 | -------------------------------------------------------------------------------- /l10n/uz.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Share link" : "Share link", 3 | "Settings" : "Sozlamalar", 4 | "No search results" : "Qidiruv natijalari yo‘q", 5 | "Remove" : "Remove", 6 | "Loading…" : "Loading…", 7 | "Remove {name}" : " {name} ni o'chirish", 8 | "Add emoji" : "Emoji qo'shing", 9 | "Edit" : "Tahrirlash", 10 | "Choose" : "Tanlang", 11 | "Restore" : "Qayta tiklangan", 12 | "Delete permanently" : "Butunlay o'chirish", 13 | "Cancel" : "Cancel", 14 | "Create" : "Yaratish", 15 | "Back" : "Orqaga", 16 | "Delete" : "O'chirish", 17 | "Rename" : "Nomini o'zgartirish", 18 | "Done" : "Done", 19 | "Remove from favorites" : "Sevimlilardan olib tashlang", 20 | "Add to favorites" : "Sevimlilarga qo'shing", 21 | "Title" : "Sarlavha", 22 | "Clear search" : "Qidiruvni tozalash", 23 | "Favorite" : "Favorite", 24 | "Favorites" : "Favorites", 25 | "Deleted" : "O`chirilgan", 26 | "Can edit" : "Can edit", 27 | "Password" : "Password", 28 | "Create share" : "Tarqatish yaratish", 29 | "Unshare" : "Unshare", 30 | "Download" : "Download", 31 | "Attachments" : "Qo'shimchalar", 32 | "Sharing" : "Ulashish", 33 | "Versions" : "Versions", 34 | "Link copied" : "Havola nusxalandi" 35 | },"pluralForm" :"nplurals=1; plural=0;" 36 | } -------------------------------------------------------------------------------- /lib/BackgroundJob/CleanupSessions.php: -------------------------------------------------------------------------------- 1 | setInterval(SessionService::SESSION_VALID_TIME); 24 | } 25 | 26 | protected function run($argument): void { 27 | $this->sessionService->removeInactiveSessions(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/BackgroundJob/ExpirePageTrash.php: -------------------------------------------------------------------------------- 1 | setInterval(60 * 60); 30 | 31 | if (class_exists(Expiration::class)) { 32 | $this->hasTrashBackend = true; 33 | $this->expiration = Server::get(Expiration::class); 34 | $this->trashBackend = Server::get(PageTrashBackend::class); 35 | } 36 | } 37 | 38 | /** 39 | * @param $argument 40 | * 41 | * @throws NotFoundException 42 | * @throws NotPermittedException 43 | */ 44 | protected function run($argument): void { 45 | if ($this->hasTrashBackend) { 46 | $this->trashBackend->expire($this->expiration); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /lib/BackgroundJob/ExpirePageVersions.php: -------------------------------------------------------------------------------- 1 | setInterval(60 * 60); 28 | $this->setTimeSensitivity(IJob::TIME_INSENSITIVE); 29 | } 30 | 31 | /** 32 | * @param $argument 33 | * 34 | * @throws NotFoundException 35 | * @throws NotPermittedException 36 | */ 37 | protected function run($argument): void { 38 | $this->expireManager->expireAll(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/BackgroundJob/PurgeObsoletePages.php: -------------------------------------------------------------------------------- 1 | setInterval(60 * 60 * 24 * 2); 26 | $this->setTimeSensitivity(IJob::TIME_INSENSITIVE); 27 | } 28 | 29 | /** 30 | * @param $argument 31 | */ 32 | protected function run($argument): void { 33 | $this->garbageCollector->purgeObsoletePages(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/CacheListener.php: -------------------------------------------------------------------------------- 1 | eventDispatcher->addListener(CacheInsertEvent::class, [$this, 'onCacheEvent'], 99999); 26 | $this->eventDispatcher->addListener(CacheUpdateEvent::class, [$this, 'onCacheEvent'], 99999); 27 | } 28 | 29 | public function onCacheEvent(ICacheEvent $event): void { 30 | if (!$event->getStorage()->instanceOfStorage(CollectiveStorage::class)) { 31 | return; 32 | } 33 | 34 | $jailedPath = preg_replace('/^appdata_\w+\/collectives\/\d+\//', '', $event->getPath()); 35 | if ($jailedPath !== $event->getPath()) { 36 | $event->setPath($jailedPath); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/Command/PurgeObsoletePages.php: -------------------------------------------------------------------------------- 1 | setName('collectives:pages:purge-obsolete') 27 | ->setDescription('Purge cruft pages from database'); 28 | parent::configure(); 29 | } 30 | 31 | protected function execute(InputInterface $input, OutputInterface $output): int { 32 | $output->write('Start to purge cruft pages from database ...'); 33 | $count = $this->garbageCollector->purgeObsoletePages(); 34 | $output->writeln('done.'); 35 | $output->writeln(sprintf('Purged %d cruft pages from database.', $count)); 36 | return 0; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/Db/PageGarbageCollector.php: -------------------------------------------------------------------------------- 1 | folderManager->getRootFolder(); 24 | foreach ($this->pageMapper->getAll() as $page) { 25 | if ($rootFolder->getById($page->getFileId()) === []) { 26 | $purgeCount++; 27 | $this->pageMapper->delete($page); 28 | } 29 | } 30 | 31 | return $purgeCount; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/Db/Session.php: -------------------------------------------------------------------------------- 1 | $this->id, 36 | 'userId' => $this->userId, 37 | 'token' => $this->token, 38 | 'collectiveId' => $this->collectiveId, 39 | 'lastContact' => $this->lastContact, 40 | ]; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/Events/CollectivesLoadAdditionalScriptsEvent.php: -------------------------------------------------------------------------------- 1 | */ 18 | class ShareDeletedListener implements IEventListener { 19 | public function __construct( 20 | private CollectiveShareMapper $shareMapper, 21 | ) { 22 | } 23 | 24 | public function handle(Event $event): void { 25 | if (!($event instanceof ShareDeletedEvent) || 26 | !$event->getShare()->getToken()) { 27 | return; 28 | } 29 | 30 | // Delete any associated collective shares 31 | $this->shareMapper->deleteByToken($event->getShare()->getToken()); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/Migration/Version000400Date20210324000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives'); 24 | if (!$table->hasColumn('trash_timestamp')) { 25 | $table->addColumn('trash_timestamp', Types::INTEGER, [ 26 | 'notnull' => false, 27 | ]); 28 | return $schema; 29 | } 30 | 31 | return null; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/Migration/Version000400Date20210412000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives'); 23 | if ($table->hasColumn('name')) { 24 | $table->dropColumn('name'); 25 | return $schema; 26 | } 27 | 28 | return null; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/Migration/Version000500Date20210421000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives'); 24 | if (!$table->hasColumn('emoji')) { 25 | $table->addColumn('emoji', Types::STRING, [ 26 | 'notnull' => false, 27 | 'length' => 8, 28 | ]); 29 | return $schema; 30 | } 31 | 32 | return null; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/Migration/Version000900Date20210614000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives'); 23 | if ($table->hasColumn('circle_unique_id')) { 24 | $table->changeColumn('circle_unique_id', [ 25 | 'length' => 31, 26 | ]); 27 | return $schema; 28 | } 29 | 30 | return null; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/Migration/Version002000Date20220103000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives'); 30 | if (!$table->hasColumn('permissions')) { 31 | $table->addColumn('permissions', Types::INTEGER, [ 32 | 'notnull' => true, 33 | // Grant full access to all member levels per default 34 | 'default' => self::defaultPermissions, 35 | ]); 36 | return $schema; 37 | } 38 | 39 | return null; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/Migration/Version002000Date20220210000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives'); 28 | if (!$table->hasColumn('page_order')) { 29 | $table->addColumn('page_order', Types::INTEGER, [ 30 | 'notnull' => true, 31 | 'default' => self::defaultPageOrder, 32 | ]); 33 | return $schema; 34 | } 35 | */ 36 | 37 | return null; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/Migration/Version010300Date20220623000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives_pages'); 24 | if (!$table->hasColumn('emoji')) { 25 | $table->addColumn('emoji', Types::STRING, [ 26 | 'notnull' => false, 27 | 'length' => 8, 28 | ]); 29 | return $schema; 30 | } 31 | 32 | return null; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/Migration/Version010500Date20220722000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives_pages'); 24 | if (!$table->hasColumn('subpage_order')) { 25 | $table->addColumn('subpage_order', Types::TEXT, [ 26 | 'notnull' => false, 27 | 'length' => null, 28 | ]); 29 | return $schema; 30 | } 31 | 32 | return null; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/Migration/Version010500Date20220811000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives'); 23 | if ($table->hasColumn('page_order')) { 24 | $table->dropColumn('page_order'); 25 | return $schema; 26 | } 27 | 28 | return null; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/Migration/Version020100Date20221111000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives'); 24 | if (!$table->hasColumn('page_mode')) { 25 | $table->addColumn('page_mode', Types::INTEGER, [ 26 | 'notnull' => true, 27 | 'default' => 0, 28 | ]); 29 | return $schema; 30 | } 31 | 32 | return null; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/Migration/Version020600Date20230519000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives_pages'); 24 | if (!$table->hasColumn('trash_timestamp')) { 25 | $table->addColumn('trash_timestamp', Types::INTEGER, [ 26 | 'notnull' => false, 27 | ]); 28 | return $schema; 29 | } 30 | 31 | return null; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/Migration/Version021000Date20231206000000.php: -------------------------------------------------------------------------------- 1 | getTable('collectives_shares'); 24 | if (!$table->hasColumn('page_id')) { 25 | $table->addColumn('page_id', Types::BIGINT, [ 26 | 'notnull' => true, 27 | 'default' => 0, 28 | ]); 29 | 30 | return $schema; 31 | } 32 | 33 | return null; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/Migration/Version021200Date20240725154232.php: -------------------------------------------------------------------------------- 1 | getTable('collectives_pages'); 24 | if (!$table->hasColumn('full_width')) { 25 | $table->addColumn('full_width', Types::BOOLEAN, [ 26 | 'notnull' => false, 27 | 'default' => false, 28 | ]); 29 | 30 | return $schema; 31 | } 32 | 33 | return null; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/Mount/CollectiveMountPoint.php: -------------------------------------------------------------------------------- 1 | folderId; 37 | } 38 | 39 | public function getSourcePath(): string { 40 | return '/' . $this->collectiveFolderManager->getRootFolder()->getPath() . '/' . $this->getFolderId(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/Mount/NoExcludePropagatorStorageWrapper.php: -------------------------------------------------------------------------------- 1 | ` to the ignore list. 22 | * Our collective folders live there, so we need our own propagator. 23 | */ 24 | public function getPropagator($storage = null): Propagator { 25 | if (!$storage) { 26 | $storage = $this; 27 | } 28 | if (!isset($storage->propagator)) { 29 | $storage->propagator = new Propagator($storage, OC::$server->getDatabaseConnection()); 30 | } 31 | return $storage->propagator; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/Search/FileSearch/ClauseTokenizer.php: -------------------------------------------------------------------------------- 1 | l10n->t('Teams App Enabled'); 31 | } 32 | 33 | public function run(): SetupResult { 34 | if ($this->appManager->isEnabledForUser('circles')) { 35 | return SetupResult::success($this->l10n->t('Teams app is enabled')); 36 | } 37 | 38 | return SetupResult::error($this->l10n->t('The teams app is not enabled, but is required for Collectives to work.')); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/SetupChecks/PDOSQLiteDriverIsEnableCheck.php: -------------------------------------------------------------------------------- 1 | l10n->t('PDO SQLite driver'); 31 | } 32 | 33 | public function run(): SetupResult { 34 | if ($this->searchService->areDependenciesMet()) { 35 | return SetupResult::success($this->l10n->t('PDO SQLite driver is enabled, full text search of page content is available.')); 36 | } 37 | 38 | return SetupResult::error( 39 | $this->l10n->t('Collectives app is enabled, but PDO SQLite driver is missing. Please install it to enable full text search of the page content.') 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/Versions/CollectiveVersion.php: -------------------------------------------------------------------------------- 1 | versionFile; 37 | } 38 | 39 | public function getFolderId(): int { 40 | return $this->folderId; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /rector.php: -------------------------------------------------------------------------------- 1 | paths([ 17 | __DIR__ . '/lib', 18 | __DIR__ . '/tests', 19 | ]); 20 | $rectorConfig->phpVersion(PhpVersion::PHP_80); 21 | $rectorConfig->importNames(); 22 | $rectorConfig->indent(' ', 1); 23 | $rectorConfig->sets([ 24 | SetList::PHP_74, 25 | SetList::PHP_80, 26 | ]); 27 | $rectorConfig->rule(ReturnTypeFromStrictTypedPropertyRector::class); 28 | $rectorConfig->rule(ReturnUnionTypeRector::class); 29 | $rectorConfig->skip([ 30 | RemoveParentCallWithoutParentRector::class, 31 | ]); 32 | }; 33 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base" 5 | ], 6 | "timezone": "Europe/Berlin", 7 | "schedule": [ 8 | "before 5am every weekday", 9 | "every weekend" 10 | ], 11 | "reviewers": ["max-nextcloud", "mejo-"], 12 | "labels": ["dependencies"], 13 | "rangeStrategy": "bump", 14 | "rebaseWhen": "conflicted", 15 | "ignoreUnstable": false, 16 | "baseBranches": [ 17 | "main" 18 | ], 19 | "enabledManagers": [ 20 | "npm" 21 | ], 22 | "ignoreDeps": [ 23 | "node", 24 | "npm" 25 | ], 26 | "packageRules": [ 27 | { 28 | "groupName": "cypress", 29 | "matchPackageNames": [ 30 | "cypress", 31 | "@nextcloud/cypress" 32 | ] 33 | }, 34 | { 35 | "matchPackageNames": ["pinia"], 36 | "allowedVersions": "<3" 37 | }, 38 | { 39 | "matchPackageNames": ["vue"], 40 | "allowedVersions": "<3" 41 | }, 42 | { 43 | "matchPackageNames": ["vue-router"], 44 | "allowedVersions": "<4" 45 | }, 46 | { 47 | "matchPackageNames": ["vueuse"], 48 | "allowedVersions": "<12" 49 | } 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /skeleton/Readme.cs.md: -------------------------------------------------------------------------------- 1 | # Vítejte ve svém novém kolektivu 2 | 3 | **Organizujte se a vytvářejte sdílené znalosti!** 4 | 5 | 6 | ### 👥 Pozvěte do kolektivu nové lidi 7 | 8 | Ať už chcete přidat své přátele či celé skupiny, následujte odkaz „spravovat členy“, který naleznete v nabídce akcí v rámci seznamu kolektivů vlevo. 9 | 10 | ### 🌱 Vdechněte svému kolektivu život 11 | 12 | Vytvářejte stránky a sdílejte své myšlenky, které jsou opravdu důležité. Ať už se jedná o repozitář sdílených znalostí pro komunitu nebo příručka pro vaši organizaci – Kolektivy fungují! 13 | 14 | ### 🛋️ Upravte si tuto úvodní stránku tak, aby vám vyhovovala 15 | 16 | Klikněte na tlačítko tužky a začněte! ↗️ 17 | 18 | 19 | ## Také dobré vědět 20 | 21 | * Stránky je možné upravovat ve vícero lidech naráz. 22 | * Na místní stránky je možné se odkazovat označením textu a zvolením „odkázat na soubor“. Funguje i přetažení ze seznamu stránek do editoru. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Více k aplikaci naleznete v [dokumentaci](https://nextcloud.github.io/collectives/). 25 | * Pokud máte dotazy, obraťte se o pomoc na [komunitu](https://help.nextcloud.com/c/apps/collectives/174). 26 | -------------------------------------------------------------------------------- /skeleton/Readme.da.md: -------------------------------------------------------------------------------- 1 | # Velkommen til dit nye kollektiv 2 | 3 | **Kom, organiser og opbyg fælles viden!** 4 | 5 | 6 | ### 👥 Inviter nye personer til kollektivet 7 | 8 | Uanset om du vil tilføje dine venner eller hele grupper, skal du følge linket "administrer medlemmer", som du finder i handlingsmenuen inde i kollektivlisten til venstre. 9 | 10 | ### 🌱 Bring liv til dit kollektiv 11 | 12 | Opret sider og del dine tanker, der virkelig betyder noget. Uanset om det er et delt videnlager for fællesskabet eller en håndbog for din organisation – Kollektiver fungerer! 13 | 14 | ### 🛋️ Rediger og tilret denne startsside efter dine behov 15 | 16 | Tryk på blyantknappen for at komme i gang! ↗️ 17 | 18 | 19 | ## Også godt at vide 20 | 21 | * Flere personer kan redigere den samme side samtidigt. 22 | * Link lokale sider ved at vælge tekst og vælge "link fil". Træk og slip fra sideliste til editoren virker også. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Få mere at vide om denne app i [documentation](https://nextcloud.github.io/collectives/). 25 | * Spørg [fællesskabet](https://help.nextcloud.com/c/apps/collectives/174) om hjælp i tilfælde af spørgsmål. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.de.md: -------------------------------------------------------------------------------- 1 | # Willkommen zu Deinem neuen Kollektiv 2 | 3 | **Mach' mit, organisiere und baue gemeinsames Wissen auf!** 4 | 5 | 6 | ### 👥 Lade Andere zu dem Kollektiv ein 7 | 8 | Wenn du deine Freund:innen oder ganze Gruppen hinzufügen möchtest, klicke auf den Link "Mitglieder verwalten", den du im Aktionsmenü in der Kollektivliste links findest. 9 | 10 | ### 🌱 Bringe Leben in dein Kollektiv 11 | 12 | Erstelle Seiten und teile deine wertvollen Gedanken. Ob eine gemeinsame Wissensdatenbank für die Community oder ein Handbuch für deine Organisation – Kollektive funktioniert! 13 | 14 | ### 🛋️ Bearbeite diese Startseite, um dich wie zu Hause zu fühlen 15 | 16 | Klicke auf den Stift um zu beginnen! ↗️ 17 | 18 | 19 | ## Auch gut zu wissen 20 | 21 | * Dieselbe Seite kann von mehreren Personen gemeinsam bearbeitet werden. 22 | * Verlinke lokale Seiten, indem du Text auswählst und "Datei verknüpfen" wählst. Drag & Drop aus der Seitenliste in den Editor funktioniert ebenfalls. 23 | * Erstelle Vorlagen für künftige Seiten, indem du "Templates verwalten" im Drei-Punkte-Menü der Startseite auswählst. 24 | * Erfahre in der [Dokumentation](https://nextcloud.github.io/collectives/) mehr über diese App. 25 | * Bitte [im Forum](https://help.nextcloud.com/c/apps/collectives/174) um Hilfe, falls du eine Frage hast. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.de_DE.md: -------------------------------------------------------------------------------- 1 | # Willkommen zu Ihrem neuen Kollektiv 2 | 3 | **Machen Sie mit, organisieren und bauen Sie gemeinsames Wissen auf!** 4 | 5 | 6 | ### 👥 Laden Sie Andere zu dem Kollektiv ein 7 | 8 | Wenn Sie Ihre Freund:innen oder ganze Gruppen hinzufügen möchten, klicken Sie auf den Link "Mitglieder verwalten", den Sie im Aktionsmenü in der Kollektivliste links finden. 9 | 10 | ### 🌱 Bringen Sie Leben in Ihr Kollektiv 11 | 12 | Erstellen Sie Seiten und teilen Sie Ihre wertvollen Gedanken. Ob eine gemeinsame Wissensdatenbank für die Community oder ein Handbuch für Ihre Organisation – Kollektive funktioniert! 13 | 14 | ### 🛋️ Bearbeiten Sie diese Startseite, um sich wie zu Hause zu fühlen 15 | 16 | Klicken Sie auf den Stift um zu beginnen! ↗️ 17 | 18 | 19 | ## Auch gut zu wissen 20 | 21 | * Dieselbe Seite kann von mehreren Personen gemeinsam bearbeitet werden. 22 | * Verlinken Sie lokale Seiten, indem Sie Text auswählen und "Datei verknüpfen" wählen. Drag & Drop aus der Seitenliste in den Editor funktioniert ebenfalls. 23 | * Erstellen Sie Vorlagen für künftige Seiten, indem Sie "Templates verwalten" im Drei-Punkte-Menü der Startseite auswählen. 24 | * Erfahren Sie in der [Dokumentation](https://nextcloud.github.io/collectives/) mehr über diese App. 25 | * Bitten Sie [im Forum](https://help.nextcloud.com/c/apps/collectives/174) um Hilfe, falls Sie Fragen haben. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.en.md: -------------------------------------------------------------------------------- 1 | # Welcome to your new collective 2 | 3 | **Come, organize and build shared knowledge!** 4 | 5 | 6 | ### 👥 Invite new people to the collective 7 | 8 | Whether you want to add your friends or whole groups, follow the "manage members" link that you find in the action menu inside the collectives list on the left. 9 | 10 | ### 🌱 Bring life to your collective 11 | 12 | Create pages and share your thoughts that really matter. Whether it's a shared knowledge repository for the community or a handbook for your organisation – Collectives works! 13 | 14 | ### 🛋️ Edit this landing page to feel like home 15 | 16 | Push the pencil button to get started! ↗️ 17 | 18 | 19 | ## Also good to know 20 | 21 | * Multiple people can edit the same page simultaneously. 22 | * Link local pages by selecting text and choosing "link file". Drag & drop from page list into the editor also works. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Find out more about this App in the [documentation](https://nextcloud.github.io/collectives/). 25 | * Ask [the community](https://help.nextcloud.com/c/apps/collectives/174) for help in case of questions. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.fr.md: -------------------------------------------------------------------------------- 1 | # Bienvenue sur votre nouveau collectif 2 | 3 | **Venez, organisez et construisez des connaissances partagées !** 4 | 5 | 6 | ### 👥 Invitez de nouvelles personnes dans le collectif 7 | 8 | Que vous souhaitiez ajouter vos amis ou des groupes entiers, suivez le lien « gérer les membres » dans le menu d'action dans la liste des collectifs sur la gauche. 9 | 10 | ### 🌱 Donnez vie à votre collectif 11 | 12 | Créez des pages et partagez les idées qui comptent vraiment pour vous. Qu'il s'agisse d'un dépôt de connaissances partagé pour la communauté ou d'un manuel pour votre organisation - les collectifs sont faits pour ça ! 13 | 14 | ### 🛋️ Modifiez cette page d'accueil pour vous sentir comme à la maison 15 | 16 | Appuyez sur le bouton avec un crayon pour commencer ! ↗ 17 | 18 | 19 | ## Bon à savoir également 20 | 21 | * Plusieurs personnes peuvent modifier la même page simultanément. 22 | * Liez des pages en sélectionnant du texte puis en cliquant sur « lier le fichier ». Le glisser-déposer de la liste des pages vers l'éditeur fonctionne également. 23 | * Ajoutez des modèles pour de futures sous-pages via « Manage templates » in the landing page three-dot-menu. 24 | * Pour en savoir plus sur cette application, consultez la [documentation](https://nextcloud.github.io/collectives/). 25 | * Demandez de l'aide à [la communauté](https://help.nextcloud.com/c/apps/collectives/174) en cas de questions. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.it.md: -------------------------------------------------------------------------------- 1 | # Benvenuto nel tuo nuovo collettivo 2 | 3 | **Entra, organizza e costruisci la conoscenza condivisa!** 4 | 5 | 6 | ### 👥 Invita nuove persone al collettivo 7 | 8 | Per aggiungere i tuoi amici o interi gruppi di persone segui il link "gestisci membri" che trovi nel menu all'interno della lista dei collettivi a sinistra. 9 | 10 | ### 🌱 Mantieni in vita il tuo collettivo 11 | 12 | Crea pagine e condividi i tuoi pensieri che importano. Che sia un repository di conoscenza condivisa per la community o un manuale per la tua organizzazione - i Collettivi funzionano! 13 | 14 | ### 🛋️ Modifica questa landing page per renderla tua 15 | 16 | Premi il pulsante matita per iniziare! ↗️ 17 | 18 | 19 | ## Altre cose buone a sapersi 20 | 21 | * Più persone possono modificare la stessa pagina contemporaneamente. 22 | * Crea link verso pagine locali selezionando del testo e scegliendo "collega file". Oppure, puoi anche trascinare dalla lista delle pagine direttamente nell'editor. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Scopri di più su questa App nella [documentazione](https://nextcloud.github.io/collectives/). 25 | * Chiedi alla [community](https://help.nextcloud.com/c/apps/collectives/174) per ricevere aiuto o risposte ad altre domande. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.ja.md: -------------------------------------------------------------------------------- 1 | # Welcome to your new collective 2 | 3 | **皆で寄ってたかって知識を共有しましょう** 4 | 5 | 6 | ### 👥 新しいメンバーを招待しましょう 7 | 8 | 左側のコレクティブリストにあるアクションメニュー内の「メンバーの管理」から、メンバーやグループを追加しましょう。 9 | 10 | ### 🌱 コレクティブに頼ろう 11 | 12 | ページを作成して考えを共有することはとても大切です。コミュニティ向け、または組織のハンドブックとしての知識リポジトリの両方に -- コレクティブは機能します! 13 | 14 | ### 🛋️この最初のページをホームのように編集しましょう 15 | 16 | えんぴつボタンを押して開始します↗️ 17 | 18 | 19 | ## 知っておくと便利なこと 20 | 21 | * 複数人で同時に同じページを編集できます。 22 | * ローカルページのリンクには、テキストを選択した状態で「ファイルのリンク」をクリックします。ページリストからエディターにドラッグ&ドロップするのも同様に機能します。 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * [ドキュメント](https://nextcloud.github.io/collectives/)(英語)にこのアプリに関する詳細な情報があります。 25 | * 質問がある場合は[コミュニティ](https://help.nextcloud.com/c/apps/collectives/174)(英語)で尋ねましょう。 26 | -------------------------------------------------------------------------------- /skeleton/Readme.nb_NO.md: -------------------------------------------------------------------------------- 1 | # Velkommen til din nye gemenskap 2 | 3 | *Ta del, organiser og bygg delt kunnskap!* 4 | 5 | 6 | ### 🐾 Legg til dine venner i kollektivet 7 | 8 | Whether you want to add your friends or whole groups, follow the "manage members" link that you find in the action menu inside the collectives list on the left. 9 | 10 | ### 🌱 Gi liv til din gemenskap 11 | 12 | Opprett sider og del kunnskap som betyr noe. 13 | 14 | ### 🛋️ Rediger denne landingssiden for å gjøre ting innbydende 15 | 16 | Trykk på blyanten for å begynne. ↗️ 17 | 18 | 19 | ## Også nyttig å vite 20 | 21 | * Flere kan redigere samme side samtidig. 22 | * Lenk sammen lokale sider ved først å velge tekst, og så «lenk fil». 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Finn ut mer om dette programmet i [dokumentasjonen](https://nextcloud.github.io/collectives/). 25 | * Spør [gemenskapen](https://help.nextcloud.com/c/apps/collectives/174) om hjelp i fall du har problemer. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.nl.md: -------------------------------------------------------------------------------- 1 | # Welkom bij je nieuwe collectief 2 | 3 | **Kom samen, organiseer en ontwikkel gedeelde kennis!** 4 | 5 | 6 | ### 👥 Nodig nieuwe mensen uit voor het collectief 7 | 8 | Of je nu je vrienden, collega's of hele groepen wilt toevoegen, klik op de link "leden beheren" in het actiemenu in de lijst met collectives aan de linkerkant. 9 | 10 | ### 🌱 Breng je collectief tot leven 11 | 12 | Maak pagina's en deel je gedachten die er echt toe doen. Of het nu gaat om een gedeelde kennisbank voor een community of een handboek voor de organisatie – Collectives werkt! 13 | 14 | ### 🛋️ Bewerk deze bestemmingspagina om je thuis te voelen 15 | 16 | Klik op het potlood om te beginnen! ️ 17 | 18 | 19 | ## Ook goed om te weten 20 | 21 | * Meerdere mensen kunnen tegelijkertijd dezelfde pagina bewerken. 22 | * Link lokale pagina's door tekst te selecteren en "link bestand" te kiezen. Een drag & drop vanaf de paginalijst naar de editor werkt ook. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Lees meer over deze app in de [documentatie](https://nextcloud.github.io/collectives/). 25 | * Vraag [de community](https://help.nextcloud.com/c/apps/collectives/174) om hulp bij vragen. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.pl.md: -------------------------------------------------------------------------------- 1 | # Witaj w swoim nowym kolektywie 2 | 3 | **Gromadź się w kolektywach, aby budować wspólną wiedzę.** 4 | 5 | 6 | ### 👥 Zapraszaj nowych ludzi do kolektywu 7 | 8 | Niezależnie od tego, czy chcesz dodać znajomych, czy całe grupy, kliknij link „zarządzaj członkami”, który znajdziesz w menu akcji na liście kolektywów po lewej stronie. 9 | 10 | ### 🌱 Tchnij życie do twojego kolektywu 11 | 12 | Twórz strony i dziel się swoimi przemyśleniami, które naprawdę mają znaczenie. Niezależnie od tego, czy jest to wspólne repozytorium wiedzy dla społeczności, czy podręcznik dla Twojej organizacji – Kolektywy działają! 13 | 14 | ### 🛋️ Edytuj tę stronę, aby poczuć się jak w domu 15 | 16 | Naciśnij przycisk ołówka, aby rozpocząć! ↗️ 17 | 18 | 19 | ## Również dobrze wiedzieć 20 | 21 | * Wiele osób może jednocześnie edytować tę samą stronę. 22 | * Połącz strony lokalne, zaznaczając tekst i wybierając „link do pliku”. Przeciągnij i upuść z listy stron do edytora również działa. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Dowiedz się więcej o tej aplikacji w [dokumentacji] (https://nextcloud.github.io/collectives/). 25 | * W razie pytań poproś [społeczność](https://help.nextcloud.com/c/apps/collectives/174) o pomoc. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.pt.md: -------------------------------------------------------------------------------- 1 | # Bem vindo a sua nova coletividade 2 | 3 | **Venha, organize e construa conhecimento compartilhado!** 4 | 5 | 6 | ### 👥 Convide novas pessoas para a coletividade 7 | 8 | Se deseja adicionar seus amigos ou grupos inteiros, siga o link "gerenciar membros" que você encontra no menu dentro da lista de coletividades à esquerda. 9 | 10 | ### 🌱 Traga vida para sua coletividade 11 | 12 | Crie páginas e compartilhe seus pensamentos importantes. Isto pode ser um repositório de conhecimento compartilhado com a comunidade ou um manual para sua organização – Trabalho coletivo! 13 | 14 | ### 🛋️ Edite esta página e deixe-a a sua cara 15 | 16 | Clique no botão do lápis para começar! ↗️ 17 | 18 | 19 | ## Também é bom saber 20 | 21 | * Várias pessoas podem editar a mesma página simultaneamente. 22 | * Crie links com páginas locais selecionando um texto e clicando em "vincular arquivo". Arrastar da lista de páginas e soltar aqui dentro do editor também funciona. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Saiba mais sobre este aplicativo na [documentação](https://nextcloud.github.io/collectives/). 25 | * Pergunte para a [comunidade](https://help.nextcloud.com/c/apps/collectives/174) e obtenha ajuda em caso de dúvidas. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.pt_BR.md: -------------------------------------------------------------------------------- 1 | # Bem vindo a sua nova coletividade 2 | 3 | **Venha, organize e construa conhecimento compartilhado!** 4 | 5 | 6 | ### 👥 Convide novas pessoas para a coletividade 7 | 8 | Se deseja adicionar seus amigos ou grupos inteiros, siga o link "gerenciar membros" que você encontra no menu dentro da lista de coletividades à esquerda. 9 | 10 | ### 🌱 Traga vida para sua coletividade 11 | 12 | Crie páginas e compartilhe seus pensamentos importantes. Isto pode ser um repositório de conhecimento compartilhado com a comunidade ou um manual para sua organização – Trabalho coletivo! 13 | 14 | ### 🛋️ Edite esta página e deixe-a a sua cara 15 | 16 | Clique no botão do lápis para começar! ↗️ 17 | 18 | 19 | ## Também é bom saber 20 | 21 | * Várias pessoas podem editar a mesma página simultaneamente. 22 | * Crie links com páginas locais selecionando um texto e clicando em "vincular arquivo". Arrastar da lista de páginas e soltar aqui dentro do editor também funciona. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Saiba mais sobre este aplicativo na [documentação](https://nextcloud.github.io/collectives/). 25 | * Pergunte para a [comunidade](https://help.nextcloud.com/c/apps/collectives/174) e obtenha ajuda em caso de dúvidas. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.si.md: -------------------------------------------------------------------------------- 1 | # ඔබගේ නව සාමූහිකයට සාදරයෙන් පිළිගනිමු 2 | 3 | **Come, organize and build shared knowledge!** 4 | 5 | 6 | ### 👥 Invite new people to the collective 7 | 8 | Whether you want to add your friends or whole groups, follow the "manage members" link that you find in the action menu inside the collectives list on the left. 9 | 10 | ### 🌱 Bring life to your collective 11 | 12 | Create pages and share your thoughts that really matter. Whether it's a shared knowledge repository for the community or a handbook for your organisation – Collectives works! 13 | 14 | ### 🛋️ Edit this landing page to feel like home 15 | 16 | Push the pencil button to get started! ↗️ 17 | 18 | 19 | ## Also good to know 20 | 21 | * Multiple people can edit the same page simultaneously. 22 | * Link local pages by selecting text and choosing "link file". Drag & drop from page list into the editor also works. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Find out more about this App in the [documentation](https://nextcloud.github.io/collectives/). 25 | * Ask [the community](https://help.nextcloud.com/c/apps/collectives/174) for help in case of questions. 26 | -------------------------------------------------------------------------------- /skeleton/Readme.sl.md: -------------------------------------------------------------------------------- 1 | # Nova zbirka za nove naloge 2 | 3 | **Enostaven način za organiziranje in pripravo skupne vsebine!** 4 | 5 | 6 | ### 👥 K sodelovanju priprave zbirke povabite tudi druge 7 | 8 | Dodajanje posameznikov ali celotnih skupin je enostavno; sledite povezavi do strani za "Upravljanje članov", ki je v meniju znotraj seznama zbirk v levem oknu. 9 | 10 | ### 🌱 Zbirki vdahnite življenje 11 | 12 | Ustvarjajte strani in si skupinsko izmenjujte misli, ki so zares pomembne. Ni pomembno, ali je zbirka skladišče podatkov, priročnik za ustanovo, dnevnik – Zbirke so sila uporabne! 13 | 14 | ### 🛋️ Začetno stran si prilagodite za delo 15 | 16 | Pritisnite gumb s svinčnikom in začnite! ↗️ 17 | 18 | 19 | ## Dobro je tudi vedeti ... 20 | 21 | * Stran lahko hkrati ureja več oseb. 22 | * Krajevne strani je mogoče povezati tudi kot »povezave na datoteke«. Podprta je tudi možnost povleci in spusti s seznama strani v urejevalnik. 23 | * Add templates for future subpages via "Manage templates" in the landing page three-dot-menu. 24 | * Več o programu je zapisanega v [dokumentaciji] (https://nextcloud.github.io/collectives/). 25 | * Na vprašanja hitro odgovarja tudi [skupnost](https://help.nextcloud.com/c/apps/collectives/174). 26 | -------------------------------------------------------------------------------- /src/apis/collectives/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | export * from './urls.js' 7 | export * from './collectives.js' 8 | export * from './pages.js' 9 | export * from './sessions.js' 10 | export * from './settings.js' 11 | export * from './shares.js' 12 | export * from './templates.js' 13 | export * from './userSettings.js' 14 | -------------------------------------------------------------------------------- /src/apis/collectives/sessions.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import axios from '@nextcloud/axios' 7 | import { apiUrl } from './urls.js' 8 | 9 | /** 10 | * Create a new session for the current user 11 | * 12 | * @param {number} collectiveId - ID of the collective 13 | */ 14 | export function createSession(collectiveId) { 15 | return axios.post(apiUrl('v1.0', `session/${collectiveId}`)) 16 | } 17 | 18 | /** 19 | * Update an existing session for the current user 20 | * 21 | * @param {number} collectiveId - ID of the collective 22 | * @param {string} token - Session token 23 | */ 24 | export function updateSession(collectiveId, token) { 25 | return axios.put(apiUrl('v1.0', `session/${collectiveId}`), { token }) 26 | } 27 | 28 | /** 29 | * Close a session for the current user 30 | * 31 | * @param {number} collectiveId - ID of the collective 32 | * @param {string} token - Session token 33 | */ 34 | export function closeSession(collectiveId, token) { 35 | return axios.delete(apiUrl('v1.0', `session/${collectiveId}?token=${token}`)) 36 | } 37 | -------------------------------------------------------------------------------- /src/apis/collectives/settings.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import axios from '@nextcloud/axios' 7 | import { apiUrl } from './urls.js' 8 | 9 | /** 10 | * Get collectives folder setting for the current user 11 | */ 12 | export function getCollectivesFolder() { 13 | return axios.get(apiUrl('v1.0', 'settings/user/user_folder')) 14 | } 15 | 16 | /** 17 | * Set collectives folder setting for the current user 18 | * @param {string} value Name of the collective folder to use 19 | */ 20 | export function setCollectivesFolder(value) { 21 | return axios.post( 22 | apiUrl('v1.0', 'settings/user'), 23 | { key: 'user_folder', value }, 24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /src/components/CollectiveNotFound.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | 16 | 35 | 36 | 42 | -------------------------------------------------------------------------------- /src/components/Icon/PageIcon.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 22 | 23 | 42 | -------------------------------------------------------------------------------- /src/components/Icon/PageTemplateIcon.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 22 | 23 | 42 | -------------------------------------------------------------------------------- /src/components/Icon/PagesTemplateIcon.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 23 | 24 | 43 | -------------------------------------------------------------------------------- /src/components/LastUserBubble.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 18 | 19 | 56 | -------------------------------------------------------------------------------- /src/components/Member/Hint.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 24 | 25 | 38 | -------------------------------------------------------------------------------- /src/components/Page/LandingPageWidgets/WidgetHeading.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 24 | 25 | 32 | -------------------------------------------------------------------------------- /src/components/Page/PageNotFound.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 14 | 15 | 34 | -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | export const INDEX_PAGE = 'Readme' 7 | export const TEMPLATE_PAGE = 'Template' 8 | 9 | // Circle lember levels 10 | export const memberLevels = { 11 | LEVEL_MEMBER: 1, 12 | LEVEL_MODERATOR: 4, 13 | LEVEL_ADMIN: 8, 14 | LEVEL_OWNER: 9, 15 | } 16 | 17 | // Circle member types 18 | export const circlesMemberTypes = { 19 | TYPE_USER: 1, 20 | TYPE_GROUP: 2, 21 | TYPE_MAIL: 4, 22 | TYPE_CIRCLE: 16, 23 | } 24 | 25 | export const autocompleteSourcesToCircleMemberTypes = { 26 | users: 'TYPE_USER', 27 | groups: 'TYPE_GROUP', 28 | circles: 'TYPE_CIRCLE', 29 | } 30 | 31 | // Nextcloud share types 32 | export const shareTypes = { 33 | TYPE_USER: 0, 34 | TYPE_GROUP: 1, 35 | TYPE_EMAIL: 4, 36 | TYPE_REMOTE: 6, 37 | TYPE_CIRCLE: 7, 38 | } 39 | 40 | // Page modes 41 | export const pageModes = { 42 | MODE_VIEW: 0, 43 | MODE_EDIT: 1, 44 | } 45 | 46 | export const editorApiReaderFileId = 'READER_FILE_ID' 47 | export const editorApiUpdateReadonlyBarProps = 'UPDATE_READONLY_BAR_PROPS' 48 | 49 | export const sessionUpdateInterval = 90 // in seconds 50 | -------------------------------------------------------------------------------- /src/css/animation.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | @keyframes highlight-animation { 7 | 0% { background-color: var(--color-background-hover); } 8 | 50% { background-color: var(--color-background-hover); } 9 | 100% { background-color: rgba(var(--color-background-hover), 0); } 10 | } 11 | -------------------------------------------------------------------------------- /src/files.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { generateUrl, imagePath } from '@nextcloud/router' 7 | import './shared-init.js' 8 | 9 | window.addEventListener('DOMContentLoaded', () => { 10 | if (OCA.Theming) { 11 | OC.MimeType._mimeTypeIcons['dir-collective'] = generateUrl('/apps/theming/img/collectives/folder-collective.svg?v=' + OCA.Theming.cacheBuster) 12 | } else { 13 | OC.MimeType._mimeTypeIcons['dir-collective'] = imagePath('collectives', 'folder-collective') 14 | } 15 | }) 16 | -------------------------------------------------------------------------------- /src/files/FilesCollectiveHeader.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import FileListInfo from '../views/FileListInfo.vue' 7 | import Vue from 'vue' 8 | import { loadState } from '@nextcloud/initial-state' 9 | import { Header } from '@nextcloud/files' 10 | 11 | let vm = null 12 | 13 | const FilesCollectiveHeader = new Header({ 14 | id: 'collective', 15 | order: 9, 16 | 17 | enabled(folder, view) { 18 | return view.id === 'files' || view.id === 'files.public' 19 | }, 20 | 21 | render(el, folder, view) { 22 | el.id = 'files-collective-wrapper' 23 | Vue.prototype.t = window.t 24 | Vue.prototype.n = window.n 25 | const collectivesFolder = loadState('collectives', 'user_folder', null) 26 | const View = Vue.extend(FileListInfo) 27 | vm = new View({ 28 | propsData: { 29 | collectivesFolder, 30 | path: folder.path, 31 | }, 32 | }).$mount(el) 33 | }, 34 | 35 | updated(folder, view) { 36 | vm.path = folder.path 37 | }, 38 | }) 39 | 40 | export { 41 | FilesCollectiveHeader, 42 | } 43 | -------------------------------------------------------------------------------- /src/init.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { registerFileListHeaders } from '@nextcloud/files' 7 | import { FilesCollectiveHeader } from './files/FilesCollectiveHeader.js' 8 | 9 | registerFileListHeaders(FilesCollectiveHeader) 10 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import Vue from 'vue' 7 | import Collectives from './Collectives.vue' 8 | import router from './router.js' 9 | import { createPinia, PiniaVuePlugin } from 'pinia' 10 | 11 | import './shared-init.js' 12 | 13 | window.OCA.Collectives = { 14 | ...window.OCA.Collectives, 15 | vueRouter: router, 16 | } 17 | 18 | Vue.prototype.t = t 19 | Vue.prototype.n = n 20 | Vue.prototype.OC = OC 21 | Vue.prototype.OCA = OCA 22 | 23 | Vue.use(PiniaVuePlugin) 24 | const pinia = createPinia() 25 | 26 | const app = new Vue({ 27 | el: '#content', 28 | router, 29 | pinia, 30 | render: h => h(Collectives), 31 | }) 32 | 33 | // Expose the app during E2E tests 34 | if (window.Cypress) { 35 | window.app = app 36 | } 37 | 38 | export default app 39 | -------------------------------------------------------------------------------- /src/mixins/CopyToClipboardMixin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { showError, showSuccess } from '@nextcloud/dialogs' 7 | 8 | export default { 9 | data() { 10 | return { 11 | copied: false, 12 | copyLoading: false, 13 | copySuccess: false, 14 | } 15 | }, 16 | 17 | methods: { 18 | async copyToClipboard(url) { 19 | // change to loading status 20 | this.copyLoading = true 21 | 22 | // copy link to clipboard 23 | try { 24 | await navigator.clipboard.writeText(url) 25 | this.copySuccess = true 26 | this.copied = true 27 | 28 | // Notify success 29 | showSuccess(t('collectives', 'Link copied')) 30 | } catch (error) { 31 | this.copySuccess = false 32 | this.copied = true 33 | showError( 34 | `
${t('collectives', 'Could not copy link to the clipboard:')}
${url}
`, 35 | { isHTML: true }) 36 | } finally { 37 | this.copyLoading = false 38 | setTimeout(() => { 39 | // stop loading status regardless of outcome 40 | this.copySuccess = false 41 | this.copied = false 42 | }, 4000) 43 | } 44 | }, 45 | }, 46 | } 47 | -------------------------------------------------------------------------------- /src/mixins/pageContentMixin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import axios from '@nextcloud/axios' 7 | import { mapState } from 'pinia' 8 | import { useRootStore } from '../stores/root.js' 9 | 10 | export default { 11 | computed: { 12 | ...mapState(useRootStore, [ 13 | 'isPublic', 14 | 'shareTokenParam', 15 | ]), 16 | }, 17 | 18 | methods: { 19 | /** 20 | * Get markdown content of page 21 | * 22 | * @param {string} davUrl URL to fetch page via DAV 23 | */ 24 | async fetchPageContent(davUrl) { 25 | // Add `timestamp` as cache buster param 26 | const axiosConfig = { 27 | params: { 28 | timestamp: Math.floor(Date.now() / 1000), 29 | }, 30 | } 31 | // Authenticate via share token for public shares 32 | if (this.isPublic) { 33 | axiosConfig.auth = { 34 | username: this.shareTokenParam, 35 | } 36 | } 37 | 38 | try { 39 | const content = await axios.get(davUrl, axiosConfig) 40 | // content.data will attempt to parse as json, but we want the raw text. 41 | return content.request.responseText 42 | } catch (e) { 43 | console.error('Failed to fetch content of page', e) 44 | } 45 | }, 46 | }, 47 | } 48 | -------------------------------------------------------------------------------- /src/mixins/serverCapabilities.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { getCapabilities } from '@nextcloud/capabilities' 7 | 8 | export default { 9 | data() { 10 | return { 11 | capabilities: getCapabilities(), 12 | } 13 | }, 14 | 15 | computed: { 16 | passwordPolicy() { 17 | return this.capabilities?.password_policy || {} 18 | }, 19 | }, 20 | } 21 | -------------------------------------------------------------------------------- /src/mixins/uniqueIdMixin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | // Idea taken from https://github.com/vuejs/vue/issues/5886#issuecomment-308647738 7 | // Replace by `useId` when migrating to Vue3: https://vuejs.org/api/composition-api-helpers.html#useid 8 | 9 | let uniqueId = 0 10 | 11 | export default { 12 | beforeCreate() { 13 | this.uniqueId = uniqueId.toString() 14 | uniqueId += 1 15 | }, 16 | } 17 | -------------------------------------------------------------------------------- /src/reference.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { registerWidget } from '@nextcloud/vue/dist/Components/NcRichText.js' 7 | import Vue from 'vue' 8 | import PageReferenceWidget from './views/PageReferenceWidget.vue' 9 | import './shared-init.js' 10 | 11 | Vue.prototype.t = t 12 | Vue.prototype.n = n 13 | Vue.prototype.OC = OC 14 | Vue.prototype.OCA = OCA 15 | 16 | registerWidget('collectives_page', (el, { richObjectType, richObject, accessible }) => { 17 | const Widget = Vue.extend(PageReferenceWidget) 18 | new Widget({ 19 | propsData: { 20 | richObjectType, 21 | richObject, 22 | accessible, 23 | }, 24 | }).$mount(el) 25 | }) 26 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | import Vue from 'vue' 6 | import VueRouter from 'vue-router' 7 | import { generateUrl } from '@nextcloud/router' 8 | import Home from './views/Home.vue' 9 | import CollectivePrintView from './views/CollectivePrintView.vue' 10 | import CollectiveView from './views/CollectiveView.vue' 11 | 12 | Vue.use(VueRouter) 13 | 14 | const routes = [ 15 | { 16 | path: '/', 17 | component: Home, 18 | }, 19 | { 20 | path: '/_/print/:collective', 21 | component: CollectivePrintView, 22 | props: (route) => route.params, 23 | }, 24 | { 25 | path: '/p/:token/print/:collective', 26 | component: CollectivePrintView, 27 | props: (route) => route.params, 28 | }, 29 | { 30 | path: '/p/:token/:collective', 31 | component: CollectiveView, 32 | props: (route) => route.params, 33 | children: [{ path: ':page*' }], 34 | }, 35 | { 36 | path: '/:collective', 37 | component: CollectiveView, 38 | props: (route) => route.params, 39 | children: [{ path: ':page*' }], 40 | }, 41 | ] 42 | 43 | export default new VueRouter({ 44 | mode: 'history', 45 | base: generateUrl('/apps/collectives', ''), 46 | routes, 47 | }) 48 | -------------------------------------------------------------------------------- /src/shared-init.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | import { getRequestToken } from '@nextcloud/auth' 6 | import { generateFilePath } from '@nextcloud/router' 7 | 8 | // eslint-disable-next-line 9 | __webpack_nonce__ = btoa(getRequestToken()) 10 | 11 | if (!process.env.WEBPACK_SERVE) { 12 | // eslint-disable-next-line 13 | __webpack_public_path__ = generateFilePath('collectives', '', 'js/') 14 | } else { 15 | // eslint-disable-next-line 16 | __webpack_public_path__ = 'http://127.0.0.1:3000/' 17 | } 18 | -------------------------------------------------------------------------------- /src/stores/pageExtracts.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | // Functions extracted from pinia page store to be reused in other places 7 | 8 | /* eslint import/namespace: ['error', { allowComputed: true }] */ 9 | import * as sortOrders from '../util/sortOrders.js' 10 | 11 | /** 12 | * @param {object} state state of the pinia store 13 | */ 14 | export function sortedSubpages(state) { 15 | return (parentId, sortOrder) => { 16 | const parentPage = state.pages.find(p => p.id === parentId) 17 | const customOrder = parentPage?.subpageOrder || [] 18 | return state.pages 19 | .filter(p => p.parentId === parentId) 20 | // add the index from customOrder 21 | .map(p => ({ ...p, index: customOrder.indexOf(p.id) })) 22 | // sort by given order, fall back to user setting 23 | .sort(sortOrders[sortOrder] || state.sortOrder) 24 | } 25 | } 26 | 27 | /** 28 | * @param {object} state state of the pinia store 29 | */ 30 | export function pageParents(state) { 31 | return (pageId) => { 32 | const pages = [] 33 | while (pageId !== state.rootPage.id) { 34 | const page = state.pages.find(p => (p.id === pageId)) 35 | if (!page) { 36 | break 37 | } 38 | pages.unshift(page) 39 | pageId = page.parentId 40 | } 41 | return pages 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/stores/search.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { defineStore } from 'pinia' 7 | import { emit } from '@nextcloud/event-bus' 8 | 9 | export const useSearchStore = defineStore('search', { 10 | state: () => ({ 11 | searchQuery: '', 12 | matchAll: true, 13 | shouldShowSearchDialog: false, 14 | results: null, 15 | }), 16 | 17 | actions: { 18 | setSearchQuery(query) { 19 | this.searchQuery = query 20 | }, 21 | showSearchDialog(value) { 22 | this.shouldShowSearchDialog = value 23 | }, 24 | toggleMatchAll() { 25 | this.matchAll = !this.matchAll 26 | }, 27 | setSearchResults(results) { 28 | this.results = results 29 | }, 30 | searchNext() { 31 | emit('collectives:next-search') 32 | this.matchAll = false 33 | }, 34 | searchPrevious() { 35 | emit('collectives:previous-search') 36 | this.matchAll = false 37 | }, 38 | }, 39 | }) 40 | -------------------------------------------------------------------------------- /src/stores/sessions.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { defineStore } from 'pinia' 7 | import * as api from '../apis/collectives/index.js' 8 | import { useCollectivesStore } from './collectives.js' 9 | 10 | export const useSessionsStore = defineStore('sessions', { 11 | state: () => ({ 12 | session: {}, 13 | }), 14 | 15 | getters: { 16 | hasSession: (state) => Object.keys(state.session).length, 17 | }, 18 | 19 | actions: { 20 | async createSession() { 21 | const collectivesStore = useCollectivesStore() 22 | const response = await api.createSession(collectivesStore.currentCollective.id) 23 | this.session = { collectiveId: collectivesStore.currentCollective.id, token: response.data.ocs.data.token } 24 | }, 25 | 26 | async updateSession() { 27 | try { 28 | await api.updateSession(this.session.collectiveId, this.session.token) 29 | } catch (e) { 30 | console.error('Session update failed, creating a new one') 31 | this.createSession() 32 | } 33 | }, 34 | 35 | async closeSession() { 36 | await api.closeSession(this.session.collectiveId, this.session.token) 37 | this.session = {} 38 | }, 39 | }, 40 | }) 41 | -------------------------------------------------------------------------------- /src/stores/settings.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { defineStore } from 'pinia' 7 | import * as settings from '../apis/collectives/settings.js' 8 | 9 | export const useSettingsStore = defineStore('settings', { 10 | state: () => ({ 11 | collectivesFolder: '', 12 | }), 13 | 14 | actions: { 15 | /** 16 | * Get collectives folder setting for user 17 | */ 18 | async getCollectivesFolder() { 19 | const response = await settings.getCollectivesFolder() 20 | this.collectivesFolder = response.data.ocs.data 21 | }, 22 | 23 | /** 24 | * Update collectives folder setting for user 25 | * 26 | * @param {string} collectivesFolder path to collectives folder 27 | */ 28 | async updateCollectivesFolder(collectivesFolder) { 29 | const response = await settings.setCollectivesFolder(collectivesFolder) 30 | this.collectivesFolder = response.data.ocs.data 31 | }, 32 | }, 33 | }) 34 | -------------------------------------------------------------------------------- /src/stores/versions.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import { defineStore } from 'pinia' 7 | import axios from '@nextcloud/axios' 8 | import { getCurrentUser } from '@nextcloud/auth' 9 | import { generateRemoteUrl } from '@nextcloud/router' 10 | import xmlToVersionsList from '../util/xmlToVersionsList.js' 11 | 12 | export const useVersionsStore = defineStore('versions', { 13 | state: () => ({ 14 | version: null, 15 | versions: [], 16 | }), 17 | 18 | getters: { 19 | hasVersionsLoaded: (state) => !!state.versions.length, 20 | }, 21 | 22 | actions: { 23 | selectVersion(version) { 24 | this.version = version 25 | }, 26 | 27 | async getVersions(pageId) { 28 | const user = getCurrentUser().uid 29 | const versionsUrl = generateRemoteUrl(`dav/versions/${user}/versions/${pageId}`) 30 | const response = await axios({ 31 | method: 'PROPFIND', 32 | url: versionsUrl, 33 | data: ` 34 | 35 | 36 | 37 | 38 | 39 | 40 | `, 41 | }) 42 | this.versions = xmlToVersionsList(response.data).reverse() 43 | }, 44 | }, 45 | }) 46 | -------------------------------------------------------------------------------- /src/tests/util/randomEmoji.test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | import randomEmoji from '../../util/randomEmoji.js' 7 | 8 | test('returns an emoji', () => { 9 | const emojis = ['🥳'] 10 | const emoji = randomEmoji([], emojis) 11 | expect(emoji).toBe('🥳') 12 | }) 13 | 14 | test('takes excludes into account', () => { 15 | const excludes = ['🥳', '🥸'] 16 | const emojis = ['🥳', '🥸', '🥰'] 17 | for (let i = 0; i < 100; i += 1) { 18 | const emoji = randomEmoji(excludes, emojis) 19 | expect(emoji).toBe('🥰') 20 | } 21 | }) 22 | 23 | test('returns an emoji if all are excluded', () => { 24 | const excludes = ['🥳', '🥸', '🥰'] 25 | const emojis = ['🥳', '🥸', '🥰'] 26 | const emoji = randomEmoji(excludes, emojis) 27 | expect(emojis).toContain(emoji) 28 | }) 29 | -------------------------------------------------------------------------------- /src/util/scrollToElement.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | /** 7 | * Scroll to page in page list 8 | * 9 | * @param {number} pageId ID of page to scroll 10 | */ 11 | export function scrollToPage(pageId) { 12 | const pageListItem = document.getElementById(`page-${pageId}`) 13 | scrollToElement(pageListItem) 14 | } 15 | 16 | /** 17 | * Scroll element into center if not visible 18 | * 19 | * @param {Element} element DOM element to scroll 20 | */ 21 | export default function scrollToElement(element) { 22 | if (!(element instanceof Element)) { 23 | console.error('Error: Not a DOM element', element) 24 | return 25 | } 26 | 27 | const elementRect = element.getBoundingClientRect() 28 | if (elementRect.bottom > window.innerHeight || elementRect.top < 0) { 29 | element.scrollIntoView({ 30 | behavior: 'auto', 31 | block: 'center', 32 | inline: 'nearest', 33 | }) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/util/sortOrders.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const byName = (a, b) => a.name.localeCompare(b.name, OC.getLanguage(), { numeric: true }) 7 | const byTitle = (a, b) => a.title.localeCompare(b.title, OC.getLanguage(), { numeric: true }) 8 | const byTimestamp = (a, b) => b.timestamp - a.timestamp 9 | 10 | const byOrder = (a, b) => { 11 | if (a.index >= 0 && b.index >= 0) { 12 | // both are in the sort order - sort lower index first 13 | return a.index - b.index 14 | } else { 15 | // not in sort order (index = -1) -> put at the end sorted by title 16 | return b.index - a.index || byTitle(a, b) 17 | } 18 | } 19 | 20 | const pageOrders = { 21 | byOrder: 0, 22 | byTimestamp: 1, 23 | byTitle: 2, 24 | } 25 | 26 | // Invert key and value of pageOrders 27 | const pageOrdersByNumber = Object.entries(pageOrders) 28 | .reduce((obj, [a, b]) => ({ ...obj, [b]: a }), {}) 29 | 30 | export { 31 | byName, 32 | byTitle, 33 | byTimestamp, 34 | byOrder, 35 | pageOrders, 36 | pageOrdersByNumber, 37 | } 38 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const stylelintConfig = require('@nextcloud/stylelint-config') 7 | 8 | module.exports = stylelintConfig 9 | -------------------------------------------------------------------------------- /templates/error.php: -------------------------------------------------------------------------------- 1 | 7 | 8 |
19 |
20 |

t('Error: Missing apps')); ?>

21 | t('The following dependency apps are missing: ')); ?> 22 |
23 |
24 |
    25 | ' . $app . ''); 30 | if ($i !== $len - 1) { 31 | print_unescaped(', '); 32 | } 33 | $i++; 34 | } 35 | ?> 36 |
37 |
38 |
39 | t('Please ask the administrator to enable these apps.')); ?> 40 |
41 |
42 | 43 | -------------------------------------------------------------------------------- /templates/main.php: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | 13 | -------------------------------------------------------------------------------- /tests/Integration/config/behat.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | default: 5 | autoload: 6 | '': '%paths.base%/../features/bootstrap' 7 | suites: 8 | default: 9 | paths: 10 | - '%paths.base%/../features' 11 | contexts: 12 | - FeatureContext: 13 | baseUrl: 'https://nextcloud.local/index.php' 14 | ocsUrl: 'https://nextcloud.local/ocs/v2.php' 15 | publicUrl: 'https://nextcloud.local/public.php' 16 | remoteUrl: 'https://nextcloud.local/remote.php' 17 | ci: 18 | suites: 19 | default: 20 | contexts: 21 | - FeatureContext: 22 | baseUrl: 'http://localhost:8080/index.php' 23 | ocsUrl: 'http://localhost:8080/ocs/v2.php' 24 | publicUrl: 'http://localhost:8080/public.php' 25 | remoteUrl: 'http://localhost:8080/remote.php' 26 | -------------------------------------------------------------------------------- /tests/Integration/features/fixtures/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/collectives/56d1f6f1db684d3afec3434d0ceee7165befc17f/tests/Integration/features/fixtures/test.png -------------------------------------------------------------------------------- /tests/Integration/features/settings.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | Feature: settings 5 | 6 | Scenario: Set collectives user folder 7 | When user "john" sets setting "user_folder" to value "/other" 8 | Then user "john" gets setting "user_folder" with value "/other" 9 | And user "john" fails to set setting "nonexistent" to value "something" 10 | -------------------------------------------------------------------------------- /tests/Integration/features/userSettings.feature: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | Feature: userSettings 5 | 6 | Scenario: Change userSetting "pageOrder" for a collective 7 | When user "jane" creates collective "BehatUserSettingsCollective" 8 | And user "jane" collective "BehatUserSettingsCollective" property "userPageOrder" is "0" 9 | And user "jane" collective "BehatUserSettingsCollective" property "userFavoritePages" is "[]" 10 | And user "jane" sets userSetting "pageOrder" for collective "BehatUserSettingsCollective" to "2" 11 | Then user "jane" collective "BehatUserSettingsCollective" property "userPageOrder" is "2" 12 | And user "jane" sets userSetting "favoritePages" for collective "BehatUserSettingsCollective" to "[1,2]" 13 | Then user "jane" collective "BehatUserSettingsCollective" property "userFavoritePages" is "[1,2]" 14 | 15 | Scenario: Trash and delete collective and team 16 | Then user "jane" trashes collective "BehatUserSettingsCollective" 17 | And user "jane" deletes collective+team "BehatUserSettingsCollective" 18 | -------------------------------------------------------------------------------- /tests/Unit/Db/CollectiveTest.php: -------------------------------------------------------------------------------- 1 | setPageMode(0); 21 | $this->assertEquals($collective->getPageMode(), 0); 22 | 23 | $collective->setPageMode(1); 24 | $this->assertEquals($collective->getPageMode(), 1); 25 | } 26 | 27 | public function invalidPageModeProvider(): array { 28 | return [ 29 | [-1], 30 | [2], 31 | [10000] 32 | ]; 33 | } 34 | 35 | /** 36 | * @dataProvider invalidPageModeProvider 37 | */ 38 | public function testSetPageModeException(int $mode): void { 39 | $this->expectException(RuntimeException::class); 40 | $collective = new Collective(); 41 | $collective->setPageMode($mode); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ./lib 6 | 7 | 8 | 9 | 10 | ./Unit 11 | ./Search/SearchablePageReferenceProviderTest.php 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/psalm-baseline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | pushQueue]]> 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /vendor-bin/behat/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "platform": { 4 | "php": "8.0.2" 5 | }, 6 | "sort-packages": true 7 | }, 8 | "require-dev": { 9 | "behat/behat": "^3.14", 10 | "phpunit/phpunit": "^9.6" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /vendor-bin/cs-fixer/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "platform": { 4 | "php": "8.0.2" 5 | }, 6 | "sort-packages": true 7 | }, 8 | "require-dev": { 9 | "nextcloud/coding-standard": "^1.3.1" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /vendor-bin/phpunit/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "platform": { 4 | "php": "8.0.2" 5 | }, 6 | "sort-packages": true 7 | }, 8 | "require-dev": { 9 | "phpunit/phpunit": "^9.6" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /vendor-bin/psalm/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "platform": { 4 | "php": "8.0.2" 5 | }, 6 | "sort-packages": true 7 | }, 8 | "require-dev": { 9 | "nextcloud/ocp": "dev-stable29", 10 | "vimeo/psalm": "^5.26" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /webpack.js: -------------------------------------------------------------------------------- 1 | /** 2 | * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 3 | * SPDX-License-Identifier: AGPL-3.0-or-later 4 | */ 5 | 6 | const path = require('path') 7 | const webpackConfig = require('@nextcloud/webpack-vue-config') 8 | const webpack = require('webpack') 9 | 10 | const isDevServer = process.env.WEBPACK_SERVE 11 | if (isDevServer) { 12 | webpackConfig.output.publicPath = 'http://127.0.0.1:3000/' 13 | webpackConfig.plugins.push( 14 | new webpack.DefinePlugin({ 15 | 'process.env.WEBPACK_SERVE': true, 16 | }) 17 | ) 18 | } 19 | 20 | webpackConfig.entry['files'] = path.join(__dirname, 'src', 'files.js') 21 | webpackConfig.entry['init'] = path.join(__dirname, 'src', 'init.js') 22 | webpackConfig.entry['reference'] = path.join(__dirname, 'src', 'reference.js') 23 | 24 | module.exports = webpackConfig 25 | --------------------------------------------------------------------------------