mirror of
https://github.com/cryptpad/cryptpad.git
synced 2026-09-12 19:49:59 +05:00
Merge branch 'staging' into worker-loading
This commit is contained in:
commit
980afeff3c
163
.reuse/dep5
163
.reuse/dep5
@ -1,163 +0,0 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: CryptPad
|
||||
Upstream-Contact: XWiki <contact@cryptpad.org>
|
||||
Source: https://cryptpad.org
|
||||
|
||||
# Sample paragraph, commented out:
|
||||
#
|
||||
# Files: src/*
|
||||
# Copyright: $YEAR $NAME <$CONTACT>
|
||||
# License: ...
|
||||
|
||||
Files: *.png
|
||||
Copyright: 2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: *.json
|
||||
Copyright: 2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: .jshintignore
|
||||
Copyright: 2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: .jshintrc
|
||||
Copyright: 2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: .stylelintrc.js
|
||||
Copyright: 2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: scripts/tests/test-data/*
|
||||
Copyright: 2024 XWiki CryptPad Team <contact@cryptpad.org> and contributors
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
## Dependencies
|
||||
|
||||
Files: www/common/theme/*
|
||||
Copyright: 2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/mermaid/*
|
||||
Copyright: (c) 2014 - 2021 Knut Sveidqvist
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/calendar/moment.min.js
|
||||
Copyright: (c) JS Foundation and other contributors
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/pdfjs/*
|
||||
Copyright: 2017 Mozilla Foundation
|
||||
License: Apache-2.0
|
||||
|
||||
Files: www/lib/codemirror-extra-modes/asciidoc/*
|
||||
Copyright: (c) 2015, the Asciidoctor Project
|
||||
License: BSD-3-Clause
|
||||
|
||||
Files: www/lib/datepicker/*
|
||||
Copyright: 2017 Gregory Petrosyan
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/diff-dom/*
|
||||
Copyright: Johannes Wilm, Fidus Writer
|
||||
License: LGPL-3.0-only
|
||||
|
||||
Files: www/lib/fabric-history.min.js
|
||||
Copyright: 2008-2015 Printio (Juriy Zaytsev, Maxim Chernyak)
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/fabric.min.js
|
||||
Copyright: 2008-2015 Printio (Juriy Zaytsev, Maxim Chernyak)
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/pdfjs/*
|
||||
Copyright: 2012 Mozilla Foundation
|
||||
License: Apache-2.0
|
||||
|
||||
Files: www/lib/qrcode.min.js
|
||||
Copyright: Sangmin Shim
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/rangy/rangy-core.min.js
|
||||
Copyright: 2015, Tim Down
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/textFit.min.js
|
||||
Copyright: 11/2014 by STRML (strml.github.com)
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/tippy/*
|
||||
Copyright: 2017 atomiks
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/turndown.browser.umd.js
|
||||
Copyright: 2017 Dom Christie
|
||||
License: MIT
|
||||
|
||||
Files: www/lib/markmap/*
|
||||
Copyright: 2015 Jakub Dundalek
|
||||
License: MIT
|
||||
|
||||
Files: www/pad/mathjax/*
|
||||
Copyright: 2009-2018 The MathJax Consortium
|
||||
License: Apache-2.0
|
||||
|
||||
Files: www/pad/wordcount/*
|
||||
Copyright: Ingo Herbote
|
||||
License: MIT
|
||||
|
||||
### same as CKEditor
|
||||
Files: www/pad/wysiwygarea-plugin.js
|
||||
Copyright: 2003-2017, CKSource - Frederico Knabben. All rights reserved
|
||||
License: GPL-2.0-or-later
|
||||
|
||||
Files: www/pad/icons/*
|
||||
Copyright: unknown
|
||||
License: GPL-2.0-or-later
|
||||
|
||||
## OnlyOffice
|
||||
|
||||
Files: www/common/onlyoffice/AllFonts.js
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/fonts_thumbnail.png
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/fonts_thumbnail@2x.png
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/plugins.json
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/v1/*
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/v2b/*
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/v4/*
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/v5/*
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/v6/*
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/v7/*
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
|
||||
Files: www/common/onlyoffice/x2t/*
|
||||
Copyright: Ascensio System Limited 2010-2022
|
||||
License: AGPL-3.0-or-later
|
||||
226
REUSE.toml
Normal file
226
REUSE.toml
Normal file
@ -0,0 +1,226 @@
|
||||
version = 1
|
||||
SPDX-PackageName = "CryptPad"
|
||||
SPDX-PackageSupplier = "XWiki <contact@cryptpad.org>"
|
||||
SPDX-PackageDownloadLocation = "https://cryptpad.org"
|
||||
|
||||
[[annotations]]
|
||||
path = "**.png"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "**.json"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = ".jshintignore"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = ".jshintrc"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = ".stylelintrc.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "scripts/tests/test-data/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2024 XWiki CryptPad Team <contact@cryptpad.org> and contributors"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/theme/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/mermaid/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "(c) 2014 - 2021 Knut Sveidqvist"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/calendar/moment.min.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "(c) JS Foundation and other contributors"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/pdfjs/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2017 Mozilla Foundation"
|
||||
SPDX-License-Identifier = "Apache-2.0"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/codemirror-extra-modes/asciidoc/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "(c) 2015, the Asciidoctor Project"
|
||||
SPDX-License-Identifier = "BSD-3-Clause"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/datepicker/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2017 Gregory Petrosyan"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/diff-dom/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Johannes Wilm, Fidus Writer"
|
||||
SPDX-License-Identifier = "LGPL-3.0-only"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/fabric-history.min.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2008-2015 Printio (Juriy Zaytsev, Maxim Chernyak)"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/fabric.min.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2008-2015 Printio (Juriy Zaytsev, Maxim Chernyak)"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/pdfjs/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2012 Mozilla Foundation"
|
||||
SPDX-License-Identifier = "Apache-2.0"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/qrcode.min.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Sangmin Shim"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/rangy/rangy-core.min.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2015, Tim Down"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/textFit.min.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "11/2014 by STRML (strml.github.com)"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/tippy/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2017 atomiks"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/turndown.browser.umd.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2017 Dom Christie"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/lib/markmap/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2015 Jakub Dundalek"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/pad/mathjax/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2009-2018 The MathJax Consortium"
|
||||
SPDX-License-Identifier = "Apache-2.0"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/pad/wordcount/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ingo Herbote"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/pad/wysiwygarea-plugin.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2003-2017, CKSource - Frederico Knabben. All rights reserved"
|
||||
SPDX-License-Identifier = "GPL-2.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/pad/icons/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "unknown"
|
||||
SPDX-License-Identifier = "GPL-2.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/AllFonts.js"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/fonts_thumbnail.png"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/fonts_thumbnail@2x.png"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/plugins.json"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/v1/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/v2b/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/v4/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/v5/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/v6/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/v7/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "www/common/onlyoffice/x2t/**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Ascensio System Limited 2010-2022"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
@ -134,35 +134,7 @@ define(req, function(AppConfig, Default, Language) {
|
||||
}
|
||||
};
|
||||
|
||||
Messages.addItemBottom = 'Add item to bottom of the board'; // XXX or 'Add card..'
|
||||
Messages.addItemTop = 'Add item to top of the board'; // XXX or 'Add card..'
|
||||
|
||||
Messages.admin_logoSize_error = "The logo size is too large"; // XXX
|
||||
Messages.limit_error = "Please enter a valid number"; // XXX
|
||||
Messages.positiveNumber_error = "Please enter a positive number"; // XXX
|
||||
Messages.answerType_error = "Please select how to answer the form"; // XXX
|
||||
|
||||
// XXX
|
||||
Messages.admin_cat_admins = "Administrators";
|
||||
Messages.admin_admin = "Admin";
|
||||
Messages.admin_listAdminsTitle = "Current administrators";
|
||||
Messages.admin_listAdminsHint = "View and remove administrators";
|
||||
Messages.admin_addAdminsTitle = "Add administrators";
|
||||
Messages.admin_addAdminsHint = "Add administrators from their public key or from your contacts list";
|
||||
Messages.admin_addAdminsAdd = "Promote a contact to admin";
|
||||
Messages.admin_addKeyLabel = "Add an admin using their public key";
|
||||
Messages.admin_errorAddKeyLabel = "Add a valid public key";
|
||||
Messages.admin_errorAddAdmins = "Pick a contact to promote to admin";
|
||||
|
||||
Messages.admin_listName = "Admin name";
|
||||
Messages.admin_listKey = "Admin key";
|
||||
Messages.admin_listAction = "Remove admin rights";
|
||||
|
||||
Messages.admin_listHardcoded = "Admin added into config.js. Can only be removed by editing the config file.";
|
||||
Messages.admin_listConfirm = "Are you sure you want to remove the admin rights of this user?";
|
||||
|
||||
Messages.fm_link_invalid = "Please provide a valid URL"; // XXX
|
||||
Messages.skipLink = "Skip to main content"; // XXX
|
||||
|
||||
|
||||
return Messages;
|
||||
|
||||
|
||||
@ -162,10 +162,11 @@
|
||||
// Buttons
|
||||
@cp_buttons-fg: @cryptpad_color_brand_300;
|
||||
@cp_buttons-hover: @cryptpad_color_brand_fadest;
|
||||
@cp_buttons-default: @cryptpad_color_grey_700;
|
||||
@cp_buttons-default-color: @cryptpad_text_col;
|
||||
@cp_buttons-default-alt-color: @cryptpad_color_grey_700;
|
||||
@cp_buttons-default-border: @cryptpad_text_col;
|
||||
@cp_buttons-default-bg: @cryptpad_text_col;
|
||||
@cp_buttons-default-fg: @cryptpad_color_grey_900;
|
||||
@cp_buttons-default-alt-bg: @cryptpad_color_grey_900;
|
||||
@cp_buttons-default-alt-fg: @cryptpad_text_col;
|
||||
@cp_buttons-red: #E55236;
|
||||
@cp_buttons-red-text: @cryptpad_color_light_red;
|
||||
@cp_buttons-red-color: #FFF;
|
||||
|
||||
@ -161,10 +161,11 @@
|
||||
// Buttons
|
||||
@cp_buttons-fg: @cryptpad_color_brand;
|
||||
@cp_buttons-hover: @cryptpad_color_brand_fadest;
|
||||
@cp_buttons-default: #CCC;
|
||||
@cp_buttons-default-color: @cryptpad_text_col;
|
||||
@cp_buttons-default-border: @cryptpad_text_col;
|
||||
@cp_buttons-default-alt-color: @cryptpad_color_grey_50;
|
||||
@cp_buttons-default-bg: @cryptpad_color_grey_200;
|
||||
@cp_buttons-default-fg: @cryptpad_text_col;
|
||||
@cp_buttons-default-alt-bg: @cryptpad_color_white;
|
||||
@cp_buttons-default-alt-fg: @cryptpad_text_col;
|
||||
@cp_buttons-red: #E55236;
|
||||
@cp_buttons-red-text: @cp_buttons-red;
|
||||
@cp_buttons-red-color: #FFF;
|
||||
|
||||
@ -191,22 +191,21 @@
|
||||
}
|
||||
|
||||
&.btn-default {
|
||||
border-color: @cp_buttons-default-border;
|
||||
color: @cp_buttons-default-color;
|
||||
background-color: @cp_buttons-default-bg;
|
||||
color: @cp_buttons-default-fg;
|
||||
border-color: @cp_buttons-default-bg;
|
||||
&:hover, &:not(:disabled):active, &:focus {
|
||||
border-color: @cp_buttons-default-border;
|
||||
color: @cp_buttons-default-color;
|
||||
background-color: @cp_buttons-default;
|
||||
background-color: fade(@cryptpad_text_col, 20%);
|
||||
border-color: @cryptpad_text_col;
|
||||
color: @cryptpad_text_col;
|
||||
}
|
||||
}
|
||||
&.btn-default-alt {
|
||||
border-color: @cp_buttons-default-alt-color;
|
||||
color: @cp_buttons-default-alt-color;
|
||||
background-color: @cp_buttons-default-color;
|
||||
border-color: @cp_buttons-default-alt-fg;
|
||||
color: @cp_buttons-default-alt-fg;
|
||||
background-color: @cp_buttons-default-alt-bg;
|
||||
&:hover, &:not(:disabled):active, &:focus {
|
||||
border-color: @cp_buttons-default-color;
|
||||
color: @cp_buttons-default-color;
|
||||
background-color: @cp_toolbar-fade3;
|
||||
background-color: fade(@cryptpad_text_col, 20%);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -89,16 +89,6 @@ server {
|
||||
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
|
||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
|
||||
|
||||
# OCSP stapling
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
# verify chain of trust of OCSP response using Root CA and Intermediate certs
|
||||
ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
|
||||
|
||||
# replace with the IP address of your resolver
|
||||
resolver 8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 9.9.9.9 149.112.112.112 208.67.222.222 208.67.220.220;
|
||||
|
||||
# OnlyOffice fonts may be loaded from both domains
|
||||
if ($uri ~ ^/common/onlyoffice/.*/fonts/) { set $allowed_origins "*"; }
|
||||
|
||||
|
||||
@ -65,16 +65,6 @@ server {
|
||||
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
|
||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
|
||||
|
||||
# OCSP stapling
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
# verify chain of trust of OCSP response using Root CA and Intermediate certs
|
||||
ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
|
||||
|
||||
# replace with the IP address of your resolver
|
||||
resolver 8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 9.9.9.9 149.112.112.112 208.67.222.222 208.67.220.220;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:3000;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
|
||||
@ -145,7 +145,7 @@ var cacheHeaders = function (Env, key, headers) {
|
||||
|
||||
var getHeaders = function (Env, type) {
|
||||
var key = type + 'HeadersCache';
|
||||
if (Env[key]) { return Env[key]; }
|
||||
if (Env[key]) { return Util.clone(Env[key]); }
|
||||
|
||||
var headers = Default.httpHeaders(Env);
|
||||
|
||||
@ -165,7 +165,7 @@ var getHeaders = function (Env, type) {
|
||||
// when duplicated by NGINX in production environments
|
||||
if (type === 'api') { delete headers['Content-Security-Policy']; }
|
||||
|
||||
return headers;
|
||||
return Util.clone(headers);
|
||||
};
|
||||
|
||||
var setHeaders = function (req, res) {
|
||||
|
||||
@ -1236,7 +1236,7 @@ const factory = (ApiConfig = {}, Sortify, UserObject, ProxyManager,
|
||||
}
|
||||
|
||||
// Check if the pad is already stored in the specified drive (data.teamId)
|
||||
if ((!s.id && !data.teamId) || Number(s.id) === data.teamId) {
|
||||
if ((!s.id && (!data.teamId || data.teamId === -1)) || Number(s.id) === data.teamId) {
|
||||
if (!inTargetDrive) {
|
||||
inTargetDrive = res.length;
|
||||
}
|
||||
|
||||
@ -1839,7 +1839,7 @@ define([
|
||||
validate: function () {
|
||||
var l = parseInt($(newLimit).val());
|
||||
if (isNaN(l)) {
|
||||
return UI.warn(Messages.limit_error);
|
||||
return UI.warn(Messages.error_limit);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -3916,14 +3916,14 @@ define([
|
||||
validate: function () {
|
||||
var l = parseInt($(newDuration).val());
|
||||
if (isNaN(l)) {
|
||||
return void UI.warn(Messages.limit_error);
|
||||
return void UI.warn(Messages.error_limit);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}, function () {
|
||||
var d = parseInt($(newDuration).val());
|
||||
if (!isPositiveInteger(d)) {
|
||||
return void UI.warn(Messages.positiveNumber_error);
|
||||
return void UI.warn(Messages.error_positiveNumber);
|
||||
}
|
||||
|
||||
var data = [d];
|
||||
|
||||
@ -137,7 +137,6 @@
|
||||
@media (max-width: @browser_media-medium-screen) {
|
||||
#cp-app-code-editor {
|
||||
&.cp-app-code-present {
|
||||
#cp-app-code-container { display: none !important; }
|
||||
#cp-app-code-preview {
|
||||
flex: 1;
|
||||
max-width: 100%;
|
||||
@ -156,9 +155,6 @@
|
||||
padding-bottom: 100px;
|
||||
}
|
||||
}
|
||||
#cp-app-code-preview {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -177,6 +177,8 @@ define([
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
var isSmallScreen = () => window.innerWidth <= 600;
|
||||
var mkPreviewPane = function (editor, CodeMirror, framework, isPresentMode) {
|
||||
var $previewContainer = $('#cp-app-code-preview');
|
||||
var $preview = $('#cp-app-code-preview-content');
|
||||
@ -210,30 +212,88 @@ define([
|
||||
}, 400);
|
||||
|
||||
var previewTo;
|
||||
|
||||
var togglePreview = function (show) {
|
||||
if (show && previews[CodeMirror.highlightMode]) {
|
||||
$previewContainer.show();
|
||||
$codeMirrorContainer.hide();
|
||||
$previewButton.addClass('cp-toolbar-button-active');
|
||||
drawPreview();
|
||||
} else {
|
||||
$previewContainer.hide();
|
||||
$codeMirrorContainer.show();
|
||||
$previewButton.removeClass('cp-toolbar-button-active');
|
||||
}
|
||||
framework._.sfCommon.setPadAttribute('previewMode', show);
|
||||
};
|
||||
|
||||
var isVisible = function () {
|
||||
return $previewContainer.is(':visible');
|
||||
};
|
||||
|
||||
var handleResize = function () {
|
||||
var wasPreviewVisible = isVisible(); // Capture preview state before resize
|
||||
|
||||
// Present mode: always draw preview
|
||||
if (isPresentMode && previews[CodeMirror.highlightMode]) {
|
||||
$previewContainer.show();
|
||||
$codeMirrorContainer.hide();
|
||||
$previewButton.hide();
|
||||
return drawPreview();
|
||||
}
|
||||
// Small screen: toggle between editor and preview
|
||||
if (isSmallScreen()) {
|
||||
return togglePreview(wasPreviewVisible);
|
||||
}
|
||||
// Normal screen: split view to editor only
|
||||
if (wasPreviewVisible) {
|
||||
$previewContainer.show();
|
||||
$codeMirrorContainer.show();
|
||||
$codeMirrorContainer.removeClass('cp-app-code-fullpage');
|
||||
$previewButton.addClass('cp-toolbar-button-active');
|
||||
return drawPreview();
|
||||
}
|
||||
// Normal screen: editor only to split view
|
||||
$previewContainer.hide();
|
||||
$codeMirrorContainer.addClass('cp-app-code-fullpage');
|
||||
$previewButton.removeClass('cp-toolbar-button-active');
|
||||
};
|
||||
|
||||
|
||||
$previewButton.click(function () {
|
||||
clearTimeout(previewTo);
|
||||
$codeMirror.addClass('transition');
|
||||
previewTo = setTimeout(function () {
|
||||
$codeMirror.removeClass('transition');
|
||||
}, 500);
|
||||
|
||||
var show = !isVisible();
|
||||
|
||||
// Small screen: toggle between editor and preview
|
||||
if (isSmallScreen()) {
|
||||
return togglePreview(show);
|
||||
}
|
||||
|
||||
if (!previews[CodeMirror.highlightMode]) {
|
||||
$previewContainer.show();
|
||||
}
|
||||
$previewContainer.toggle();
|
||||
if ($previewContainer.is(':visible')) {
|
||||
forceDrawPreview();
|
||||
//Normal screen: split view to editor only
|
||||
if (isVisible()) {
|
||||
$codeMirrorContainer.removeClass('cp-app-code-fullpage');
|
||||
$previewButton.addClass('cp-toolbar-button-active');
|
||||
framework._.sfCommon.setPadAttribute('previewMode', true, function (e) {
|
||||
if (e) { return console.log(e); }
|
||||
});
|
||||
} else {
|
||||
$codeMirrorContainer.addClass('cp-app-code-fullpage');
|
||||
$previewButton.removeClass('cp-toolbar-button-active');
|
||||
framework._.sfCommon.setPadAttribute('previewMode', false, function (e) {
|
||||
if (e) { return console.log(e); }
|
||||
});
|
||||
return forceDrawPreview();
|
||||
}
|
||||
|
||||
// Normal screen: editor only to split view
|
||||
$codeMirrorContainer.addClass('cp-app-code-fullpage');
|
||||
$previewButton.removeClass('cp-toolbar-button-active');
|
||||
framework._.sfCommon.setPadAttribute('previewMode', false, function (e) {
|
||||
if (e) { return console.log(e); }
|
||||
});
|
||||
});
|
||||
|
||||
framework._.toolbar.$bottomM.append($previewButton);
|
||||
@ -260,9 +320,12 @@ define([
|
||||
var modeChange = function (mode) {
|
||||
if (previews[mode]) {
|
||||
$previewButton.show();
|
||||
if(isSmallScreen()) {
|
||||
return togglePreview(false);
|
||||
}
|
||||
framework._.sfCommon.getPadAttribute('previewMode', function (e, data) {
|
||||
if (e) { return void console.error(e); }
|
||||
if (data !== false) {
|
||||
if (data !== false && data !== undefined) {
|
||||
$previewContainer.show();
|
||||
$previewButton.addClass('cp-toolbar-button-active');
|
||||
$codeMirrorContainer.removeClass('cp-app-code-fullpage');
|
||||
@ -278,14 +341,15 @@ define([
|
||||
$previewButton.hide();
|
||||
$previewContainer.hide();
|
||||
$previewButton.removeClass('active');
|
||||
$codeMirrorContainer.show();
|
||||
$codeMirrorContainer.addClass('cp-app-code-fullpage');
|
||||
};
|
||||
|
||||
var isVisible = function () {
|
||||
return $previewContainer.is(':visible');
|
||||
};
|
||||
|
||||
framework.onReady(function () {
|
||||
handleResize();
|
||||
window.addEventListener('resize', handleResize);
|
||||
|
||||
// add the splitter
|
||||
var splitter = $('<div>', {
|
||||
'class': 'cp-splitter'
|
||||
|
||||
@ -597,10 +597,11 @@ define([
|
||||
let btnClass = $button.attr('class');
|
||||
let btnId = $button.attr('id');
|
||||
let btnTitle = $button.attr('title');
|
||||
let btnVisibility = $button.attr('style');
|
||||
if (btnClass) { attributes['class'] = btnClass; }
|
||||
if (btnId) { attributes['id'] = btnId; }
|
||||
if (btnTitle && !attributes.title) { attributes['title'] = btnTitle; }
|
||||
|
||||
if (btnVisibility) { attributes['style'] = btnVisibility; }
|
||||
return UIElements.createDropdownEntry({
|
||||
tag: 'a',
|
||||
attributes: attributes,
|
||||
@ -871,7 +872,7 @@ define([
|
||||
h('i.fa.fa-hdd-o'),
|
||||
h('span.cp-toolbar-name.cp-toolbar-drawer-element', Messages.toolbar_storeInDrive)
|
||||
])).click(common.prepareFeedback(type)).click(function () {
|
||||
$(button).hide();
|
||||
$('.cp-toolbar-storeindrive').hide();
|
||||
common.getSframeChannel().query("Q_AUTOSTORE_STORE", {
|
||||
forceOwnDrive: true,
|
||||
}, function (err, obj) {
|
||||
@ -904,6 +905,7 @@ define([
|
||||
case 'toggle':
|
||||
button = $(h('button.cp-toolbar-tools', {
|
||||
//title: data.title || '', // TODO display if the label text is collapsed
|
||||
'aria-label': data.text || Messages.toolbar_tools // Fallback
|
||||
}, [
|
||||
h('i.fa.' + (data.icon || 'fa-wrench')),
|
||||
h('span.cp-toolbar-name', data.text || Messages.toolbar_tools)
|
||||
|
||||
@ -4025,9 +4025,10 @@ define([
|
||||
var header7, header28, headerOld;
|
||||
var i = 0;
|
||||
var channels = [];
|
||||
var toShow = [];
|
||||
|
||||
if (typeFilter) {
|
||||
var ids = filesList.map(function (arr) { return arr[0]; });
|
||||
let ids = filesList.map(function (arr) { return arr[0]; });
|
||||
var idsFilter = filterPads(ids, typeFilter, false, true);
|
||||
filesList = filesList.filter(function (arr) {
|
||||
return (idsFilter.indexOf(arr[0]) !== -1);
|
||||
@ -4046,15 +4047,18 @@ define([
|
||||
return true;
|
||||
}
|
||||
|
||||
var paths = manager.findFile(id);
|
||||
if (!paths.length) { return; }
|
||||
var path = paths[0];
|
||||
if (manager.isPathIn(path, [TRASH])) { return; }
|
||||
|
||||
if (!file.channel) { file.channel = id; }
|
||||
if (channels.indexOf(file.channel) !== -1) { return; }
|
||||
channels.push(file.channel);
|
||||
toShow.push({id, file});
|
||||
i++;
|
||||
});
|
||||
|
||||
let ids = toShow.map(obj => { return obj.id });
|
||||
var allPaths = manager.findFiles(ids);
|
||||
toShow.forEach(obj => {
|
||||
let file = obj.file;
|
||||
let id = obj.id;
|
||||
if (!header7 && file.atime < last1) {
|
||||
$list.append(h('li.cp-app-drive-element-separator', h('span', Messages.drive_active7Days)));
|
||||
header7 = true;
|
||||
@ -4078,6 +4082,12 @@ define([
|
||||
var $element = $('<li>', {
|
||||
'class': 'cp-app-drive-element cp-app-drive-element-notrash cp-app-drive-element-file cp-app-drive-element-row' + roClass,
|
||||
});*/
|
||||
var paths = allPaths[id];
|
||||
if (paths.every(path => {
|
||||
return manager.isPathIn(path, [TRASH])
|
||||
})) { return; }
|
||||
var path = paths[0];
|
||||
|
||||
var parentPath = path.slice();
|
||||
var key = parentPath.pop();
|
||||
var root = manager.find(parentPath);
|
||||
@ -4085,7 +4095,6 @@ define([
|
||||
$element.off('contextmenu').contextmenu(openContextMenu('default'));
|
||||
$element.data('context', 'default');
|
||||
$list.append($element);
|
||||
i++;
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@ -233,11 +233,25 @@ const factory = (UserObject, Util, Hash,
|
||||
var findFile = function (Env, id) {
|
||||
var ret = [];
|
||||
var userObjects = _getUserObjects(Env);
|
||||
let mainRes = {};
|
||||
userObjects.forEach(function (uo) {
|
||||
var fPath = _getUserObjectPath(Env, uo);
|
||||
var results = uo.findFile(id);
|
||||
if (fPath) {
|
||||
var fId = Number(uo.id);
|
||||
let results;
|
||||
if (!fId) {
|
||||
// Main drive: get the paths of all the SF
|
||||
// in addition to the paths of the requested file
|
||||
let ids = [id];
|
||||
let fIds = userObjects.map(uo => {
|
||||
return +uo.id;
|
||||
}).filter(Boolean);
|
||||
Array.prototype.push.apply(ids, fIds);
|
||||
mainRes = uo.findFiles(ids); // Store paths of each SF
|
||||
results = mainRes[id]; // Paths of requested file
|
||||
} else {
|
||||
results = uo.findFile(id);
|
||||
// This is a shared folder, we have to fix the paths in the results
|
||||
let fPath = (mainRes[fId] || [])[0];
|
||||
if (!fPath) { return; } // Can't search into this sf
|
||||
results.forEach(function (p) {
|
||||
Array.prototype.unshift.apply(p, fPath);
|
||||
});
|
||||
@ -247,6 +261,41 @@ const factory = (UserObject, Util, Hash,
|
||||
});
|
||||
return ret;
|
||||
};
|
||||
var findFiles = function (Env, ids) {
|
||||
var ret = {};
|
||||
var userObjects = _getUserObjects(Env);
|
||||
let mainRes = {};
|
||||
userObjects.forEach(function (uo) {
|
||||
//var fPath = _getUserObjectPath(Env, uo);
|
||||
var fId = Number(uo.id);
|
||||
if (!uo.id) {
|
||||
let fIds = userObjects.map(uo => {
|
||||
return +uo.id;
|
||||
}).filter(Boolean);
|
||||
Array.prototype.push.apply(ids, fIds);
|
||||
}
|
||||
var results = uo.findFiles(ids);
|
||||
if (!uo.id) { mainRes = results; }
|
||||
//console.error(results);
|
||||
if (fId) {
|
||||
// This is a shared folder, we have to fix the paths in the results
|
||||
let fPath = (mainRes[fId] || [])[0];
|
||||
if (!fPath) { return; } // Can't search into this sf
|
||||
Object.keys(results).forEach(file => {
|
||||
results[file].forEach(p => {
|
||||
Array.prototype.unshift.apply(p, fPath);
|
||||
});
|
||||
});
|
||||
}
|
||||
// Push the results from this proxy
|
||||
Object.keys(results).forEach(file => {
|
||||
ret[file] ||= [];
|
||||
Array.prototype.push.apply(ret[file], results[file]);
|
||||
});
|
||||
});
|
||||
return ret;
|
||||
};
|
||||
|
||||
|
||||
// Returns file IDs corresponding to the provided channels
|
||||
var _findChannels = function (Env, channels, onlyMain) {
|
||||
@ -1752,6 +1801,7 @@ const factory = (UserObject, Util, Hash,
|
||||
getOwnedPads: callWithEnv(getOwnedPads),
|
||||
getTagsList: callWithEnv(getTagsList),
|
||||
findFile: callWithEnv(findFile),
|
||||
findFiles: callWithEnv(findFiles),
|
||||
findChannels: callWithEnv(findChannels),
|
||||
getSharedFolderData: callWithEnv(getSharedFolderData),
|
||||
getFolderData: callWithEnv(getFolderData),
|
||||
|
||||
@ -599,5 +599,77 @@
|
||||
"sharedFolders_create": "Създаване на споделена папка",
|
||||
"sharedFolders_create_name": "Име на папка",
|
||||
"sharedFolders_create_owned": "Собствена папка",
|
||||
"convertFolderToSF_SFParent": "Тази папка не може да бъде преобразувана в споделена папка в текущото си местоположение. Преместете го извън споделената папка, за да продължите."
|
||||
"convertFolderToSF_SFParent": "Тази папка не може да бъде преобразувана в споделена папка в текущото си местоположение. Преместете го извън споделената папка, за да продължите.",
|
||||
"convertFolderToSF_confirm": "Тази папка трябва да бъде преобразувана в споделена папка, за да могат другите да я видят. Продължавате ли?",
|
||||
"chrome68": "Изглежда, че използвате браузъра Chrome или Chromium версия 68. Той съдържа грешка, която води до това, че страницата става напълно бяла след няколко секунди или страницата не реагира на кликвания. За да коригирате този проблем, можете да превключите на друг раздел и да се върнете след това или да превъртите в страницата. Тази грешка трябва да бъде коригирана в следващата версия на вашия браузър.",
|
||||
"autostore_file": "файл",
|
||||
"autostore_sf": "папка",
|
||||
"autostore_pad": "Оформяне на текст",
|
||||
"autostore_notstored": "Този {0} не е във вашия CryptDrive. Искате ли да го съхраните сега?",
|
||||
"autostore_settings": "Можете да активирате автоматичното съхранение на документите във вашата страница <a>Настройки</a>.",
|
||||
"autostore_store": "Хранилище",
|
||||
"autostore_hide": "Не съхранявайте",
|
||||
"autostore_error": "Неочаквана грешка: не можахме да съхраним този документ, опитайте отново.",
|
||||
"autostore_saved": "Документът беше успешно съхранен във вашия CryptDrive!",
|
||||
"autostore_forceSave": "Съхранявайте файла във вашия CryptDrive",
|
||||
"autostore_notAvailable": "Трябва да съхраните този документ във вашия CryptDrive, преди да можете да използвате тази функция.",
|
||||
"crowdfunding_button": "Поддръжка на CryptPad",
|
||||
"crowdfunding_button2": "Даряване",
|
||||
"crowdfunding_popup_text": "<h3>Имаме нужда от вашата помощ!</h3>За да сме сигурни, че CryptPad се разработва активно, помислете за подкрепа на проекта чрез страницата OpenCollective, където можете да видите нашата <b>Пътна карта</b> и <b>Цели за финансиране</ b>.",
|
||||
"crowdfunding_popup_no": "Не сега",
|
||||
"survey": "Проучване на CryptPad",
|
||||
"markdown_toc": "Съдържание",
|
||||
"fm_expirablePad": "Изтича: {0}",
|
||||
"admin_authError": "Само администраторите имат достъп до тази страница",
|
||||
"admin_cat_general": "Главен",
|
||||
"admin_cat_stats": "Статистика",
|
||||
"adminPage": "Администрация",
|
||||
"admin_activeSessionsTitle": "Активни връзки",
|
||||
"admin_activePadsTitle": "Активни документи",
|
||||
"admin_activePadsHint": "Брой уникални документи, които в момента се разглеждат или редактират",
|
||||
"admin_registeredTitle": "Потребителски и екипни дискове",
|
||||
"admin_registeredHint": "Брой активни дискове на вашето копие",
|
||||
"admin_updateLimitButton": "Обновяване на квоти",
|
||||
"admin_updateLimitDone": "Обновяването завърши успешно",
|
||||
"admin_flushCacheTitle": "Изчистване на HTTP кеша",
|
||||
"admin_flushCacheButton": "Изчистване на кеша",
|
||||
"admin_flushCacheDone": "Кешът е изчистен успешно",
|
||||
"footer_donate": "Даряване",
|
||||
"contact_admin": "Свържете се с администраторите за: {0}",
|
||||
"contact_dev": "Свързване с разработчиците",
|
||||
"contact_devHint": "За заявяване на функции, подобрения на използваемостта или за да кажете благодаря.",
|
||||
"contact_bug": "Докладване за грешка",
|
||||
"contact_chat": "Чат",
|
||||
"contact_email": "Имейл",
|
||||
"admin_flushCacheHint": "Принуждава всички потребители да изтеглят най-новите активи след промяна в персонализирането или конфигурацията им. Избягва рестартирането на сървъра, но кара всеки активен потребител да нулира връзката си, моля, използвайте пестеливо.",
|
||||
"contact_adminHint": "За всякакви проблеми, свързани с акаунта ви, ограничение за съхранение или наличност на услугата.\n",
|
||||
"admin_activeSessionsHint": "Брой активни уебсокет връзки (и свързани уникални IP адреси)",
|
||||
"admin_updateLimitTitle": "Обновяване на потребителските квоти",
|
||||
"admin_updateLimitHint": "Принудителното обновяване на лимитите за потребителското хранилище може да се извърши по всяко време, но е необходимо само в случай на грешка",
|
||||
"timeoutError": "Грешка прекъсна връзката ви със сървъра. <br>Натиснете Esc, за да презаредите страницата.",
|
||||
"admin_diskUsageTitle": "Използване на диска",
|
||||
"admin_diskUsageHint": "Размер на изразходеното пространство за съхранение, чрез различни ресурси на CryptPad",
|
||||
"admin_diskUsageButton": "Генериране на отчет",
|
||||
"settings_codeSpellcheckTitle": "Проверка на правописа",
|
||||
"settings_codeSpellcheckLabel": "Активиране на проверката на правописа в редактора на кода",
|
||||
"drive_active1Day": "Последните 24 часа",
|
||||
"drive_active7Days": "Последните 7 дни",
|
||||
"drive_active28Days": "Последните 4 седмици",
|
||||
"drive_activeOld": "По-малко нови документи",
|
||||
"friendRequest_later": "Решете по-късно",
|
||||
"friendRequest_accept": "Приемам (Въвеждам)",
|
||||
"friendRequest_decline": "Отказване",
|
||||
"friendRequest_declined": "<b>{0}</b> отхвърляне на искането ви за контакт",
|
||||
"friendRequest_accepted": "<b>{0}</b> приемане на вашата заявка за връзка",
|
||||
"friendRequest_received": "<b>{0}</b> би искал да бъде ваш контакт",
|
||||
"friendRequest_notification": "<b>{0}</b> ви изпрати заявка за контакт",
|
||||
"notifications_empty": "Няма налични известия",
|
||||
"profile_addDescription": "Добавяне на описание",
|
||||
"profile_editDescription": "Редактиране на вашето описание",
|
||||
"profile_addLink": "Добавяне на връзка към сайта си",
|
||||
"profile_friendRequestSent": "Изчакваща заявка за контакт...",
|
||||
"isContact": "{0} е един от вашите контакти",
|
||||
"isNotContact": "{0} is <b>not</b> един от вашите контакти",
|
||||
"profile_info": "Другите потребители могат да намерят профила ви чрез аватара ви в списъците с потребители на документи.",
|
||||
"notification_padShared": "{0} сподели документ с вас: <b>{1}</b>"
|
||||
}
|
||||
|
||||
@ -658,7 +658,7 @@
|
||||
"form_cantFindAnswers": "No s'han pogut recuperar les respostes existents per a aquest formulari.",
|
||||
"calendar_errorNoCalendar": "No s'ha seleccionat cap calendari editable",
|
||||
"form_editor": "Editor",
|
||||
"admin_setlimitTitle": "Aplica un límit personalitzat",
|
||||
"admin_setlimitTitle": "Estableix un límit personalitzat",
|
||||
"broadcast_preview": "Previsualitza la notificació",
|
||||
"settings_deleteSubscription": "Gestiona la meva subscripció",
|
||||
"footer_roadmap": "Full de ruta",
|
||||
@ -690,7 +690,7 @@
|
||||
"settings_trimHistoryTitle": "Suprimeix l'historial",
|
||||
"form_notAnswered": "<b>{0}</b> respostes buides",
|
||||
"snapshots_delete": "Suprimeix",
|
||||
"oo_version_latest": "Més tard",
|
||||
"oo_version_latest": "Últim",
|
||||
"oo_version": "Versió: ",
|
||||
"mediatag_loadButton": "Carrega l'adjunt",
|
||||
"notification_fileShared": "{0} us ha compartit un fitxer: <b>{1}</b>",
|
||||
@ -814,7 +814,7 @@
|
||||
"crowdfunding_button": "Doneu suport al CryptPad",
|
||||
"settings_codeSpellcheckLabel": "Activa la verificació ortogràfica a l'editor de codi",
|
||||
"admin_activeSessionsTitle": "Connexions actives",
|
||||
"admin_registeredTitle": "Usuaris registrats",
|
||||
"admin_registeredTitle": "Unitats d'usuari i d'equip",
|
||||
"admin_updateLimitDone": "L'actualització s'ha completat correctament",
|
||||
"isNotContact": "{0} <b>no</b> és un dels vostres contactes",
|
||||
"teams_table_role": "Rol",
|
||||
@ -890,7 +890,7 @@
|
||||
"fm_restricted": "No teniu accés",
|
||||
"settings_kanbanTagsTitle": "Filtre d'etiquetes",
|
||||
"settings_kanbanTagsAnd": "AND",
|
||||
"history_cantRestore": "Ha fallat la restauració. Està desconnectat.",
|
||||
"history_cantRestore": "Ha fallat la restauració. Esteu desconnectat.",
|
||||
"history_fastPrev": "Sessió d'edició anterior",
|
||||
"history_userNext": "Autor següent",
|
||||
"snaphot_title": "Instantània",
|
||||
@ -976,7 +976,7 @@
|
||||
"calendar_nth_last": "últim",
|
||||
"admin_cat_support": "Assistència",
|
||||
"friendRequest_later": "Decideix més tard",
|
||||
"history_restoreDrivePrompt": "Esteu segur que voleu substituir la versió actual de CryptDrive per la versió mostrada?",
|
||||
"history_restoreDrivePrompt": "Segur que voleu substituir la versió actual de CryptDrive per la versió mostrada?",
|
||||
"owner_add": "{0} vol que sigueu propietari del document <b>{1}</b>. Ho accepteu?",
|
||||
"owner_team_add": "{0} vol que sigueu propietari/a de l'equip <b>{1}</b>. Accepteu?",
|
||||
"sent": "Missatge enviat",
|
||||
@ -992,7 +992,7 @@
|
||||
"friendRequest_declined": "<b>{0}</b> ha rebutjat la sol·licitud de contacte",
|
||||
"form_alreadyAnsweredMult": "Heu respost a aquest formulari el:",
|
||||
"form_responseNotification": "Respostes noves al formulari: <b>{0}</b>",
|
||||
"snapshots_cantMake": "No s'ha pogut crear la instantània. Està desconnectat.",
|
||||
"snapshots_cantMake": "No s'ha pogut crear la instantània. Esteu sense connexió.",
|
||||
"calendar_rec_no": "Una vegada",
|
||||
"admin_defaultlimitTitle": "Límit d'emmagatzematge (MB)",
|
||||
"calendar_rec_monthly_pick": "En dies",
|
||||
@ -1009,7 +1009,7 @@
|
||||
"admin_limitSetNote": "Nota",
|
||||
"admin_invalKey": "Clau pública no vàlida",
|
||||
"admin_invalLimit": "El valor límit no és vàlid",
|
||||
"admin_cat_quota": "Emmagatzematge d'usuaris",
|
||||
"admin_cat_quota": "Emmagatzematge d'usuari",
|
||||
"team_exportTitle": "Descarrega la unitat de l'equip",
|
||||
"form_condition_q": "Trieu una pregunta",
|
||||
"home_location": "Les dades xifrades estan allotjades a {0}",
|
||||
@ -1125,7 +1125,7 @@
|
||||
"adminPage": "Administració",
|
||||
"admin_activeSessionsHint": "Nombre de connexions websocket actives (i adreces IP úniques connectades)",
|
||||
"admin_activePadsHint": "Nombre de documents únics que s'estan visualitzant o editant actualment",
|
||||
"admin_registeredHint": "Nombre d'usuaris registrats a la vostra instància",
|
||||
"admin_registeredHint": "Nombre d'unitats actives a la vostra instància",
|
||||
"admin_updateLimitTitle": "Actualitzar les quotes d'usuari",
|
||||
"admin_updateLimitButton": "Actualitzar les quotes",
|
||||
"admin_flushCacheTitle": "Neteja la memòria cau HTTP",
|
||||
@ -1332,12 +1332,12 @@
|
||||
"settings_cat_kanban": "Kanban",
|
||||
"history_restore": "Restaura",
|
||||
"history_close": "Tanca",
|
||||
"history_shareTitle": "Comparteix un enllaç a aquesta versió",
|
||||
"share_versionHash": "Esteu a punt de compartir la versió seleccionada de l'historial del document en mode només de lectura. Això també farà que <b>doni accés a la vista</b> per a totes les versions del document.",
|
||||
"history_shareTitle": "Compartiu un enllaç a aquesta versió",
|
||||
"share_versionHash": "Esteu a punt de compartir la versió seleccionada de l'historial del document en mode només de lectura. Això també farà que <b>doneu accés de lectura</b> per a totes les versions del document.",
|
||||
"history_userPrev": "Autor anterior",
|
||||
"history_fastNext": "Següent sessió d'edició",
|
||||
"history_fastNext": "Sessió d'edició següent",
|
||||
"history_restoreDriveTitle": "Restaura la versió seleccionada del CryptDrive",
|
||||
"snapshots_ooPickVersion": "Heu de seleccionar una versió abans de crear una instantània",
|
||||
"snapshots_ooPickVersion": "Cal seleccionar una versió abans de crear una instantània",
|
||||
"snapshot_error_exists": "Ja hi ha una instantània d'aquesta versió",
|
||||
"snapshots_notFound": "Aquesta instantània ja no existeix perquè s'ha suprimit l'historial del document.",
|
||||
"admin_registrationHint": "Els visitants de la instància no poden crear comptes. Els administradors poden crear invitacions.",
|
||||
@ -1350,13 +1350,13 @@
|
||||
"team_exportButton": "Baixa",
|
||||
"admin_limitUser": "Clau pública de l'usuari",
|
||||
"fm_deletedFolder": "S'ha suprimit la carpeta",
|
||||
"access_destroyPad": "Destrueix permanentment aquest document o carpeta",
|
||||
"access_destroyPad": "Esborra permanentment aquest document o carpeta",
|
||||
"fm_shareFolderPassword": "Protegeix aquesta carpeta amb una contrasenya (opcional)",
|
||||
"loading_state_0": "Interfície de construcció",
|
||||
"loading_state_1": "Carrega la unitat",
|
||||
"loading_state_2": "Actualitza el contingut",
|
||||
"loading_state_3": "Carrega les carpetes compartides",
|
||||
"loading_state_4": "Carrega els equips",
|
||||
"loading_state_4": "Carrega equips",
|
||||
"loading_state_5": "Reconstrueix el document",
|
||||
"tag_add": "Afegeix",
|
||||
"tag_edit": "Edita",
|
||||
@ -1762,5 +1762,30 @@
|
||||
"support_userNotification": "Tiquet d'assistència o resposta nou: {0}",
|
||||
"install_instance": "Creeu el primer compte d'administrador, després personalitzeu la instància",
|
||||
"install_header": "Instal·lació",
|
||||
"install_launch": "Configuració de la instància"
|
||||
"install_launch": "Configuració de la instància",
|
||||
"fm_restoreMultipleDialog": "Segur que voleu restablir {0} arxius o carpetes a les seves ubicacions anteriors?",
|
||||
"calendar_show": "Mostra els calendaris",
|
||||
"install_notes": "<ul class=\"cp-notes-list\">Creeu el primer compte d'administrador en aquesta pàgina. Els administradors editen la configuració de la instància, incloent-hi les quotes d'emmagatzematge, i tenen accés a les eines de moderació.</li><li>La vostra constrasenya és la clau secreta que encripta tots els vostres documents i privilegis d'administrador d'aquesta instància. <span class=\"red\">Si la perdeu, no hi ha manera de recuperar les vostres dades.</span></li><li>Si esteu utilitzant un ordinador compartit, <span class=\"red\">recordeu de tancar la sessió</span> quan hagueu acabat. El fet de simplement tancar la finestra del navegador deixa el vostre compte exposat.</li></ul>",
|
||||
"admin_mfa_confirm_enable": "Esteu segur que voleu activar l'autentificació multi-factor?",
|
||||
"form_passwordWarning": "Tingueu en compte que la constrasenya de formulari només es pot establir ara, el moment de creació, i que després no es pot canviar.",
|
||||
"calendar_hide": "Amaga els calendaris",
|
||||
"team_autoTrim": "S'està esborrant l'historial de la unitat d'equip.",
|
||||
"admin_mfa_confirm_disable": "Esteu segur que voleu desactivar l'autentificació multi-factor?",
|
||||
"support_recordedEmpty": "No hi ha cap fragment",
|
||||
"support_recordedId": "Identificador únic de fragment",
|
||||
"support_recordedTitle": "Fragments",
|
||||
"support_insertRecorded": "Inseriu un fragment",
|
||||
"install_token": "Token d'instal·lació",
|
||||
"admin_appSelection": "Configuració de l'aplicació",
|
||||
"admin_appsTitle": "Aplicacions de la instància",
|
||||
"onboarding_save_error": "Algunes opcions no s'han pogut desar correctament. Visiteu el panell d'administrador per comprovar-ne els valors.",
|
||||
"admin_appsHint": "Trieu quines aplicacions voleu habilitar per aquesta instància.",
|
||||
"admin_cat_apps": "Aplicacions",
|
||||
"onboarding_upload": "Trieu un logotip",
|
||||
"admin_onboardingNameTitle": "Us donem la benvinguda a la vostra instància de CryptPad",
|
||||
"admin_onboardingNameHint": "Trieu un títol, una descripció, un color de ressaltat i un logotip (tots son opcionals)",
|
||||
"admin_onboardingOptionsTitle": "Paràmetres de la instància",
|
||||
"admin_onboardingNamePlaceholder": "Títol de la instància",
|
||||
"admin_onboardingDescPlaceholder": "Descripció de la instància",
|
||||
"admin_onboardingOptionsHint": "Trieu la opció apropiada per la vostra instància.<br>Aquests paràmetres es poden canviar després des del panell d'administració."
|
||||
}
|
||||
|
||||
@ -70,10 +70,10 @@
|
||||
"pad_mediatagOpen": "Otevřit soubor",
|
||||
"pad_mediatagShare": "Sdílet soubor",
|
||||
"importButton": "Importovat",
|
||||
"formattedKB": "{0} KB",
|
||||
"formattedKB": "{0} kB",
|
||||
"formattedGB": "{0} GB",
|
||||
"formattedMB": "{0} MB",
|
||||
"KB": "KB",
|
||||
"KB": "kB",
|
||||
"GB": "GB",
|
||||
"MB": "MB",
|
||||
"language": "Jazyk",
|
||||
@ -320,7 +320,7 @@
|
||||
"chatButton": "Chat",
|
||||
"userListButton": "Seznam uživatelů",
|
||||
"shareButton": "Sdílet",
|
||||
"movedToTrash": "Dokument byl přesunut do koše.<br>Otevřít CryptDrive<a></a>",
|
||||
"movedToTrash": "Dokument byl přesunut do koše.<br><a>Otevřít CryptDrive</a>",
|
||||
"forgetPrompt": "Kliknutí na OK přesune dokument do koše. Jste si jistí?",
|
||||
"forgetButton": "Smazat",
|
||||
"saveTitle": "Uložit název (enter)",
|
||||
|
||||
@ -21,5 +21,164 @@
|
||||
"typeError": "Dette dokument er ikke kompatibelt med det valgte program",
|
||||
"main_title": "CryptPad: Zero Knowledge, Collaborative Real Time Editing",
|
||||
"common_connectionLost": "<b>Serverforbindelse afbrudt</b><br>Du er nu i skrivebeskyttet tilstand, indtil forbindelsen er tilbage.",
|
||||
"onLogout": "Du er logget ud, {0}klik her{1} for at logge ind<br>eller tryk på Esc for at få adgang til dit dokument i skrivebeskyttet tilstand."
|
||||
"onLogout": "Du er logget ud, {0}klik her{1} for at logge ind<br>eller tryk på Esc for at få adgang til dit dokument i skrivebeskyttet tilstand.",
|
||||
"historyText": "Redigeringshistorik",
|
||||
"uploadButton": "Upload filer",
|
||||
"padNotPinned": "Dette dokument vil udløbe efter 3 måneder af inaktivitet, {0}login{1} eller {2}lav en konto{3} for at bevare det.",
|
||||
"padNotPinnedVariable": "Dette dokument wil udløbe efter {4} dage af inaktivitet, {0}login{1} eller {2}lav en konto{3} for at bevare det.",
|
||||
"anonymousStoreDisabled": "Administratoren af denne Cryptpad-instans har deaktiveret opbevaring for gæster. Log ind for at tilgå dit eget CryptDrive.",
|
||||
"history_prev": "Tidligere version",
|
||||
"chainpadError": "En kritisk fejl har fundet sted i forbindelse med at updatere dit indhold. Denne side er i skrive-beskyttet tilstand for at garantere at du ikke mister dit arbejde. <br> Tryk Esc for at fortsætte med se dette dokument, eller genindlæs siden for at prøve at redigere igen.",
|
||||
"errorCopy": " Du kan stadig bruge den nuværende version i skrive-beskyttet tilstand ved at trykke Esc.",
|
||||
"storageStatus": "Plads:<br><b>{0}</b> brugt ud af <b>{1}</b>",
|
||||
"newVersionError": "En ny version af CryptPad er tilgængelig .<br><a href='#'>Genindlæs</a> for at bruge den nye version eller tryk Esc for at tilgå dit indhold i <b>offline tilstand</b>.",
|
||||
"pinLimitReachedAlertNoAccounts": "Du har nået din opbevaringsplads grænse",
|
||||
"initializing": "Opstarter...",
|
||||
"forgetPrompt": "Når du klikker OK, bliver dette dokument rykket til papirkurven. Er du sikker?",
|
||||
"selectTemplate": "Vælg en skabelon eller tryk Esc",
|
||||
"useTemplateCancel": "Start frisk (Esc)",
|
||||
"forgotten": "Flyttet til papirkurven",
|
||||
"readonly": "Skrivebeskyttet",
|
||||
"pinLimitDrive": "Du har nået din opbevaringsplads grænse. <br>Du kan ikke lave nye dokumenter.",
|
||||
"clickToEdit": "Klik for at redigere",
|
||||
"uploadButtonTitle": "Upload en ny fil til dit CryptDrive",
|
||||
"pinLimitReachedAlert": "Du har nået din opbevaringsplads grænse. Nye dokumenter vil ikke blive opbevaret i dit CryptDruve.<br>Du kan enten slette dokumenter fra CryptDrive eller <a>abonnere på et premium tilbud</a> for at forøge din grænse.",
|
||||
"exportPrompt": "Hvad vil du navngive din fil?",
|
||||
"user_rename": "Ændre dit kaldenavn",
|
||||
"newButtonTitle": "Lav et nyt dokument",
|
||||
"backgroundButtonTitle": "Ændre baggrundens farve i præsentationen",
|
||||
"printBackgroundRemove": "Fjern dette baggrundsbilled",
|
||||
"colorButtonTitle": "Ændre tekst farven i præsentations tilstanden",
|
||||
"printCSS": "Brugerdefineret stil-regler (CSS):",
|
||||
"printBackgroundNoValue": "<em>Intet baggrunds billed valgt</em>",
|
||||
"themeButtonTitle": "Vælg farveskemaet for kode og slide-editors",
|
||||
"tags_add": "Opdater tags for de valgte dokumenter",
|
||||
"tags_duplicate": "Duplikere tag: {0}",
|
||||
"languageButtonTitle": "Vælg sproget til at bruge for sytaks highlighting",
|
||||
"viewEmbedTag": "For at indlejre dette dokument, skal du inkludere denne iframe i din web-side hvor end du vil. Du kan stilisere det med CSS eller HTML attributer.",
|
||||
"forgetButton": "Slet",
|
||||
"shareButton": "Del",
|
||||
"tags_noentry": "Du kan ikke tag et slettet dokument",
|
||||
"notifyJoined": "{0} har joinet samarbejds-sessionen",
|
||||
"kanban_done": "Færdig",
|
||||
"poll_userPlaceholder": "Dit navn",
|
||||
"poll_removeOption": "Er du sikker på at du vil fjerne denne valg-mulighed?",
|
||||
"fileEmbedScript": "For at indlejre denne fil, inkluder dette script et sted i din web-side for at load Media-Tag'et:",
|
||||
"fileEmbedTag": "Da placere dette Media Tag, hvor end på din web-side hvor du har lyst til at indlejre det:",
|
||||
"history_restorePrompt": "Er du sikker på at du vil erstatte den nuværende version af dokumentet med den fremviste version?",
|
||||
"history_loadMore": "Vis mere af historikken",
|
||||
"poll_publish_button": "Offentliggør",
|
||||
"poll_create_user": "Tilføj en ny bruger",
|
||||
"expiredError": "Dette dokument har nået dets destruktions dato og er ikke længere tilgængeligt.",
|
||||
"invalidHashError": "Dokumentet som du har anmodet har en invalid URL.",
|
||||
"errorRedirectToHome": "Tryk Esc for at blive omdirigeret til dit CryptDrive.",
|
||||
"loading": "Indlæser...",
|
||||
"saved": "Gemt",
|
||||
"deletedFromServer": "Dokument destrueret",
|
||||
"disconnected": "Frakoblet",
|
||||
"synchronizing": "Synkronisere",
|
||||
"reconnecting": "Genforbinder",
|
||||
"typing": "Det bliver redigeret",
|
||||
"errorState": "Kritisk fejl: {0}",
|
||||
"users": "Bruger",
|
||||
"editor": "Redaktør",
|
||||
"userlist_offline": "Du er iøjeblikket offline, bruger-listen er ikke tilgængelig.",
|
||||
"language": "Sprog",
|
||||
"upgrade": "Upgrade",
|
||||
"MB": "MB",
|
||||
"GB": "GB",
|
||||
"formattedMB": "{0} MB",
|
||||
"formattedGB": "{0} GB",
|
||||
"pinLimitReached": "Du har nået din opbevaringsplads grænse",
|
||||
"importButtonTitle": "Importer et dokument fra en lokal fil",
|
||||
"exportButton": "Exporter",
|
||||
"exportButtonTitle": "Exporter dette dokument til en lokal fil",
|
||||
"user_displayName": "Kaldenavn",
|
||||
"user_accountName": "Kontonavn",
|
||||
"saveTitle": "Gem titlen (enter)",
|
||||
"movedToTrash": "Det dokument er blevet rykket til papirkurven.<br><a>Tilgå mit drive</a>",
|
||||
"userListButton": "Bruger liste",
|
||||
"chatButton": "Chat",
|
||||
"userAccountButton": "Bruger menu",
|
||||
"newButton": "Ny",
|
||||
"uploadFolderButton": "Upload mappe",
|
||||
"saveTemplateButton": "Gem som en skabelon",
|
||||
"saveTemplatePrompt": "Vælg en titel for skabelonen",
|
||||
"templateSaved": "Skabelon gemt!",
|
||||
"useTemplate": "Start med en skabelon?",
|
||||
"useTemplateOK": "Vælg en skabelon (Enter)",
|
||||
"template_import": "Importer en skabelon",
|
||||
"template_empty": "Ingen skabelon tilgængelig",
|
||||
"previewButtonTitle": "Vis eller gem Markdown viseren",
|
||||
"presentButtonTitle": "Aktiver præsentations tilstand",
|
||||
"propertiesButton": "Egenskaber",
|
||||
"propertiesButtonTitle": "Se dokumentets egenskaber",
|
||||
"printButton": "Print (Enter)",
|
||||
"printButtonTitle2": "Print dit dokument eller eksporter det som en pdf fil",
|
||||
"printOptions": "Layout indstillinger",
|
||||
"printSlideNumber": "Vis slide nummeret",
|
||||
"printDate": "Vis datoen",
|
||||
"printTitle": "Vis dokument titlen",
|
||||
"printTransition": "Aktiver overgangs animationer",
|
||||
"printBackground": "Brug et baggrundsbilled",
|
||||
"printBackgroundButton": "Vælg et billed",
|
||||
"printBackgroundValue": "<b>Nuværende baggrund:</b><em>{0}</em>",
|
||||
"filePickerButton": "Indlejre et dokument opbevaret i CryptDrive",
|
||||
"filePicker_close": "Luk",
|
||||
"filePicker_description": "Vælg en fil fra dit CryptDrive som du vil indlejre eller upload en ny fil",
|
||||
"filePicker_filter": "Filterere filer efter navn",
|
||||
"tags_title": "Tags (kun for dig)",
|
||||
"tags_notShared": "Dine tags er ikke delt med andre brugere",
|
||||
"slideOptionsText": "Indstillinger",
|
||||
"slideOptionsTitle": "Tilpas dine slides",
|
||||
"slide_invalidLess": "Brugerdefineret stil er ugyldig",
|
||||
"languageButton": "Sprog",
|
||||
"themeButton": "Tema",
|
||||
"viewShare": "Skrive-beskyttet link",
|
||||
"notifyRenamed": "{0} er nu kendt som {1}",
|
||||
"notifyLeft": "{0} har forladt samarbejds-sessionen",
|
||||
"ok": "OK",
|
||||
"okButton": "OK (Enter)",
|
||||
"cancel": "Afbryd",
|
||||
"cancelButton": "Afbryd (Esc)",
|
||||
"show_help_button": "Vis hjælp",
|
||||
"help_button": "Hjælp",
|
||||
"historyButton": "Vis dokumentets redigeringshistorik",
|
||||
"history_next": "Næste version",
|
||||
"history_closeTitle": "Luk historikken",
|
||||
"history_restoreTitle": "Genopret den valgte version af dokumentet",
|
||||
"history_restoreDone": "Dokument genoprettet",
|
||||
"openLinkInNewTab": "Åben link i en ny fane",
|
||||
"pad_mediatagTitle": "Media-Tag indstillinger",
|
||||
"pad_mediatagWidth": "Bredte (px)",
|
||||
"pad_mediatagHeight": "Højde (px)",
|
||||
"pad_mediatagRatio": "Bevar ratio",
|
||||
"pad_mediatagBorder": "Rammens bredde (px)",
|
||||
"pad_mediatagPreview": "Forevisning",
|
||||
"pad_mediatagImport": "Gem i dit CryptDrive",
|
||||
"pad_mediatagOptions": "Billed egenskaber",
|
||||
"kanban_newBoard": "Nyt board",
|
||||
"kanban_item": "Forekomst",
|
||||
"kanban_todo": "Mangler at gøres",
|
||||
"kanban_working": "Igangværende",
|
||||
"kanban_addBoard": "Tilføj et board",
|
||||
"poll_create_option": "Tilføj en ny mulighed",
|
||||
"poll_commit": "Indsend",
|
||||
"poll_optionPlaceholder": "Mulighed",
|
||||
"poll_removeUser": "Er du sikker på at du vil fjerne denne bruger?",
|
||||
"printText": "Print",
|
||||
"deletedError": "Dette dokument er blevet slettet og er ikke længere tilgængeligt.",
|
||||
"inactiveError": "Dette dokument er blevet slettet grundet inaktivitet. Tryk Esc for at lave et nyt dokument.",
|
||||
"deleted": "Slettet",
|
||||
"mustLogin": "Du må være logget ind, for at kunne tilgå denne side",
|
||||
"disabledApp": "Denne applikation er blevet deaktiveret. Kontakt administratoren af denne Cryptpad for mere information.",
|
||||
"realtime_unrecoverableError": "En ikke reperarbar fejl har fundet sted. Klik OK for at genindlæse.",
|
||||
"anonymous": "Gæst",
|
||||
"upgradeAccount": "Opgrader konto",
|
||||
"pinLimitNotPinned": "Du har nået din opbevaringsplads grænse. <br>Dette dokument er ikke opbevaret i dit CryptDrive.",
|
||||
"importButton": "Importer",
|
||||
"editShare": "Rediger link",
|
||||
"error": "Fejl",
|
||||
"KB": "kB",
|
||||
"formattedKB": "{0} kB"
|
||||
}
|
||||
|
||||
@ -16,7 +16,8 @@
|
||||
"teams": "Equipos",
|
||||
"form": "Formulario",
|
||||
"presentation": "Presentación",
|
||||
"doc": "Documento"
|
||||
"doc": "Documento",
|
||||
"diagram": "Diagrama"
|
||||
},
|
||||
"disconnected": "Desconectado",
|
||||
"synchronizing": "Sincronizando",
|
||||
@ -1573,5 +1574,13 @@
|
||||
"team_linkUsesInfinite": "(sin límite de usos)",
|
||||
"form_settingsButton": "Configuración del formulario",
|
||||
"form_editable_on": "Una vez y editar",
|
||||
"form_responseNotification": "Nuevas respuestas a la forma: <b>{0}</b>"
|
||||
"form_responseNotification": "Nuevas respuestas a la forma: <b>{0}</b>",
|
||||
"settings_mfaHint": "Proteja su cuenta con un código de verificación adicional proporcionado por una aplicación autenticadora de su elección.",
|
||||
"form_anonymized": "Las respuestas son anónimas",
|
||||
"form_condorcetSchulze": "Schulze",
|
||||
"form_showCondorcetWinner": "ganador: ",
|
||||
"form_showDetails": "Detalles",
|
||||
"form_condorcetExtendedDisplay": "Número de partidos ganados por cada candidato: ",
|
||||
"form_type_date": "Fecha",
|
||||
"team_linkUses": "({0}/{1} restante)"
|
||||
}
|
||||
|
||||
@ -1783,5 +1783,9 @@
|
||||
"admin_onboardingOptionsHint": "Mesedez, hautatu aukera egokia zure instantziarako.<br>Ezarpen hauek geroago alda daitezke administrazio panelean.",
|
||||
"admin_mfa_confirm_disable": "Ziur faktore anitzeko autentifikazioa desgaitu nahi duzula?",
|
||||
"admin_mfa_confirm_enable": "Ziur faktore anitzeko autentifikazioa gaitu nahi duzula?",
|
||||
"team_autoTrim": "Taldeko diskoen historia mozten... Itxaron mesedez."
|
||||
"team_autoTrim": "Taldeko diskoen historia mozten... Itxaron mesedez.",
|
||||
"fm_restoreMultipleDialog": "Ziur {0} fitxategi edo/eta karpeta lehengo kokapenetara leheneratu nahi dituzula?",
|
||||
"calendar_show": "Erakutsi egutegiak",
|
||||
"calendar_hide": "Ezkutatu egutegiak",
|
||||
"form_passwordWarning": "Kontuan izan Inprimakiaren pasahitza orain bakarrik ezar daitekeela sortzean eta ezin dela geroago aldatu."
|
||||
}
|
||||
|
||||
@ -1771,5 +1771,10 @@
|
||||
"admin_onboardingOptionsHint": "Scegli l’opzione appropriata per la tua istanza.<br> Queste configurazioni possono essere cambiate successivamente nel pannello di amministrazione.",
|
||||
"team_autoTrim": "Eliminazione della cronologia del drive del gruppo... Si prega di attendere.",
|
||||
"admin_mfa_confirm_enable": "Sei sicuro/a di voler attivare l'autenticazione a più fattori?",
|
||||
"admin_mfa_confirm_disable": "Sei sicuro/a di voler disattivare l'autenticazione a più fattori?"
|
||||
"admin_mfa_confirm_disable": "Sei sicuro/a di voler disattivare l'autenticazione a più fattori?",
|
||||
"fm_restoreMultipleDialog": "Sei sicuro/a di voler ripristinare {0} file e/o cartelle nelle loro posizioni precedenti?",
|
||||
"calendar_hide": "Nascondi i calendari",
|
||||
"calendar_show": "Mostra i calendari",
|
||||
"form_passwordWarning": "La password del modulo può essere impostata solo al momento della creazione e non può essere modificata in seguito.",
|
||||
"admin_blockKey": "Chiave pubblica di blocco"
|
||||
}
|
||||
|
||||
@ -1154,7 +1154,7 @@
|
||||
"calendar_deleteConfirm": "Are you sure you want to delete this calendar from your account?",
|
||||
"calendar_deleteTeamConfirm": "Are you sure you want to delete this calendar from the team?",
|
||||
"calendar_deleteOwned": "It will remain visible to other users it has been shared with.",
|
||||
"calendar_errorNoCalendar": "No editable calendar selected",
|
||||
"calendar_errorNoCalendar": "No calendar available",
|
||||
"calendar_import": "Add to my calendars",
|
||||
"calendar_newEvent": "New event",
|
||||
"calendar_dateRange": "{0} - {1}",
|
||||
@ -1328,7 +1328,7 @@
|
||||
"form_anonName": "Your name",
|
||||
"form_answerAs": "Answer as",
|
||||
"fm_link_warning": "Warning: the URL exceeds 200 characters",
|
||||
"fm_link_invalid": "Invalid URL",
|
||||
"fm_link_invalid": "Please provide a valid URL",
|
||||
"ui_collapse": "Collapse",
|
||||
"ui_expand": "Expand",
|
||||
"form_totalResponses": "Total responses: {0}",
|
||||
@ -1787,5 +1787,35 @@
|
||||
"form_passwordWarning": "Please note that a Form password can only be set now at creation time and cannot be changed later.",
|
||||
"fm_restoreMultipleDialog": "Are you sure you want to restore {0} files and/or folders to their previous locations?",
|
||||
"calendar_show": "Show calendars",
|
||||
"calendar_hide": "Hide calendars"
|
||||
"calendar_hide": "Hide calendars",
|
||||
"admin_logoSize_error": "The logo size is too large",
|
||||
"admin_listAdminsHint": "View and remove administrators",
|
||||
"error_limit": "Please enter a valid number",
|
||||
"form_answerType_error": "Please select how to answer the form",
|
||||
"admin_addKeyLabel": "Add an admin using their public key",
|
||||
"error_positiveNumber": "Please enter a positive number",
|
||||
"admin_cat_admins": "Administrators",
|
||||
"admin_admin": "Admin",
|
||||
"admin_listAdminsTitle": "Current administrators",
|
||||
"admin_addAdminsAdd": "Promote a contact to admin",
|
||||
"admin_addAdminsTitle": "Add administrators",
|
||||
"admin_errorAddAdmins": "Pick a contact to promote to admin",
|
||||
"admin_addAdminsHint": "Add administrators from their public key or from your contacts list",
|
||||
"moveItemLeft": "Move item left",
|
||||
"admin_errorAddKeyLabel": "Add a valid public key",
|
||||
"skipLink": "Skip to main content",
|
||||
"admin_listName": "Admin name",
|
||||
"admin_listKey": "Admin key",
|
||||
"moveItemRight": "Move item right",
|
||||
"admin_listAction": "Remove admin rights",
|
||||
"kanban_moveBoardRight": "Move board right",
|
||||
"admin_listHardcoded": "Admin added into config.js. Can only be removed by editing the config file.",
|
||||
"addItemBottom": "Add card to the bottom of the board",
|
||||
"admin_listConfirm": "Are you sure you want to remove the admin rights of this user?",
|
||||
"addItemTop": "Add card to the top of the board",
|
||||
"kanban_moveBoardLeft": "Move board left",
|
||||
"toggleDrag": "Drag to move items",
|
||||
"moveItemUp": "Move item up",
|
||||
"moveItemDown": "Move item down",
|
||||
"toggleArrows": "Arrow buttons to move items"
|
||||
}
|
||||
|
||||
@ -121,7 +121,7 @@
|
||||
"pinLimitReachedAlertNoAccounts": "U heeft uw opslaglimiet bereikt",
|
||||
"pinLimitReachedAlert": "U heeft uw opslaglimiet bereikt. Nieuwe documenten worden niet opgeslagen in uw CryptDrive.<br>U kunt documenten verwijderen van uw CryptDrive of <a>opwaarderen naar een premium-account</a> om uw opslaglimiet te verhogen.",
|
||||
"pinLimitReached": "U heeft uw opslaglimiet bereikt",
|
||||
"formattedKB": "{0} KB",
|
||||
"formattedKB": "{0} kB",
|
||||
"formattedGB": "{0} GB",
|
||||
"formattedMB": "{0} MB",
|
||||
"KB": "KB",
|
||||
|
||||
@ -352,7 +352,7 @@
|
||||
"settings_autostoreMaybe": "Manual (sempre perguntar)",
|
||||
"settings_autostoreYes": "Automático",
|
||||
"settings_autostoreHint": "<b>Automatico</b> Todos os documentos que você visitou estão armazenados em seu CryptDrive.<br><b>Manual (sempre pergunta)</b> Se você ainda não armazenou documentos, será questionado se deseja armazená-los em seu CryptDrive.<br><b>Manual (nunca pergunta)</b> Os documentos não são armazenados automaticamente em seu CryptDrive. A opção para armazená-los estará escondida.",
|
||||
"settings_autostoreTitle": "Bloco armazenado no CryptDrive",
|
||||
"settings_autostoreTitle": "Documento armazenado no CryptDrive",
|
||||
"settings_resetThumbnailsDone": "Todas as miniaturas foram apagadas.",
|
||||
"settings_resetThumbnailsDescription": "Limpar todas as miniaturas de documentos armazenadas em seu navegador.",
|
||||
"settings_resetThumbnailsAction": "Limpar",
|
||||
@ -464,8 +464,8 @@
|
||||
"admin_updateLimitButton": "Atualizar cotas",
|
||||
"admin_updateLimitHint": "Forçar uma atualização dos limites de armazenamento do usuário pode ser feito a qualquer momento, mas só é necessário em caso de erro",
|
||||
"admin_updateLimitTitle": "Atualizar cotas de usuários",
|
||||
"admin_registeredHint": "Número de usuários registrados na sua instância",
|
||||
"admin_registeredTitle": "Usuários registrados",
|
||||
"admin_registeredHint": "Número de usuários ativos na sua instância",
|
||||
"admin_registeredTitle": "Drives do usuário e equipe",
|
||||
"admin_activePadsHint": "Número de documentos exclusivos atualmente sendo visualizados ou editados",
|
||||
"admin_activePadsTitle": "documentos ativos",
|
||||
"admin_activeSessionsHint": "Número de conexões websocket ativas (e único endereço de IP conectado)",
|
||||
@ -816,7 +816,7 @@
|
||||
"footer_donate": "Doe",
|
||||
"admin_flushCacheDone": "Cache limpo com sucesso",
|
||||
"admin_flushCacheButton": "Limpar cache",
|
||||
"admin_flushCacheHint": "Força os usuários a baixar os ativos do cliente mais recentes (apenas se o seu servidor estiver no modo novo)",
|
||||
"admin_flushCacheHint": "Força os usuários a baixar os ativos do cliente mais recentes (apenas se o seu servidor estiver no modo novo) após uma customização ou alteração nas configurações. Evita reiniciar o servidor mas reinicia as conexões de todos os usuários, por favor use com cautela.",
|
||||
"admin_flushCacheTitle": "Limpar cache HTTP",
|
||||
"settings_padNotifTitle": "Notificações de comentários",
|
||||
"comments_comment": "Comentário",
|
||||
@ -1018,7 +1018,7 @@
|
||||
"history_cantRestore": "Restauração falhou. Você está desconectado.",
|
||||
"history_close": "Fechar",
|
||||
"history_restore": "Restaurar",
|
||||
"admin_registrationHint": "Não permitir que nenhum novo usuário se registre",
|
||||
"admin_registrationHint": "Visitantes da instância não podem criar contas. Convites podem ser criados pelos administradores.",
|
||||
"fm_sort": "Ordenar",
|
||||
"comments_error": "Não é possível acrescentar um comentário aqui",
|
||||
"settings_padNotifCheckbox": "Desabilitar notificações de comentários",
|
||||
@ -1666,5 +1666,6 @@
|
||||
"admin_diskUsageWarning": "Use com cuidado! Dependendo do tamanho dos dados armazenados na instância, a geração deste relatório pode consumir toda a memória disponível no servidor e causar travamento.",
|
||||
"goRight": "Direita",
|
||||
"dph_pad_pw": "Este documento está protegido por uma nova senha",
|
||||
"goLeft": "Esquerda"
|
||||
"goLeft": "Esquerda",
|
||||
"calendar_rec_change_first": "Movendo o primeiro evento duplicado para uma agenda diferente. Todos os eventos duplicados serão movidos."
|
||||
}
|
||||
|
||||
@ -1783,5 +1783,9 @@
|
||||
"install_header": "Instalare",
|
||||
"team_autoTrim": "Scurtăm istoricul drive-ului de echipa... Vă rugăm să așteptați.",
|
||||
"admin_mfa_confirm_enable": "Sunteți sigur că doriți să activați Autentificarea În Mai Mulți Pași?",
|
||||
"admin_mfa_confirm_disable": "Sunteți sigur că doriți să dezactivați Autentificarea În Mai Mulți Pași?"
|
||||
"admin_mfa_confirm_disable": "Sunteți sigur că doriți să dezactivați Autentificarea În Mai Mulți Pași?",
|
||||
"form_passwordWarning": "Vă rugăm să țineți minte că parola la Form poate fi setată doar acum, în momentul creării și nu poate fi schimbată mai târziu.",
|
||||
"fm_restoreMultipleDialog": "Sigur doriți să restaurați {0} fișiere și/sau dosare către locația lor anterioară?",
|
||||
"calendar_show": "Arată calendare",
|
||||
"calendar_hide": "Ascunde calendare"
|
||||
}
|
||||
|
||||
@ -1783,5 +1783,9 @@
|
||||
"admin_onboardingDescPlaceholder": "Текст описания экземпляра",
|
||||
"admin_mfa_confirm_disable": "Вы уверены, что хотите выключить многофакторную аутентификацию (MFA)?",
|
||||
"admin_mfa_confirm_enable": "Вы уверены, что хотите включить многофакторную аутентификацию (MFA)?",
|
||||
"team_autoTrim": "Оптимизация (усечение) истории хранилища Команды... Пожалуйста, подождите."
|
||||
"team_autoTrim": "Оптимизация (усечение) истории хранилища Команды... Пожалуйста, подождите.",
|
||||
"form_passwordWarning": "Обратите внимание, что пароль Формы можно установить только сейчас, во время создания, и его нельзя изменить позже.",
|
||||
"calendar_hide": "Скрыть календари",
|
||||
"fm_restoreMultipleDialog": "Вы уверены, что хотите восстановить {0} файлов и/или папок в прежнее расположение?",
|
||||
"calendar_show": "Показать календари"
|
||||
}
|
||||
|
||||
@ -13,23 +13,28 @@
|
||||
"login_confirm": "Opakujte heslo",
|
||||
"login_password": "Heslo",
|
||||
"login_username": "Uživatelské jméno",
|
||||
"padNotPinned": "Tento dokument expiruje za 3 měsíce neaktivity, {0}přihlašte se{1} nebo {2}se registrujte{3} pro jeho uchování.",
|
||||
"onLogout": "Jste odhlášení, {0}klikněte zde{1} pro přihlášení<br>nebo zmáčkněte Esc pro čtení dokumentu.",
|
||||
"typeError": "Tento dokument není kompatibilní s vybranou aplikací",
|
||||
"common_connectionLost": "<b>Spojení se serverem ztraceno</b><br>Nyní jste v režimu čtení, dokud nebude spojení obnoveno.",
|
||||
"padNotPinned": "Tento dokument expiruje po 3 mesiacoch neakivity, {0}prihláste sa{1} alebo {2}registrujte{3}, aby ste si ho ponechali.",
|
||||
"onLogout": "Ste odhlásený, {0}kliknite sem{1} pre prihlásenie<br>alebo stlačte Esc pre čítanie dokumentu.",
|
||||
"typeError": "Tento dokument nie je kompatibilný s vybranou aplikáciou",
|
||||
"common_connectionLost": "<b>Strata spojenia so serverom</b><br>Ste v režime na čítanie, pokým nebude spojenie obnovené.",
|
||||
"type": {
|
||||
"teams": "Týmy",
|
||||
"sheet": "Tabulka",
|
||||
"teams": "Tímy",
|
||||
"sheet": "Tabuľka",
|
||||
"contacts": "Kontakty",
|
||||
"todo": "Úkol",
|
||||
"media": "Média",
|
||||
"file": "Soubor",
|
||||
"whiteboard": "Tabule",
|
||||
"todo": "Dokončiť",
|
||||
"media": "Médiá",
|
||||
"file": "Súbor",
|
||||
"whiteboard": "Whiteboard",
|
||||
"drive": "CryptDrive",
|
||||
"slide": "Prezentace",
|
||||
"poll": "Hlasování",
|
||||
"slide": "Prezentácia",
|
||||
"poll": "Hlasovanie",
|
||||
"code": "Kód",
|
||||
"pad": "Formátovaný text"
|
||||
"pad": "Dokument",
|
||||
"form": "Formulár",
|
||||
"doc": "Dokument",
|
||||
"presentation": "Prezentácia",
|
||||
"diagram": "Diagram",
|
||||
"kanban": "Kanban"
|
||||
},
|
||||
"logoutEverywhere": "Odhlásit se všude",
|
||||
"login_login": "Přihlásit se",
|
||||
@ -42,14 +47,263 @@
|
||||
"register_cancel": "Zrušit",
|
||||
"register_writtenPassword": "Své uživatelské jméno a heslo jsem si zapsal, pokračovat",
|
||||
"register_header": "Registrovat",
|
||||
"deletedFromServer": "Dokument zničen",
|
||||
"deleted": "Smazáno",
|
||||
"saved": "Uloženo",
|
||||
"deletedFromServer": "Dokument bol zničený",
|
||||
"deleted": "Zmazané",
|
||||
"saved": "Uložené",
|
||||
"error": "Chyba",
|
||||
"loading": "Načítání...",
|
||||
"invalidHashError": "Požadovaný dokument má neplatné URL.",
|
||||
"inactiveError": "Tento dokument byl smazán kvůli neaktivitě. Zmáčkněte Escape pro vytvoření nového dokumentu.",
|
||||
"deletedError": "Tento dokument byl smazán a není již dostupný.",
|
||||
"expiredError": "Tento dokument expiroval a není již dostupný.",
|
||||
"padNotPinnedVariable": "Tento dokument expiruje za {4} dny neaktivity, {0}přihlašte se{1} nebo {2}se registrujte{3} pro jeho uchování."
|
||||
"loading": "Načítavanie...",
|
||||
"invalidHashError": "Požadovaný dokument má neplatnú adresu URL.",
|
||||
"inactiveError": "Tento dokument bol vymazaný kvôli neaktivite. Stlačte Esc na vytvorenie nového dokumentu.",
|
||||
"deletedError": "Tento dokument bol vymazaný a už nie je dostupný.",
|
||||
"expiredError": "Tento dokument expiroval a už nie je dostupný.",
|
||||
"padNotPinnedVariable": "Tento dokument expiruje po {4}dňoch neaktivity, {0}prihláste sa{1} alebo {2}registrujte{3}, aby ste si ho ponechali.",
|
||||
"editor": "redaktor",
|
||||
"viewer": "čitateľ",
|
||||
"viewers": "čitatelia",
|
||||
"errorCopy": " Stále môžete použiť súcasnú verziu v režime iba na čítanie stlačením Esc.",
|
||||
"errorRedirectToHome": "Stlačte Esc na presmerovanie do vášho CryptDrive.",
|
||||
"newVersionError": "K dispozíci je novšia verzia CryptPad.<br><a href='#'>Obnovte stránku</a> pre zobrazenie novšej verzie alebo stlačte escape pre pokračovanie <b>v offline režime</b>.",
|
||||
"mustLogin": "Musíte byť prihlásený pre prístup k tejto stránke",
|
||||
"realtime_unrecoverableError": "Vyskytla sa neopraviteľná chyba. Kliknite OK pre obnovenie stránky.",
|
||||
"disconnected": "Odpojené",
|
||||
"synchronizing": "Synchronizácia",
|
||||
"reconnecting": "Prebieha opätovné pripojenie",
|
||||
"typing": "Úprava",
|
||||
"initializing": "Inicializovanie...",
|
||||
"forgotten": "Presunuté do koša",
|
||||
"errorState": "Kritická chyba: {0}",
|
||||
"anonymousStoreDisabled": "Administrátor tejto CryptPad inštancie zakázal úložisko pre hostí. Prihlásením získate prístup k vašemu CryptDrive.",
|
||||
"chainpadError": "Pri aktualizovaní obsahu došlo ku kritickej chybe. Táto stránka je v režime len na čítanie, aby ste nestratili svoju prácu.<br>Stlačte Esc na zobrazenie dokumentu alebo znovu načítajte pre pokračovanie v úpravách.",
|
||||
"users": "Používatelia",
|
||||
"language": "Jazyk",
|
||||
"upgrade": "Upgrade",
|
||||
"upgradeAccount": "Upgrade účtu",
|
||||
"MB": "MB",
|
||||
"GB": "GB",
|
||||
"formattedMB": "{0} MB",
|
||||
"formattedGB": "{0} GB",
|
||||
"pinLimitReached": "Dosiahli ste limit úložiska",
|
||||
"pinLimitReachedAlertNoAccounts": "Dosiahli ste limit úložiska",
|
||||
"pinLimitNotPinned": "Dosiahli ste limit úložiska.<br>Tento dokument nie je uložený vo vašom CryptDrive.",
|
||||
"pinLimitDrive": "Dosiahli ste limit úložiska.<br>Nemôžete vytvoriť nové dokumenty.",
|
||||
"importButton": "Importovať",
|
||||
"importButtonTitle": "Importovať dokument zo súboru",
|
||||
"exportButton": "Exportovať",
|
||||
"exportButtonTitle": "Exportovať dokument do súboru",
|
||||
"exportPrompt": "Ako chcete pomenovať váš súbor?",
|
||||
"user_rename": "Zmeniť meno",
|
||||
"user_displayName": "Meno",
|
||||
"user_accountName": "Užívateľské meno",
|
||||
"clickToEdit": "Kliknite pre úpravu",
|
||||
"saveTitle": "Uložiť názov (enter)",
|
||||
"forgetButton": "Zmazať",
|
||||
"movedToTrash": "Dokument bol presunutý do koša.<br><a>Otvoriť CryptDrive</a>",
|
||||
"shareButton": "Zdieľať",
|
||||
"shareSuccess": "Odkaz bol skopírovaný do schránky",
|
||||
"userListButton": "Zoznam používateľov",
|
||||
"chatButton": "Chat",
|
||||
"userAccountButton": "Používateľské menu",
|
||||
"newButton": "Nový",
|
||||
"uploadButton": "Nahrať súbory",
|
||||
"uploadFolderButton": "Nahrať priečinok",
|
||||
"uploadButtonTitle": "Nahrať nový súbor na CryptDrive",
|
||||
"saveTemplatePrompt": "Zvoľte názov pre šablónu",
|
||||
"saveTemplateButton": "Uložiť ako šablónu",
|
||||
"templateSaved": "Šablóna uložená!",
|
||||
"useTemplate": "Začať so šablónou?",
|
||||
"useTemplateOK": "Vybrať šablónu (Enter)",
|
||||
"useTemplateCancel": "Začať bez šablóny (Esc)",
|
||||
"template_empty": "Nie je k dispozícii žiadna šablóna",
|
||||
"previewButtonTitle": "Zobraziť alebo skyť Markdown náhľad",
|
||||
"presentButtonTitle": "Spustiť režim prezentácie",
|
||||
"colorButtonTitle": "Zmeniť farbu textu v režime prezentácie",
|
||||
"propertiesButton": "Vlastnosti",
|
||||
"propertiesButtonTitle": "Zistiť vlastnosti dokumentu",
|
||||
"printButton": "Tlačiť (enter)",
|
||||
"printOptions": "Možnosti rozloženia",
|
||||
"printSlideNumber": "Zobraziť číslo snímky",
|
||||
"printDate": "Zobraziť dátum",
|
||||
"printTitle": "Zobraziť názov dokumentu",
|
||||
"printCSS": "Vlastné pravidlá štýlu (CSS):",
|
||||
"printTransition": "Povoliť animáciu prechodov",
|
||||
"printBackground": "Použiť obrázok na pozadí",
|
||||
"printBackgroundButton": "Vybrať obrázok",
|
||||
"printBackgroundRemove": "Odstrániť obrázok na pozadí",
|
||||
"filePickerButton": "Vložiť súbor uložený v CryptDrive",
|
||||
"filePicker_close": "Zavrieť",
|
||||
"filePicker_filter": "Filtrovať súbory podľa názvu",
|
||||
"tags_title": "Štítky (len pre vás)",
|
||||
"tags_add": "Upraviť štítky pre vybrané dokumenty",
|
||||
"tags_notShared": "Vaše štítky nie sú zdieľané s ostatnými používateľmi",
|
||||
"tags_duplicate": "Duplicitný štítok : {0}",
|
||||
"tags_noentry": "Nemôžete pridať štítok ku vymazanému dokumentu",
|
||||
"slideOptionsText": "Možnosti",
|
||||
"slide_invalidLess": "Neplatný vlastný štýl",
|
||||
"languageButton": "Jazyk",
|
||||
"themeButton": "Motív",
|
||||
"themeButtonTitle": "Vybrať farebný motív pre editory kódu a snímkov",
|
||||
"viewShare": "Odkaz len na čítanie",
|
||||
"fileEmbedScript": "Pre vloženie súboru vložte tento skript raz do svojej stránky, aby sa načítal Media Tag:",
|
||||
"fileEmbedTag": "Potom umiestnite Media Tag kamkoľvek na stránku, ktorú chcete vložiť:",
|
||||
"notifyJoined": "{0} sa pripojil ku spolupráci",
|
||||
"notifyRenamed": "{0} je teraz {1}",
|
||||
"notifyLeft": "{0} odišiel/a",
|
||||
"ok": "OK",
|
||||
"okButton": "OK (enter)",
|
||||
"editShare": "Odkaz pre úpravy",
|
||||
"cancelButton": "Zrušiť (esc)",
|
||||
"show_help_button": "Zobraziť nápovedu",
|
||||
"help_button": "Nápoveda",
|
||||
"historyText": "História",
|
||||
"main_title": "CryptPad: Zero Knowledge, Collaborative Real Time Editing",
|
||||
"userlist_offline": "Aktuálne ste offline, zoznam používateľov nie je dostupný.",
|
||||
"pinLimitReachedAlert": "Dosiahli ste limit úložiska. Nové dokumenty sa nebudú ukladať vo vašom CryptDrive.<br>Buď vymažte dokumenty zo svojho CryptDrive alebo <a>si zakúpte prémiovú ponuku</a> pre zvýšenie limitu.",
|
||||
"newButtonTitle": "Vytvoriť nový dokument",
|
||||
"selectTemplate": "Vyberte šablónu alebo stlačte escape",
|
||||
"readonly": "Iba na čítanie",
|
||||
"disabledApp": "Táto aplikácia bola zakázaná. Kontaktujte administrátora tejto CryptPad inštancie pre viac informácii.",
|
||||
"formattedKB": "{0} kB",
|
||||
"template_import": "Importovať šablónu",
|
||||
"forgetPrompt": "Kliknutím na OK presuniete dokument do koša. Ste si istý?",
|
||||
"backgroundButtonTitle": "Zmena farby pozadia v prezentácii",
|
||||
"printButtonTitle2": "Vytlačiť dokument alebo exportovať ako PDF súbor",
|
||||
"printText": "Tlačiť",
|
||||
"printBackgroundValue": "<b>Aktuálne pozadie:</b> <em>{0}</em>",
|
||||
"slideOptionsTitle": "Prispôsobiť snímky",
|
||||
"filePicker_description": "Vyberte súbor z CryptDrive alebo nahrajte nový súbor pre vloženie",
|
||||
"cancel": "Zrušiť",
|
||||
"viewEmbedTag": "Tento iframe môžete vložiť na svoju stránku a upraviť ho pomocou CSS alebo HTML.",
|
||||
"historyButton": "Zobraziť históriu dokumentu",
|
||||
"anonymous": "Hosť",
|
||||
"KB": "kB",
|
||||
"storageStatus": "Úložisko:<br><b>{0}</b> využité z <b>{1}</b>",
|
||||
"printBackgroundNoValue": "<em>Nezobrazuje sa žiadny obrázok na pozadí</em>",
|
||||
"languageButtonTitle": "Vybrať jazyk pre zvýraznenie syntaxe",
|
||||
"history_next": "Ďalšia verzia",
|
||||
"history_prev": "Predchádzajúca verzia",
|
||||
"history_loadMore": "Načítať ďalšiu históriu",
|
||||
"history_closeTitle": "Zavrieť históriu",
|
||||
"history_restoreTitle": "Obnoviť vybranú verziu dokumentu",
|
||||
"history_restorePrompt": "Ste si istý, že chcete nahradiť súčasnú verziu dokumentu vybranou verziou?",
|
||||
"history_restoreDone": "Dokument obnovený",
|
||||
"openLinkInNewTab": "Otvoriť odkaz v novej karte",
|
||||
"pad_mediatagTitle": "Nastavenia Media-Tag",
|
||||
"pad_mediatagWidth": "Šírka (px)",
|
||||
"pad_mediatagHeight": "Výška (px)",
|
||||
"pad_mediatagRatio": "Zachovať pomer",
|
||||
"pad_mediatagBorder": "Širka okraja (px)",
|
||||
"pad_mediatagPreview": "Náhľad",
|
||||
"pad_mediatagImport": "Uložiť do CryptDrive",
|
||||
"pad_mediatagOptions": "Vlastnosti obrázku",
|
||||
"kanban_item": "Položka {0}",
|
||||
"kanban_todo": "Dokončiť",
|
||||
"kanban_done": "Hotovo",
|
||||
"kanban_working": "Prebieha",
|
||||
"kanban_addBoard": "Pridať stĺpec",
|
||||
"poll_publish_button": "Zverejniť",
|
||||
"poll_create_user": "Pridať nového používateľa",
|
||||
"poll_create_option": "Pridať novú možnosť",
|
||||
"poll_commit": "Odoslať",
|
||||
"poll_userPlaceholder": "Vaše meno",
|
||||
"poll_removeOption": "Ste si istý, že chcete odstrániť túto možnosť?",
|
||||
"poll_remove": "Odstrániť",
|
||||
"poll_edit": "Upraviť",
|
||||
"poll_locked": "Uzamknuté",
|
||||
"poll_unlocked": "Odomknuté",
|
||||
"poll_bookmark_col": "Tento stĺpec si môžeťe pridať do záložiek, aby sa vám vždy odomkol a zobrazil na začiatku",
|
||||
"poll_bookmarked_col": "Toto je pripnutý stĺpec. Bude vždy odomknutý a zobrazí sa na začiatku.",
|
||||
"poll_total": "SUMA",
|
||||
"poll_comment_list": "Komentáre",
|
||||
"poll_comment_add": "Pridať komentár",
|
||||
"poll_comment_submit": "Odoslať",
|
||||
"poll_comment_remove": "Odstrániť komentár",
|
||||
"poll_comment_placeholder": "Váš komentár",
|
||||
"oo_cantUpload": "Nahrávanie nie je povolené pokiaľ sú pripojený ostatný používatelia.",
|
||||
"oo_uploaded": "Nahrávanie dokončené. Kliknite OK pre obnovenie stránky alebo zrušiť pre pokračovanie v režime iba na čítanie.",
|
||||
"canvas_clear": "Vymazať",
|
||||
"canvas_delete": "Vymazať výber",
|
||||
"canvas_width": "Šírka",
|
||||
"canvas_opacity": "Priehľadnosť",
|
||||
"canvas_opacityLabel": "Priehľadnosť: {0}",
|
||||
"canvas_widthLabel": "Šírka: {0}",
|
||||
"canvas_currentBrush": "Aktuálny štetec",
|
||||
"canvas_imageEmbed": "Vložiť obrázok z počítača",
|
||||
"profileButton": "Profil",
|
||||
"profile_upload": " Nahrať nového avatara",
|
||||
"profile_uploadSizeError": "Chyba: váš avatar musí byť menší ako {0}",
|
||||
"profile_error": "Nastala chyba počas vytvárania vášho profilu: {0}",
|
||||
"profile_register": "Pre vytvorenie profilu sa musíte zaregistrovať!",
|
||||
"profile_viewMyProfile": "Zobraziť môj profil",
|
||||
"userlist_addAsFriendTitle": "Odoslať \"{0}\" žiadosť o kontakt",
|
||||
"contacts_title": "Kontakty",
|
||||
"contacts_rejected": "Žiadosť o kontakt zamietnutá",
|
||||
"contacts_request": "<em>{0}</em>si vás chce pridať do kontaktov.<b>Prijať</b>?",
|
||||
"contacts_send": "Odoslať",
|
||||
"contacts_remove": "Odstrániť kontakt",
|
||||
"contacts_typeHere": "Tu napíšte správu...",
|
||||
"contacts_padTitle": "Chat",
|
||||
"contacts_info1": "Toto sú vaše kontakty. Odtiaľto možete:",
|
||||
"contacts_info2": "Kliknite na ikonu kontaktu pre začatie chatu",
|
||||
"contacts_info3": "Dvakrát kliknite na ikonu pre zobrazenie profilu",
|
||||
"contacts_info4": "Každý z účastníkovv môže trvale zmazať históriu chatu",
|
||||
"contacts_removeHistoryTitle": "Vymazať históriu chatu",
|
||||
"contacts_confirmRemoveHistory": "Ste si istý že chcete natrvalo odstrániť históriu chatu? Dáta nemôžu byť obnovené",
|
||||
"contacts_removeHistoryServerError": "Pri odstraňovaní histórie nastala chyba. Skúste to neskôr",
|
||||
"contacts_fetchHistory": "Načítať staršiu históriu",
|
||||
"contacts_rooms": "Miestnosti",
|
||||
"contacts_leaveRoom": "Opustiť miestnosť",
|
||||
"fm_rootName": "Drive",
|
||||
"fm_trashName": "Kôš",
|
||||
"fm_filesDataName": "Všetky súbory",
|
||||
"fm_templateName": "Šablóny",
|
||||
"fm_ownedPadsName": "Vlastné",
|
||||
"fm_tagsName": "Štítky",
|
||||
"fm_sharedFolderName": "Zdieľaný priečinok",
|
||||
"fm_searchPlaceholder": "Vyhľadávanie...",
|
||||
"fm_newButton": "Nový",
|
||||
"fm_newFolder": "Nový priečinok",
|
||||
"fm_newFile": "Nový dokument",
|
||||
"ui_more": "Viac",
|
||||
"fm_folder": "Zložka",
|
||||
"fm_sharedFolder": "Zdielaná zložka",
|
||||
"fm_folderName": "Názov zložky",
|
||||
"fm_numberOfFolders": "# zložiek",
|
||||
"fm_numberOfFiles": "# súborov",
|
||||
"fm_fileName": "Názov súboru",
|
||||
"fm_type": "Typ",
|
||||
"fm_lastAccess": "Posledný prístup",
|
||||
"fm_creation": "Vytvorené",
|
||||
"fm_forbidden": "Zakázaná akcia",
|
||||
"fm_originalPath": "Pôvodná cesta",
|
||||
"fm_openParent": "Zobraziť v priečinku",
|
||||
"fm_noname": "Dokument bez názvu",
|
||||
"kanban_newBoard": "Nový stĺpec",
|
||||
"canvas_saveToDrive": "Uložiť obrázok ako súbor v CryptDrive",
|
||||
"contacts_added": "Žiadosť o kontakt prijatá.",
|
||||
"contacts_confirmRemove": "Ste si istý, že chcete odstrániť <em>{0}</em>z kontaktov?",
|
||||
"poll_removeUser": "Ste si istý, že chcete odstrániť tohto používateľa?",
|
||||
"fm_emptyTrashDialog": "Naozaj chcete vyprázdniť kôš?",
|
||||
"poll_optionPlaceholder": "Možnosť",
|
||||
"oo_reconnect": "Pripojenie k serveru je obnovené. Kliknite OK pre obnovenie stránky a pokračovanie v úpravách.",
|
||||
"profile_uploadTypeError": "Chyba: formát vašeho avatara nie je povolený. Povolené formáty sú: {0}",
|
||||
"poll_descriptionHint": "Popíšte svoju anketu a použite tlačidlo ✓ (publikovať).\nPopis sa dá napísať iba pomocou syntaxe markdown, môžete tiež vložiť médiá zo svojho CryptDrive.\nKtokoľvek s odkazom môže popis zmeniť, ale to neodporúčame.",
|
||||
"poll_comment_disabled": "Zverejnite anketu pomocou tlačidla ✓ aby boli povolené komentáre.",
|
||||
"fm_searchName": "Hľadať",
|
||||
"fm_removeSeveralPermanentlyDialog": "Ste si istý, že chcete odstrániť tieto súbory z vášho disku? Ostanú v diskoch ostatných používateľov, ktorý si ich uložili.",
|
||||
"contacts_warning": "Všetko čo sem napíšete, je trvalé a dostupné všetkým súčasným aj budúcim používateľom tohto dokumentu. Buďte opatrní pri nakladaní s citlivými informáciami!",
|
||||
"contacts_online": "Ďalší používateľ z tejto miestnosti je online",
|
||||
"fm_recentPadsName": "Nedávne",
|
||||
"fm_newButtonTitle": "Vytvorte nový dokument alebo priečinok, importujte súbor do aktuálneho priečinku.",
|
||||
"fm_removePermanentlyDialog": "Ste si istý, že chcete odstrániť túto položku zo svojho disku? Položka ostane na diskoch používateľov ktorý si ho uložili.",
|
||||
"fm_deleteOwnedPad": "Určite chcete natrvalo odstrániť tento dokument?",
|
||||
"fm_deleteOwnedPads": "Určite chcete natrvalo odstrániť tieto dokumenty?",
|
||||
"fm_restoreDialog": "Chcete obnoviť {0} na pôvodné miesto?",
|
||||
"fm_unknownFolderError": "Vybraný alebo naposledy navštívený priečinok už neexistuje. Otváram nadradený priečinok...",
|
||||
"fm_contextMenuError": "Nepodarilo sa otvoriť kontextové menu pre tento prvok. Ak problém pretrváva, skúste obnoviť stránku.",
|
||||
"fm_selectError": "Nepodarilo sa vybrať zvolený prvok. Ak problém pretrváva, skúste stránku znova načítať.",
|
||||
"fm_categoryError": "Nepodarilo sa otvoriť zvolenú kategóriu, zobrazuje sa koreňový adresár.",
|
||||
"fm_info_root": "Môžete vytvoriť ľubovolné množstvo podpriečinkov pre triedenie súborov.",
|
||||
"fm_info_template": "Tieto dokumenty sú uložené ako šablóny. Môžu sa znova použiť pri vytváraní nových dokumentov.",
|
||||
"fm_info_recent": "Tieto dokumenty boli nedávno upravené alebo otvorené vami alebo ľuďmi, s ktorými spolupracujete.",
|
||||
"fm_info_trash": "Vyprázdnite kôš pre uvoľnenie miesta na CryptDrive."
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -573,56 +573,65 @@ const factory = (Util, Hash,
|
||||
};
|
||||
|
||||
// SEARCH
|
||||
var _findFileInRoot = function (path, file) {
|
||||
var _findFileInRoot = function (path, files) {
|
||||
if (!isPathIn(path, [ROOT, TRASH])) { return []; }
|
||||
var paths = [];
|
||||
files = Array.isArray(files) ? files : [files];
|
||||
var paths = {};
|
||||
var root = find(path);
|
||||
var addPaths = function (p) {
|
||||
if (paths.indexOf(p) === -1) {
|
||||
paths.push(p);
|
||||
}
|
||||
Object.keys(p).forEach(file => {
|
||||
paths[file] ||= [];
|
||||
Array.prototype.push.apply(paths[file], p[file]);
|
||||
});
|
||||
};
|
||||
|
||||
if (isFile(root) || isSharedFolder(root)) {
|
||||
if (compareFiles(file, root)) {
|
||||
if (paths.indexOf(path) === -1) {
|
||||
paths.push(path);
|
||||
files.some(file => {
|
||||
if (compareFiles(file, root)) {
|
||||
paths[file] ||= [];
|
||||
paths[file].push(path);
|
||||
}
|
||||
}
|
||||
});
|
||||
return paths;
|
||||
}
|
||||
if (isFolder(root)) {
|
||||
for (var e in root) {
|
||||
var nPath = path.slice();
|
||||
let nPath = path.slice();
|
||||
nPath.push(e);
|
||||
_findFileInRoot(nPath, file).forEach(addPaths);
|
||||
addPaths(_findFileInRoot(nPath, files));
|
||||
}
|
||||
}
|
||||
|
||||
return paths;
|
||||
};
|
||||
exp.findFileInRoot = function (file) {
|
||||
return _findFileInRoot([ROOT], file);
|
||||
/*
|
||||
exp.findFileInRoot = function (files) {
|
||||
return _findFileInRoot([ROOT], files);
|
||||
};
|
||||
var _findFileInHrefArray = function (rootName, file) {
|
||||
if (sharedFolder) { return []; }
|
||||
if (!files[rootName]) { return []; }
|
||||
*/
|
||||
var _findFileInHrefArray = function (rootName, toFind) {
|
||||
if (sharedFolder) { return {}; }
|
||||
if (!files[rootName]) { return {}; }
|
||||
var unsorted = files[rootName].slice();
|
||||
var ret = [];
|
||||
var ret = {};
|
||||
var i = -1;
|
||||
while ((i = unsorted.indexOf(file, i+1)) !== -1){
|
||||
ret.push([rootName, i]);
|
||||
}
|
||||
toFind.forEach(file => {
|
||||
while ((i = unsorted.indexOf(file, i+1)) !== -1){
|
||||
ret[file] ||= [];
|
||||
ret[file].push([rootName, i]);
|
||||
}
|
||||
});
|
||||
return ret;
|
||||
};
|
||||
var _findFileInTrash = function (path, file) {
|
||||
var _findFileInTrash = function (path, files) {
|
||||
if (sharedFolder) { return []; }
|
||||
var root = find(path);
|
||||
var paths = [];
|
||||
var paths = {};
|
||||
var addPaths = function (p) {
|
||||
if (paths.indexOf(p) === -1) {
|
||||
paths.push(p);
|
||||
}
|
||||
Object.keys(p).forEach(file => {
|
||||
paths[file] ||= [];
|
||||
Array.prototype.push.apply(paths[file], p[file]);
|
||||
});
|
||||
};
|
||||
if (path.length === 1 && typeof(root) === 'object') {
|
||||
Object.keys(root).forEach(function (key) {
|
||||
@ -630,7 +639,7 @@ const factory = (Util, Hash,
|
||||
if (!Array.isArray(arr)) { return; }
|
||||
var nPath = path.slice();
|
||||
nPath.push(key);
|
||||
_findFileInTrash(nPath, file).forEach(addPaths);
|
||||
addPaths(_findFileInTrash(nPath, files));
|
||||
});
|
||||
}
|
||||
if (path.length === 2) {
|
||||
@ -640,24 +649,39 @@ const factory = (Util, Hash,
|
||||
nPath.push(i);
|
||||
nPath.push('element');
|
||||
if (isFile(el.element)) {
|
||||
if (compareFiles(file, el.element)) {
|
||||
addPaths(nPath);
|
||||
}
|
||||
files.some(file => {
|
||||
if (compareFiles(file, el.element)) {
|
||||
paths[file] ||= [];
|
||||
paths[file].push(nPath);
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
_findFileInTrash(nPath, file).forEach(addPaths);
|
||||
addPaths(_findFileInTrash(nPath, files));
|
||||
});
|
||||
}
|
||||
if (path.length >= 4) {
|
||||
_findFileInRoot(path, file).forEach(addPaths);
|
||||
addPaths(_findFileInRoot(path, files));
|
||||
}
|
||||
return paths;
|
||||
};
|
||||
var findFiles = exp.findFiles = function (files) {
|
||||
var rootpaths = _findFileInRoot([ROOT], files);
|
||||
var templatepaths = _findFileInHrefArray(TEMPLATE, files);
|
||||
var trashpaths = _findFileInTrash([TRASH], files);
|
||||
let res = {};
|
||||
files.forEach(file => { res[file] = []; });
|
||||
[rootpaths, templatepaths, trashpaths].forEach(r => {
|
||||
Object.keys(r).forEach(file => {
|
||||
res[file] ||= [];
|
||||
Array.prototype.push.apply(res[file], r[file]);
|
||||
});
|
||||
});
|
||||
return res;
|
||||
};
|
||||
var findFile = exp.findFile = function (file) {
|
||||
var rootpaths = _findFileInRoot([ROOT], file);
|
||||
var templatepaths = _findFileInHrefArray(TEMPLATE, file);
|
||||
var trashpaths = _findFileInTrash([TRASH], file);
|
||||
return rootpaths.concat(templatepaths, trashpaths);
|
||||
let res = findFiles([file]);
|
||||
return res[file] || [];
|
||||
};
|
||||
|
||||
// Get drive ids of files from their channel ids
|
||||
|
||||
@ -10,7 +10,6 @@ define([
|
||||
'/components/pako/dist/pako.min.js',
|
||||
'/common/common-hash.js',
|
||||
'/api/config',
|
||||
'jquery',
|
||||
], function (
|
||||
Util,
|
||||
FileCrypto,
|
||||
@ -19,7 +18,6 @@ define([
|
||||
pako,
|
||||
Hash,
|
||||
ApiConfig,
|
||||
$,
|
||||
) {
|
||||
const Nacl = window.nacl;
|
||||
const x2js = new X2JS();
|
||||
@ -82,11 +80,6 @@ define([
|
||||
}
|
||||
};
|
||||
|
||||
const xmlAsJsonContent = (xml) => {
|
||||
var decompressedXml = decompressDrawioXml(xml);
|
||||
return numbersToNumbers(x2js.xml2js(decompressedXml));
|
||||
};
|
||||
|
||||
// As described here: https://drawio-app.com/extracting-the-xml-from-mxfiles/
|
||||
const decompressDrawioXml = function(xmlDocStr) {
|
||||
var TEXT_NODE = 3;
|
||||
@ -122,6 +115,12 @@ define([
|
||||
return result;
|
||||
};
|
||||
|
||||
const xmlAsJsonContent = (xml) => {
|
||||
var decompressedXml = decompressDrawioXml(xml);
|
||||
return numbersToNumbers(x2js.xml2js(decompressedXml));
|
||||
};
|
||||
|
||||
|
||||
const parseDrawioStyle = (styleAttrValue) => {
|
||||
if (!styleAttrValue) {
|
||||
return {};
|
||||
|
||||
@ -133,6 +133,19 @@
|
||||
}
|
||||
}
|
||||
|
||||
.cp-form-iseditor {
|
||||
.cp-form-block header {
|
||||
display: flex !important;
|
||||
}
|
||||
}
|
||||
.cp-form-creator-results {
|
||||
.cp-form-block-type {
|
||||
float: right;
|
||||
margin-top: -10px;
|
||||
margin-right: -10px;
|
||||
}
|
||||
}
|
||||
|
||||
&.cp-form-readonly {
|
||||
.cp-form-creator-inline-add {
|
||||
display: none;
|
||||
@ -203,6 +216,32 @@
|
||||
//flex-wrap: wrap;
|
||||
overflow: auto;
|
||||
|
||||
.cp-drag-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
button.cp-form-view-drag {
|
||||
margin: 0;
|
||||
padding: 1px 4px;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
border: none;
|
||||
border-radius: @variables_radius 0px 0px @variables_radius;
|
||||
background-color: @cp_form-bg1;
|
||||
color: @cryptpad_text_col;
|
||||
&:focus-visible {
|
||||
outline: @variables_focus_style;
|
||||
}
|
||||
&.cp-toggle-active {
|
||||
color: @cp_form-bg1;
|
||||
background-color: @cryptpad_text_col;
|
||||
}
|
||||
}
|
||||
#cp-toggle-drag-on {
|
||||
border-radius: 0px @variables_radius @variables_radius 0px !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1000px) {
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-start;
|
||||
@ -295,7 +334,6 @@
|
||||
div.cp-form-creator-content {
|
||||
position: relative;
|
||||
.cp-form-block-type {
|
||||
margin-top: -35px;
|
||||
&.editable {
|
||||
cursor: pointer;
|
||||
}
|
||||
@ -369,6 +407,29 @@
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
flex: 1 1 1000px;
|
||||
&.cp-no-drag {
|
||||
.cp-form-block {
|
||||
.cp-form-block-arrows {
|
||||
padding-left: 5px;
|
||||
border-radius: 0px @variables_radius 0px 0px;
|
||||
display: flex;
|
||||
column-gap: 10px;
|
||||
.cp-form-arrow {
|
||||
display: block;
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
color: @cryptpad_text_col;
|
||||
&:focus-visible {
|
||||
border-radius: @variables_radius;
|
||||
outline: @variables_focus_style;
|
||||
}
|
||||
}
|
||||
}
|
||||
.cp-form-block-drag-handle {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.cp-form-creator-add-inline {
|
||||
display: flex;
|
||||
@ -560,6 +621,14 @@
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
header {
|
||||
display: none;
|
||||
justify-content: space-between;
|
||||
margin-top: -10px;
|
||||
margin-left: -10px;
|
||||
margin-right: -10px;
|
||||
}
|
||||
|
||||
.cp-form-disabled {
|
||||
.cp-form-poll-choice, .cp-form-type-sort {
|
||||
cursor: not-allowed !important;
|
||||
@ -575,18 +644,22 @@
|
||||
.cp-form-block-drag-handle {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
height: 25px;
|
||||
align-items: center;
|
||||
width: 50px;
|
||||
justify-content: center;
|
||||
padding-left: 10px;
|
||||
font-size: 20px;
|
||||
color: @cp_sidebar-hint;
|
||||
i {
|
||||
cursor: grab;
|
||||
&:first-child {
|
||||
height: 3px;
|
||||
margin-top: -10px;
|
||||
margin-bottom: 1px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.cp-form-block-arrows {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&.sortable-ghost { visibility: hidden; }
|
||||
&.sortable-drag { opacity: 0.9 !important; }
|
||||
@ -605,15 +678,19 @@
|
||||
}
|
||||
.cp-form-block-question-text {
|
||||
flex: 1;
|
||||
word-wrap: break-word;
|
||||
overflow: hidden;
|
||||
}
|
||||
.cp-form-required-tag {
|
||||
padding: 5px;
|
||||
margin-top: -10px;
|
||||
margin-right: -10px;
|
||||
&.cp-is-empty {
|
||||
height: fit-content;
|
||||
padding: 3px;
|
||||
border: 2px solid @cryptpad_color_red;
|
||||
color: @cp_form-invalid;
|
||||
border-radius: 0 @variables_radius 0 0;
|
||||
background-color: @cp_alerts-danger-bg;
|
||||
color: @cp_alerts-danger-text;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -963,10 +1040,10 @@
|
||||
}
|
||||
}
|
||||
.cp-form-block-type {
|
||||
float: right;
|
||||
//float: right;
|
||||
padding: 5px;
|
||||
margin-top: -10px;
|
||||
margin-right: -10px;
|
||||
//margin-top: -10px;
|
||||
//margin-right: -10px;
|
||||
border-radius: 0px @variables_radius 0px 0px;
|
||||
i { margin-right: 5px; }
|
||||
background: fade(@cryptpad_text_col, 10%);
|
||||
|
||||
@ -215,8 +215,8 @@ define([
|
||||
formData = Utils.Hash.getFormData(Utils.secret);
|
||||
keys = Utils.secret && Utils.secret.keys;
|
||||
}
|
||||
privateKey = formData.form_private;
|
||||
publicKey = formData.form_public;
|
||||
privateKey = formData?.form_private;
|
||||
publicKey = formData?.form_public;
|
||||
var curvePrivate = privateKey || data.privateKey;
|
||||
if (!curvePrivate) { return void cb({error: 'EFORBIDDEN'}); }
|
||||
var crypto = Utils.Crypto.Mailbox.createEncryptor({
|
||||
|
||||
@ -3565,7 +3565,7 @@ define([
|
||||
});
|
||||
var $send = $(send).click(function () {
|
||||
if (!$radio.find('input[type="radio"]:checked').length) {
|
||||
return UI.warn(Messages.answerType_error);
|
||||
return UI.warn(Messages.form_answerType_error);
|
||||
}
|
||||
|
||||
var results = getFormResults();
|
||||
@ -3765,8 +3765,8 @@ define([
|
||||
}
|
||||
});
|
||||
$body.addClass('cp-form-palette-'+color);
|
||||
|
||||
$container.attr('class', 'cp-form-creator-content'+(APP.isEditor? ' cp-form-iseditor': ''));
|
||||
var containerDragClass = ('ontouchstart' in window || APP.drag === false) ? ' cp-no-drag' : '';
|
||||
$container.attr('class', 'cp-form-creator-content'+(APP.isEditor? ' cp-form-iseditor': '')+ containerDragClass);
|
||||
|
||||
if (APP.isClosed && content.answers.privateKey && !APP.isEditor && !APP.hasAnswered) {
|
||||
var sframeChan = framework._.sfCommon.getSframeChannel();
|
||||
@ -3894,7 +3894,7 @@ define([
|
||||
var updateAddInline = APP.updateAddInline = function () {
|
||||
$container.find('.cp-form-creator-add-inline').remove();
|
||||
// Add before existing question
|
||||
$container.find('.cp-form-block:not(.nodrag)').each(function (i, el) {
|
||||
$container.find('.cp-form-block:not(.cp-form-submit-message)').each(function (i, el) {
|
||||
var $el = $(el);
|
||||
var uid = $el.attr('data-id');
|
||||
$el.before(getFormCreator(uid));
|
||||
@ -4009,13 +4009,47 @@ define([
|
||||
|
||||
|
||||
var changeType;
|
||||
let shiftButtons;
|
||||
if (editable) {
|
||||
// Drag handle
|
||||
dragHandle = h('span.cp-form-block-drag-handle', [
|
||||
h('i.fa.fa-ellipsis-h'),
|
||||
h('i.fa.fa-ellipsis-h'),
|
||||
// Arrows
|
||||
var upButton = h('button.cp-form-arrow', {
|
||||
'data-notippy':1,
|
||||
'title': Messages.moveItemUp,
|
||||
'aria-label': Messages.moveItemUp
|
||||
}, [h('i.fa.fa-arrow-up', {'aria-hidden': true})]);
|
||||
var downButton = h('button.cp-form-arrow', {
|
||||
'data-notippy':1,
|
||||
'title': Messages.moveItemDown,
|
||||
'aria-label': Messages.moveItemDown
|
||||
}, [h('i.fa.fa-arrow-down', {'aria-hidden': true})]);
|
||||
var shiftBlock = function(direction) {
|
||||
var blockIndex = content.order.indexOf(uid);
|
||||
if (direction === 'up' && blockIndex > 0) {
|
||||
content.order.splice(blockIndex-1, 0, content.order.splice(blockIndex, 1)[0]);
|
||||
updateForm(framework, content, true);
|
||||
framework.localChange();
|
||||
} else if (direction === 'down' && blockIndex < content.order.length-1) {
|
||||
content.order.splice(blockIndex+1, 0, content.order.splice(blockIndex, 1)[0]);
|
||||
updateForm(framework, content, true);
|
||||
framework.localChange();
|
||||
}
|
||||
};
|
||||
$(upButton).click(function () {
|
||||
shiftBlock('up');
|
||||
});
|
||||
$(downButton).click(function () {
|
||||
shiftBlock('down');
|
||||
});
|
||||
shiftButtons = h('div.cp-form-block-arrows', [
|
||||
upButton,
|
||||
downButton
|
||||
]);
|
||||
|
||||
|
||||
// Drag handle
|
||||
var dragEllipses = [h('i.fa.fa-ellipsis-h'), h('i.fa.fa-ellipsis-h')];
|
||||
dragHandle = h('span.cp-form-block-drag-handle', dragEllipses);
|
||||
|
||||
// Question
|
||||
var inputQ = h('input', {
|
||||
value: block.q || Messages.form_default
|
||||
@ -4251,13 +4285,18 @@ define([
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var editableCls = editable ? ".editable" : "";
|
||||
elements.push(h('div.cp-form-block'+editableCls, {
|
||||
var draggable = APP.drag ? '' : '.nodrag';
|
||||
elements.push(h('div.cp-form-block'+editableCls+draggable, {
|
||||
'data-id':uid,
|
||||
'data-type':type
|
||||
}, [
|
||||
APP.isEditor ? dragHandle : undefined,
|
||||
changeType,
|
||||
h('header', [
|
||||
APP.isEditor ? dragHandle : undefined,
|
||||
shiftButtons,
|
||||
changeType
|
||||
]),
|
||||
isStatic ? undefined : q,
|
||||
h('div.cp-form-block-content', [
|
||||
APP.isEditor && !isStatic ? requiredDiv : undefined,
|
||||
@ -4536,6 +4575,8 @@ define([
|
||||
}
|
||||
}
|
||||
});
|
||||
APP.mainSortable.options.disabled = 'ontouchstart' in window ? true : false;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -5102,9 +5143,37 @@ define([
|
||||
editableStr
|
||||
]);
|
||||
|
||||
var toggleOffclass = 'ontouchstart' in window ? 'cp-toggle-active' : undefined;
|
||||
var toggleOnclass = 'ontouchstart' in window ? undefined : 'cp-toggle-active';
|
||||
var toggleDragOff = h(`button#cp-toggle-drag-off.cp-form-view-drag.${toggleOffclass}.fa.fa-arrows`, {'title': Messages.toggleArrows, 'tabindex': 0});
|
||||
var toggleDragOn = h(`button#cp-toggle-drag-on.cp-form-view-drag.${toggleOnclass}.fa.fa-hand-o-up`, {'title': Messages.toggleDrag, 'tabindex': 0});
|
||||
const updateDrag = state => {
|
||||
return function () {
|
||||
var $container = $('.cp-form-creator-content');
|
||||
$(toggleDragOn).toggleClass('cp-toggle-active', state);
|
||||
$(toggleDragOff).toggleClass('cp-toggle-active', !state);
|
||||
APP.mainSortable.options.disabled = !state;
|
||||
APP.drag = state;
|
||||
if (state) {
|
||||
$container.removeClass('cp-no-drag');
|
||||
} else {
|
||||
$container.addClass('cp-no-drag');
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
$(toggleDragOn).click(updateDrag(true));
|
||||
$(toggleDragOff).click(updateDrag(false));
|
||||
|
||||
var drag = h('div.cp-drag-container', [
|
||||
toggleDragOff,
|
||||
toggleDragOn
|
||||
]);
|
||||
|
||||
return [
|
||||
preview,
|
||||
previewSettings,
|
||||
drag,
|
||||
colorTheme
|
||||
];
|
||||
};
|
||||
@ -5220,7 +5289,7 @@ define([
|
||||
fillerContainer = h('div.cp-form-filler-container');
|
||||
}
|
||||
|
||||
var contentContainer = h('div.cp-form-creator-content' + (APP.isEditor ? '.cp-form-iseditor' : ''));
|
||||
var contentContainer = h('div.cp-form-creator-content' + (APP.isEditor ? '.cp-form-iseditor' : '') + ('ontouchstart' in window ? '.cp-no-drag' : ''));
|
||||
var resultsContainer = h('div.cp-form-creator-results');
|
||||
var answeredContainer = h('div.cp-form-creator-answered', {
|
||||
style: 'display: none;'
|
||||
@ -5490,7 +5559,7 @@ define([
|
||||
var editButtons = h('div.cp-form-edit-buttons-container', [ preview, edit, del ]);
|
||||
|
||||
var editDiv, previewDiv;
|
||||
var div = h('div.cp-form-block.editable.nodrag', [
|
||||
var div = h('div.cp-form-block.editable.nodrag.cp-form-submit-message', [
|
||||
h('div.cp-form-block-content', [
|
||||
p,
|
||||
editDiv = h('div.cp-form-response-modal', t),
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
background-color: @palette0;
|
||||
color: @cryptpad_color_grey_800;
|
||||
border-radius: @variables_radius @variables_radius 0px 0px;
|
||||
button.kanban-edit-item {
|
||||
button.kanban-edit-item, .cp-kanban-arrow {
|
||||
color: @cryptpad_color_grey_800;
|
||||
}
|
||||
}
|
||||
@ -177,8 +177,7 @@
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.kanban-edit-item {
|
||||
padding: 5px;
|
||||
.kanban-edit-item, .cp-kanban-arrow {
|
||||
border: 0;
|
||||
background: transparent;
|
||||
align-self: flex-start;
|
||||
@ -187,15 +186,27 @@
|
||||
&:focus-visible {
|
||||
outline: @variables_focus_style;
|
||||
}
|
||||
@media (hover: none) {
|
||||
margin-right: 20px;
|
||||
}
|
||||
@media(max-width:500px) or (max-height:700px)
|
||||
{
|
||||
margin-right:0px;
|
||||
}
|
||||
}
|
||||
|
||||
.item-icon-container{ // Board arrows
|
||||
display: flex;
|
||||
width: 100%;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.item-arrow-container { // Card arrows
|
||||
width: 100%;
|
||||
margin-top: 0.25rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
|
||||
.cp-kanban-cursors {
|
||||
&:empty { display: none; }
|
||||
order: 2;
|
||||
@ -221,6 +232,7 @@
|
||||
}
|
||||
.kanban-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 5px;
|
||||
@ -230,8 +242,10 @@
|
||||
box-shadow: @cryptpad_ui_shadow;
|
||||
.tools_unselectable();
|
||||
touch-action: none;
|
||||
cursor: move;
|
||||
cursor: grab;
|
||||
&:not(.no-drag) {
|
||||
cursor: move;
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
margin-bottom: 5px;
|
||||
&:last-child {
|
||||
@ -308,10 +322,12 @@
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
.kanban-item-text {
|
||||
.kanban-item-text-container, .kanban-item-text {
|
||||
width: 100%;
|
||||
.tools_unselectable();
|
||||
cursor: text;
|
||||
overflow-wrap: anywhere;
|
||||
display: flex;
|
||||
flex: 1;
|
||||
&:empty::before {
|
||||
content: "\200b";
|
||||
@ -321,6 +337,9 @@
|
||||
padding: 0;
|
||||
height: auto;
|
||||
}
|
||||
.kanban-item-text {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
&.kanban-item-hidden {
|
||||
display: none;
|
||||
@ -354,9 +373,6 @@
|
||||
overflow-y: auto;
|
||||
justify-content: space-around;
|
||||
min-height: 38px; // Size of one card
|
||||
@media (hover: none) {
|
||||
padding-right: 30px;
|
||||
}
|
||||
@media(max-width:500px) or (max-height:700px)
|
||||
{
|
||||
padding-right:5px;
|
||||
@ -367,8 +383,10 @@
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
padding: 5px 10px;
|
||||
cursor: move;
|
||||
cursor: grab;
|
||||
&:not(.no-drag) {
|
||||
cursor: move;
|
||||
cursor: grab;
|
||||
}
|
||||
.kanban-title-board {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
@ -504,13 +522,21 @@
|
||||
right: 10px;
|
||||
height: 30px;
|
||||
width: 60px;
|
||||
span {
|
||||
&.drag {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
button {
|
||||
border: 0;
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
margin: 0;
|
||||
padding: 1px 4px;
|
||||
line-height: 30px;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
background-color: @board-bg;
|
||||
color: @cp_kanban-fg !important;
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
background-color: darken(@board-bg, 10%);
|
||||
@ -521,6 +547,9 @@
|
||||
&:last-child {
|
||||
border-radius: 0px @variables_radius @variables_radius 0px;
|
||||
}
|
||||
&:focus-visible {
|
||||
outline: @variables_focus_style;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -528,23 +557,19 @@
|
||||
&:not(.cp-kanban-quick) {
|
||||
#cp-kanban-controls {
|
||||
.cp-kanban-changeView {
|
||||
span.cp-kanban-view {
|
||||
background-color: @cp_kanban-fg !important;
|
||||
color: @cp_app-bg;
|
||||
button.cp-kanban-view {
|
||||
background-color: @cp_kanban-fg;
|
||||
color: @cp_app-bg !important;
|
||||
}
|
||||
// span.cp-kanban-view-small {
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
&.cp-kanban-quick {
|
||||
#cp-kanban-controls {
|
||||
.cp-kanban-changeView {
|
||||
// span.cp-kanban-view {
|
||||
// }
|
||||
span.cp-kanban-view-small {
|
||||
background-color: @cp_kanban-fg !important;
|
||||
color: @cp_app-bg;
|
||||
button.cp-kanban-view-small {
|
||||
background-color: @cp_kanban-fg;
|
||||
color: @cp_app-bg !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -554,6 +579,18 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
button.cp-kanban-view-drag {
|
||||
&:focus-visible {
|
||||
outline: @variables_focus_style;
|
||||
}
|
||||
&.cp-toggle-active {
|
||||
background-color: @cp_kanban-fg;
|
||||
color: @cp_app-bg !important;
|
||||
}
|
||||
&.cp-toggle-inactive {
|
||||
color: @cp_kanban-fg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#cp-app-kanban-content {
|
||||
|
||||
@ -151,6 +151,7 @@ define([
|
||||
};
|
||||
|
||||
var addEditItemButton = function () {};
|
||||
var addMoveElementButton = function () {};
|
||||
|
||||
var onRemoteChange = Util.mkEvent();
|
||||
var now = function () { return +new Date(); };
|
||||
@ -161,6 +162,7 @@ define([
|
||||
kanban.setBoards(Util.clone(boards));
|
||||
kanban.inEditMode = false;
|
||||
addEditItemButton(framework, kanban);
|
||||
addMoveElementButton(framework, kanban);
|
||||
restoreCursor(cursor);
|
||||
onRemoteChange.fire();
|
||||
};
|
||||
@ -540,6 +542,140 @@ define([
|
||||
UI.openCustomModal(editModal.modal);
|
||||
};
|
||||
|
||||
addMoveElementButton = function (framework, kanban) {
|
||||
if (!kanban) { return; }
|
||||
if (framework.isReadOnly() || framework.isLocked()) { return; }
|
||||
var $container = $(kanban.element);
|
||||
var drag = kanban.drag;
|
||||
kanban.options.dragBoards = drag;
|
||||
kanban.options.dragItems = drag;
|
||||
$container.find('.kanban-board').each(function (i, el) {
|
||||
$(el).find('.item-icon-container').remove();
|
||||
$(el).find('.kanban-board-header').removeClass('no-drag');
|
||||
});
|
||||
$container.find('.kanban-item').each(function (i, el) {
|
||||
$(el).find('.item-arrow-container').remove();
|
||||
$(el).removeClass('no-drag');
|
||||
});
|
||||
if (drag === false) {
|
||||
var move = function (arr, oldIndex, newIndex) {
|
||||
arr.splice(newIndex, 0, arr.splice(oldIndex, 1)[0]);
|
||||
_updateBoards(framework, kanban, kanban.options.boards, false);
|
||||
};
|
||||
|
||||
var moveBetweenBoards = function (nextBoardItems, elId, boardItems, index, boards) {
|
||||
nextBoardItems.unshift(elId);
|
||||
boardItems.splice(index, 1);
|
||||
_updateBoards(framework, kanban, boards, false);
|
||||
$(`.kanban-item[data-eid="${elId}"]`)[0].scrollIntoView();
|
||||
};
|
||||
|
||||
var shiftItem = function (direction, el) {
|
||||
var board = $(el).closest('.kanban-board');
|
||||
var boards = kanban.options.boards;
|
||||
var elId = parseInt($(el).attr("data-eid"));
|
||||
var boardId = parseInt($(board).attr("data-id"));
|
||||
var boardItems = boards.data[boardId].item;
|
||||
var index = boardItems.indexOf(elId);
|
||||
var boardIndex = boards.list.indexOf(parseInt(boardId));
|
||||
let nextBoardItems;
|
||||
|
||||
if (direction === 'up' && index > 0) {
|
||||
move(boardItems, index, index-1);
|
||||
} else if (direction === 'down' && index < boardItems.length-1) {
|
||||
move(boardItems, index, index+1);
|
||||
} else if (direction === 'left' && boardIndex > 0) {
|
||||
nextBoardItems = boards.data[boards.list[boardIndex-1]].item;
|
||||
moveBetweenBoards(nextBoardItems, elId, boardItems, index, boards, boardId);
|
||||
} else if (direction === 'right' && boardIndex < kanban.options.boards.list.length-1){
|
||||
nextBoardItems = boards.data[boards.list[boardIndex+1]].item;
|
||||
moveBetweenBoards(nextBoardItems, elId, boardItems, index, boards, boardId);
|
||||
}
|
||||
};
|
||||
|
||||
var shiftBoards = function (direction, el) {
|
||||
var elId = $(el).attr("data-id");
|
||||
var index = kanban.options.boards.list.indexOf(parseInt(elId));
|
||||
if (direction === 'left' && index > 0) {
|
||||
move(kanban.options.boards.list, index, index-1);
|
||||
} else if (direction === 'right' && index < kanban.options.boards.list.length-1) {
|
||||
move(kanban.options.boards.list, index, index+1);
|
||||
}
|
||||
$(`.kanban-board[data-id="${elId}"]`)[0].scrollIntoView();
|
||||
};
|
||||
$container.find('.kanban-board').each(function (i, el) {
|
||||
$(el).find('.kanban-board-header').addClass('no-drag');
|
||||
var arrowContainer = h('div.item-icon-container');
|
||||
$(arrowContainer).appendTo($(el).find('.kanban-board-header'));
|
||||
$(h('button', {
|
||||
'class': 'cp-kanban-arrow board-arrow',
|
||||
'title': Messages.kanban_moveBoardLeft,
|
||||
'aria-label': Messages.kanban_moveBoardLeft
|
||||
}, [
|
||||
h('i.fa.fa-arrow-left', {'aria-hidden': true})
|
||||
])).click(function () {
|
||||
shiftBoards('left', el);
|
||||
}).appendTo(arrowContainer);
|
||||
$(h('button', {
|
||||
'class': 'cp-kanban-arrow board-arrow',
|
||||
'title': Messages.kanban_moveBoardRight,
|
||||
'aria-label': Messages.kanban_moveBoardRight
|
||||
}, [
|
||||
h('i.fa.fa-arrow-right', {'aria-hidden': true})
|
||||
])).click(function () {
|
||||
shiftBoards('right', el);
|
||||
}).appendTo(arrowContainer);
|
||||
});
|
||||
$container.find('.kanban-item').each(function (i, el) {
|
||||
$(el).addClass('no-drag');
|
||||
var arrowContainerItem = h('div.item-arrow-container');
|
||||
$(arrowContainerItem).appendTo((el));
|
||||
$(h('button', {
|
||||
'data-notippy':1,
|
||||
'class': 'cp-kanban-arrow item-arrow',
|
||||
'title': Messages.moveItemLeft,
|
||||
'aria-label': Messages.moveItemLeft
|
||||
}, [
|
||||
h('i.fa.fa-arrow-left', {'aria-hidden': true})
|
||||
])).click(function () {
|
||||
shiftItem('left', el);
|
||||
}).appendTo(arrowContainerItem);
|
||||
var centralArrowContainerItem = h('div.item-central-arrow-container');
|
||||
$(centralArrowContainerItem).appendTo(arrowContainerItem);
|
||||
$(h('button', {
|
||||
'data-notippy':1,
|
||||
'class': 'cp-kanban-arrow item-arrow',
|
||||
'title': Messages.moveItemDown,
|
||||
'aria-label': Messages.moveItemDown
|
||||
}, [
|
||||
h('i.fa.fa-arrow-down', {'aria-hidden': true})
|
||||
])).click(function () {
|
||||
shiftItem('down', el);
|
||||
}).appendTo(centralArrowContainerItem);
|
||||
$(h('button', {
|
||||
'data-notippy':1,
|
||||
'class': 'cp-kanban-arrow item-arrow',
|
||||
'title': Messages.moveItemUp,
|
||||
'aria-label': Messages.moveItemUp
|
||||
}, [
|
||||
h('i.fa.fa-arrow-up', {'aria-hidden': true})
|
||||
])).click(function () {
|
||||
shiftItem('up', el);
|
||||
}).appendTo(centralArrowContainerItem);
|
||||
$(h('button', {
|
||||
'data-notippy':1,
|
||||
'class': 'cp-kanban-arrow item-arrow',
|
||||
'title': Messages.moveItemRight,
|
||||
'aria-label': Messages.moveItemRight
|
||||
}, [
|
||||
h('i.fa.fa-arrow-right', {'aria-hidden': true})
|
||||
])).click(function () {
|
||||
shiftItem('right', el);
|
||||
}).appendTo(arrowContainerItem);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
addEditItemButton = function (framework, kanban) {
|
||||
if (!kanban) { return; }
|
||||
if (framework.isReadOnly() || framework.isLocked()) { return; }
|
||||
@ -547,20 +683,26 @@ define([
|
||||
$container.find('.kanban-edit-item').remove();
|
||||
$container.find('.kanban-item').each(function (i, el) {
|
||||
var itemId = $(el).attr('data-eid');
|
||||
$('<button>', {
|
||||
'class': 'kanban-edit-item fa fa-pencil',
|
||||
'alt': Messages.kanban_editCard,
|
||||
}).click(function (e) {
|
||||
$(h('button', {
|
||||
'class': 'kanban-edit-item',
|
||||
'title': Messages.kanban_editCard,
|
||||
'aria-label': Messages.kanban_editCard
|
||||
}, [
|
||||
h('i.fa.fa-pencil', {'aria-hidden': true})
|
||||
])).click(function (e) {
|
||||
getItemEditModal(framework, kanban, itemId);
|
||||
e.stopPropagation();
|
||||
}).insertAfter($(el).find('.kanban-item-text'));
|
||||
});
|
||||
$container.find('.kanban-board').each(function (i, el) {
|
||||
var itemId = $(el).attr('data-id');
|
||||
$('<button>', {
|
||||
'class': 'kanban-edit-item fa fa-pencil',
|
||||
'alt': Messages.kanban_editBoard,
|
||||
}).click(function (e) {
|
||||
$(h('button', {
|
||||
'class': 'kanban-edit-item',
|
||||
'title': Messages.kanban_editBoard,
|
||||
'aria-label': Messages.kanban_editBoard
|
||||
}, [
|
||||
h('i.fa.fa-pencil', {'aria-hidden': true})
|
||||
])).click(function (e) {
|
||||
getBoardEditModal(framework, kanban, itemId);
|
||||
e.stopPropagation();
|
||||
}).appendTo($(el).find('.kanban-board-header'));
|
||||
@ -665,6 +807,7 @@ define([
|
||||
buttonContent: '❌',
|
||||
readOnly: framework.isReadOnly() || framework.isLocked(),
|
||||
tagsAnd: _tagsAnd,
|
||||
dragItems: true,
|
||||
refresh: function () {
|
||||
onRedraw.fire();
|
||||
},
|
||||
@ -673,6 +816,7 @@ define([
|
||||
framework.localChange();
|
||||
if (kanban) {
|
||||
addEditItemButton(framework, kanban);
|
||||
addMoveElementButton(framework, kanban);
|
||||
}
|
||||
},
|
||||
click: function (el) {
|
||||
@ -847,6 +991,7 @@ define([
|
||||
item.tags = kanban.options.tags;
|
||||
}
|
||||
kanban.addElement(boardId, item, isTop);
|
||||
addMoveElementButton(framework, kanban);
|
||||
};
|
||||
$input.blur(save);
|
||||
$input.keydown(function (e) {
|
||||
@ -930,8 +1075,8 @@ define([
|
||||
var $cContainer = $('#cp-app-kanban-container');
|
||||
var addControls = function () {
|
||||
// Quick or normal mode
|
||||
var small = h('span.cp-kanban-view-small.fa.fa-minus');
|
||||
var big = h('span.cp-kanban-view.fa.fa-bars');
|
||||
var small = h('button.cp-kanban-view-small.fa.fa-minus');
|
||||
var big = h('button.cp-kanban-view.fa.fa-bars');
|
||||
$(small).click(function () {
|
||||
if ($cContainer.hasClass('cp-kanban-quick')) { return; }
|
||||
$cContainer.addClass('cp-kanban-quick');
|
||||
@ -990,6 +1135,7 @@ define([
|
||||
kanban.options.tags = t;
|
||||
kanban.setBoards(kanban.options.boards);
|
||||
addEditItemButton(framework, kanban);
|
||||
addMoveElementButton(framework, kanban);
|
||||
};
|
||||
|
||||
var redrawList = function (allTags) {
|
||||
@ -1040,7 +1186,7 @@ define([
|
||||
commitTags();
|
||||
});
|
||||
|
||||
let toggleTagsButton = h('button.btn.btn-default.cp-kanban-toggle-tags', [
|
||||
let toggleTagsButton = h('button.btn.btn-default-alt.cp-kanban-toggle-tags', [
|
||||
h('i.fa.fa-tags'),
|
||||
h('span', Messages.fm_tagsName)
|
||||
]);
|
||||
@ -1053,8 +1199,8 @@ define([
|
||||
$tags.toggle();
|
||||
let visible = $tags.is(':visible');
|
||||
$(toggleContainer).toggleClass('cp-kanban-container-flex', !visible);
|
||||
$toggleBtn.toggleClass('btn-default', visible);
|
||||
$toggleBtn.toggleClass('btn-default-alt', !visible);
|
||||
$toggleBtn.toggleClass('btn-default-alt', visible);
|
||||
$toggleBtn.toggleClass('btn-default', !visible);
|
||||
};
|
||||
$toggleBtn.click(function() {
|
||||
toggleClicked = true;
|
||||
@ -1080,9 +1226,29 @@ define([
|
||||
|
||||
$(window).on('resize', resizeTags);
|
||||
|
||||
var toggleOffclass = 'ontouchstart' in window ? 'cp-toggle-active' : 'cp-toggle-inactive';
|
||||
var toggleOnclass = 'ontouchstart' in window ? 'cp-toggle-inactive' : 'cp-toggle-active';
|
||||
var toggleDragOff = h(`button#toggle-drag-off.cp-kanban-view-drag.${toggleOffclass}.fa.fa-arrows`, {'title': Messages.toggleArrows, 'tabindex': 0});
|
||||
var toggleDragOn = h(`button#toggle-drag-on.cp-kanban-view-drag.${toggleOnclass}.fa.fa-hand-o-up`, {'title': Messages.toggleDrag, 'tabindex': 0});
|
||||
kanban.drag = 'ontouchstart' in window ? false : true;
|
||||
const updateDrag = state => {
|
||||
return function () {
|
||||
$(toggleDragOn).toggleClass('cp-toggle-active', state).toggleClass('cp-toggle-inactive', !state);
|
||||
$(toggleDragOff).toggleClass('cp-toggle-active', !state).toggleClass('cp-toggle-inactive', state);
|
||||
kanban.drag = state;
|
||||
addMoveElementButton(framework, kanban);
|
||||
};
|
||||
};
|
||||
$(toggleDragOn).click(updateDrag(true));
|
||||
$(toggleDragOff).click(updateDrag(false));
|
||||
|
||||
var container = h('div#cp-kanban-controls', [
|
||||
toggleContainer,
|
||||
tags,
|
||||
h('div.cp-kanban-changeView.drag', [
|
||||
toggleDragOff,
|
||||
toggleDragOn
|
||||
]),
|
||||
h('div.cp-kanban-changeView', [
|
||||
small,
|
||||
big
|
||||
@ -1196,6 +1362,7 @@ define([
|
||||
if (!kanban) { return; }
|
||||
if (unlocked) {
|
||||
addEditItemButton(framework, kanban);
|
||||
addMoveElementButton(framework, kanban);
|
||||
kanban.options.readOnly = false;
|
||||
return void $container.removeClass('cp-app-readonly');
|
||||
}
|
||||
@ -1300,6 +1467,7 @@ define([
|
||||
if (!kanban) {
|
||||
kanban = initKanban(framework, (newContent || {}).content);
|
||||
addEditItemButton(framework, kanban);
|
||||
addMoveElementButton(framework, kanban);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -44,7 +44,7 @@ define([
|
||||
getTextColor: function () { return '#000'; },
|
||||
cursors: {},
|
||||
tags: [],
|
||||
dragBoards: true,
|
||||
dragBoards: 'ontouchstart' in window ? false : true,
|
||||
addItemButton: false,
|
||||
readOnly: false,
|
||||
dragEl: function (/*el, source*/) {},
|
||||
@ -345,6 +345,7 @@ define([
|
||||
moves: function (el) {
|
||||
if (self.options.readOnly) { return false; }
|
||||
if (el.classList.contains('new-item')) { return false; }
|
||||
if (self.options.dragItems === false) {return false;}
|
||||
return el.classList.contains('kanban-item');
|
||||
},
|
||||
accepts: function () {
|
||||
@ -538,11 +539,15 @@ define([
|
||||
var el = self.options.getAvatar(c);
|
||||
nodeCursors.appendChild(el);
|
||||
});
|
||||
var nodeItemText = document.createElement('div');
|
||||
var nodeItemTextContainer = document.createElement('div');
|
||||
nodeItemTextContainer.classList.add('kanban-item-text-container');
|
||||
nodeItem.appendChild(nodeItemTextContainer);
|
||||
var nodeItemText = document.createElement('div');
|
||||
nodeItemText.classList.add('kanban-item-text');
|
||||
nodeItemText.dataset.eid = element.id;
|
||||
nodeItemText.innerText = element.title;
|
||||
nodeItem.appendChild(nodeItemText);
|
||||
nodeItemTextContainer.appendChild(nodeItemText);
|
||||
|
||||
// Check if this card is filtered out
|
||||
if (Array.isArray(self.options.tags) && self.options.tags.length) {
|
||||
var hide;
|
||||
@ -706,6 +711,7 @@ define([
|
||||
//content board
|
||||
var contentBoard = document.createElement('main');
|
||||
contentBoard.classList.add('kanban-drag');
|
||||
contentBoard.setAttribute('tabindex', '-1');
|
||||
//add drag to array for dragula
|
||||
self.boardContainer.push(contentBoard);
|
||||
(board.item || []).forEach(function (itemkey) {
|
||||
|
||||
@ -902,7 +902,7 @@ define([
|
||||
|
||||
var todo = function () {
|
||||
var val = parseInt($input.val());
|
||||
if (typeof(val) !== 'number' || isNaN(val)) { return UI.warn(Messages.limit_error); }
|
||||
if (typeof(val) !== 'number' || isNaN(val)) { return UI.warn(Messages.error_limit); }
|
||||
if (val === oldVal) { return; }
|
||||
spinner.spin();
|
||||
common.setAttribute(['general', 'mediatag-size'], val, function (err) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user