Merge branch 'update-icons' into spinner-animation

This commit is contained in:
DianaXWiki 2025-09-16 17:54:05 +03:00
commit 8f2f0b1737
54 changed files with 432 additions and 124 deletions

View File

@ -89,10 +89,9 @@ body:
label: Version
description: What version of CryptPad are you running?
options:
- 2025.6.0
- 2025.3.1
- 2025.3.0
- 2024.12.0
- 2024.9.1
- 2024.9.0
- Other
validations:
required: true

39
.github/workflows/test-trigger.yml vendored Normal file
View File

@ -0,0 +1,39 @@
# SPDX-FileCopyrightText: 2025 2023 XWiki CryptPad Team <contact@cryptpad.org> and contributors
#
# SPDX-License-Identifier: AGPL-3.0-or-later
name: Trigger E2E tests
on:
push:
branches: [ staging, 2025.9-rc, 2025.9-test ]
jobs:
trigger-tests:
if: github.ref_name == 'staging'
runs-on: ubuntu-latest
steps:
- name: Trigger E2E test run (local)
run: |
branch="${GITHUB_REF_NAME}"
if [ "$branch" = "staging" ]; then
event_type="trigger-e2e-tests-staging"
elif [ "$branch" = "2025.9-rc" ]; then
event_type="trigger-e2e-tests-rc"
elif [ "$branch" = "2025.9-test" ]; then
event_type="trigger-e2e-tests-test"
fi
repo_owner="cryptpad"
repo_name="e2e-test-suite"
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.TEST_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/cryptpad/e2e-test-suite/dispatches \
-d "{\"event_type\": \"$event_type\", \"client_payload\": {\"service\": \"$service\", \"version\": \"$version\", \"unit\": false, \"integration\": true}}"

View File

@ -293,8 +293,3 @@ media-tag button.btn b {
overflow: hidden;
text-overflow: ellipsis;
}
media-tag button.btn .fa {
display: inline;
margin-right: 5px;
flex: 0;
}

View File

@ -82,7 +82,6 @@ define([
href: ref,
role: 'button',
};
var iconName = '';
if (!/^\//.test(ref)) {
attrs.target = '_blank';
attrs.rel = 'noopener noreferrer';

View File

@ -40,15 +40,9 @@
position: relative;
.cp-avatar-default, media-tag {
display: inline-flex;
width: @avatar-width;
width: var(--avatar-width);
height: @avatar-width;
height: var(--avatar-width);
border-radius: @variables_radius;
justify-content: center;
align-items: center;
overflow: hidden;

View File

@ -321,6 +321,9 @@
outline: @variables_focus_style;
border-radius: @variables_radius;
}
svg {
margin: 0;
}
}
}
}
@ -368,8 +371,8 @@
}
svg {
margin: 0;
height: 1.5rem;
width: 1.5rem;
width: @variables_icon_width;
height: @variables_icon_height;
}
}
}

View File

@ -729,6 +729,12 @@
display: flex;
align-items: center;
border-radius: @variables_radius;
&.cp-app-drive-element-row:not(.cp-app-drive-element-header) {
svg * {
stroke-width: 1.5;
vector-effect: non-scaling-stroke;
}
}
input {
border: 1px solid transparent;
margin: 0;
@ -933,6 +939,11 @@
#cp-app-drive-content-folder {
padding-right: 10px;
flex: 1;
.cp-app-drive-element-row.cp-app-drive-element-file > svg.lucide *,
.cp-app-drive-element-row.cp-app-drive-element-folder > svg.lucide * {
stroke-width: 3.5;
vector-effect: non-scaling-stroke;
}
}
#cp-app-drive-new-ghost-dialog.cp-modal-container {
@ -947,12 +958,14 @@
li, li svg.lucide {
cursor: pointer;
border-radius: @variables_radius;
stroke-width: 1.7;
vector-effect: non-scaling-stroke;
&:focus {
outline: @cryptpad_color_brand solid 2px;
}
}
li svg.lucide * {
stroke-width: 3.5;
vector-effect: non-scaling-stroke;
}
ul {
display: flex;
flex-wrap: wrap;

View File

@ -294,8 +294,8 @@ body.html {
display: flex;
align-items: center;
img {
width: 1.3em;
height: 1.3em;
width: @variables_icon_width;
height: @variables_icon_height;
margin-right: 10px;
}
&.cp-back-home {

View File

@ -29,13 +29,14 @@
.cp-notification {
min-height: @notif-height;
display: flex;
align-items: center;
svg {
margin: 0;
}
.cp-broadcast {
margin: 0.5rem;
width: 2rem;
height: 2rem;
width: var(--avatar-width);
height: var(--avatar-width);
color: @cp_dropdown-fg;
&.preview:not(.lucide-calendar-days) {
color: @cryptpad_color_red;

View File

@ -102,8 +102,8 @@
color: contrast(@cp_token-fg, darken(@cp_token-fg, 10%), lighten(@cp_token-fg, 10%));
}
svg {
width: 1rem;
height: 1rem;
width: @variables_icon_width;
height: @variables_icon_height;
margin: 0;
}
}

View File

@ -267,9 +267,9 @@
//background: @pos-color;
position: absolute;
svg {
top: -13px;
top: -14px;
position: absolute;
left: ~"calc(50% - 6px)";
left: ~"calc(50% - 9px)";
}
}
@media screen and (max-width: 870px) {

View File

@ -61,7 +61,7 @@
.cp-markdown-toolbar {
min-height: @toolbar_line-height;
padding: 0.1rem 0;
padding: 0.15rem 0.20rem;
height: auto;
flex-wrap: wrap;
background-color: @cp_toolbar-bg;
@ -73,6 +73,7 @@
border-radius: @variables_radius;
color: @toolbar-color;
.toolbar_button;
padding: 3px 9px;
&:hover {
background-color: contrast(@cp_toolbar-bg, darken(@cp_toolbar-bg, 5%), lighten(@cp_toolbar-bg, 5%));
}
@ -162,6 +163,9 @@
box-sizing: border-box;
order: 100;
z-index: 1;
span.cp-badge > svg.lucide {
width: 0.625rem; // ~10px
}
.cp-toolbar-userlist-drawer-close {
position: absolute;
margin-top: -10px;
@ -255,6 +259,10 @@
border: none;
height: 20px;
cursor: pointer;
svg {
width: @variables_icon_width;
margin: 0 0 @variables_icon_margin 0;
}
}
}
.cp-toolbar-userlist-name-input {
@ -317,6 +325,19 @@
flex-flow: column;
li {
cursor: pointer;
svg.lucide * {
stroke-width: 3.5;
vector-effect: non-scaling-stroke;
}
@media screen and (max-width: @browser_media-medium-screen) {
svg {
margin: 0 @variables_icon_margin 0 @variables_icon_margin;
width: 2.5rem;
}
svg.lucide, svg.lucide * {
stroke-width: 2;
}
}
}
&> p {
text-align: center;
@ -427,8 +448,8 @@
background: transparent;
}
svg {
height: 1.125em;
width: 1.125em;
height: @variables_icon_height;
width: @variables_icon_width;
margin-right: @variables_icon_margin;
}
}
@ -553,10 +574,6 @@
//transform: scale(0.5);
.cp-toolbar-link-logo {
padding: 5px;
svg {
height: 1.5rem;
width: 1.5rem;
}
}
}
.cp-toolbar-user {
@ -605,10 +622,10 @@
line-height: 32px;
margin: 0;
}
.cp-toolbar-notifications {
.cp-notifications-bell {
svg {
height:1.5rem;
width:1.5rem;
width: @variables_icon_width;
height: @variables_icon_height;
}
}
}
@ -658,8 +675,6 @@
.cp-toolbar-title-edit, .cp-toolbar-title-save {
display: flex;
align-items: center;
font-size: 20px;
vertical-align: middle;
border-radius: 0 @variables_radius @variables_radius 0;
}
.cp-toolbar-title-readonly {
@ -706,8 +721,8 @@
border: 1px solid transparent;
padding: 0 5px;
border-collapse: collapse;
span {
cursor: pointer;
svg {
margin: 0;
}
}
.cp-toolbar-title-save {
@ -716,8 +731,8 @@
cursor: pointer;
padding: 5px;
border-collapse: collapse;
span {
cursor: pointer;
svg {
margin: 0;
}
}
.cp-toolbar-title-value {
@ -837,10 +852,10 @@
height: 3rem;
width: 3rem;
margin: 0;
stroke-width: 3;
}
.lucide * {
stroke-width: 3;
vector-effect: non-scaling-stroke;
}
// svg {
@ -859,6 +874,18 @@
// width: 100%;
// }
}
@media screen and (max-height: @browser_media-medium-screen),
screen and (max-width: @browser_media-medium-screen) {
a.cp-toolbar-link-logo {
svg {
width: @variables_icon_width;
height: @variables_icon_height;
}
.lucide * {
stroke-width: 1.5;
}
}
}
a.cp-toolbar-link-logo > svg:nth-of-type(2){ display: none; }
a.cp-toolbar-link-logo:hover > svg:nth-of-type(1){ display: none; }
a.cp-toolbar-link-logo:hover > svg:nth-of-type(2){ display: block; }
@ -1108,7 +1135,7 @@
.cp-toolbar-name, .cp-button-name, .cp-dropdown-button-title {
display: none;
}
i, span, svg {
span, svg {
margin-right: 0;
}
}

View File

@ -133,6 +133,13 @@
flex-wrap: wrap;
justify-content: center;
padding: 0 0.8rem;
svg {
margin: 0;
}
.lucide * {
stroke-width: 2.7;
vector-effect: non-scaling-stroke;
}
}
a {
margin: 10px;
@ -248,6 +255,10 @@
color: @cryptpad_color_brand;
margin-right: 10px;
}
svg.lucide, svg.lucide * {
stroke-width: 2;
vector-effect: non-scaling-stroke;
}
}
.cp-sub-prompt {
* {
@ -289,7 +300,8 @@
svg {
font-size: inherit;
padding: 0;
width: 1em;
width: @variables_icon_width;
height: @variables_icon_height;
padding-left: 5px;
}
}

View File

@ -255,6 +255,30 @@ server {
add_header Cross-Origin-Embedder-Policy require-corp;
}
location ~ ^/upload-blob {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' "${allowed_origins}";
add_header 'Access-Control-Allow-Credentials' true;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Authorization';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'application/octet-stream; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_pass http://localhost:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# These settings prevent both NGINX and the API server
# from setting the same headers and creating duplicates
proxy_hide_header Cross-Origin-Resource-Policy;
add_header Cross-Origin-Resource-Policy cross-origin;
proxy_hide_header Cross-Origin-Embedder-Policy;
add_header Cross-Origin-Embedder-Policy require-corp;
}
# Requests for blobs and blocks are now proxied to the API server
# This simplifies NGINX path configuration in the event they are being hosted in a non-standard location
# or with odd unexpected permissions. Serving blobs in this manner also means that it will be possible to

View File

@ -1,4 +1,4 @@
!/bin/sh
#!/bin/sh
# $FreeBSD$
# PROVIDE: cryptpad
# REQUIRE: DAEMON nginx

View File

@ -98,7 +98,7 @@ module.exports.create = function (config) {
protocol: new URL(httpUnsafeOrigin).protocol,
fileHost: config.fileHost || undefined,
fileHost: config.fileHost? new URL(config.fileHost).origin : undefined,
NO_SANDBOX: NO_SANDBOX,
httpSafePort: httpSafePort,
websocketPort: config.websocketPort,

View File

@ -107,6 +107,10 @@ HK.authenticateNetfluxSession = function (Env, netfluxId, unsafeKey) {
var user = Env.netfluxUsers[netfluxId] = Env.netfluxUsers[netfluxId] || {};
user[unsafeKey] = +new Date();
};
HK.unauthenticateNetfluxSession = function (Env, netfluxId, unsafeKey) {
var user = Env.netfluxUsers[netfluxId] = Env.netfluxUsers[netfluxId] || {};
delete user[unsafeKey];
};
HK.closeNetfluxSession = function (Env, netfluxId) {
delete Env.netfluxUsers[netfluxId];
@ -804,7 +808,7 @@ const handleGetHistoryRange = function (Env, Server, seq, userId, parsed) {
if (hash === untilHash || untilHash === 'NONE') { found = true; }
let then = hash === oldestKnownHash ? abort : readMore;
if (found) {
Server.send(userId, [0, HISTORY_KEEPER_ID, 'MSG', userId,
return void Server.send(userId, [0, HISTORY_KEEPER_ID, 'MSG', userId,
JSON.stringify(['HISTORY_RANGE', txid, parsed])], then);
}
return void readMore();

View File

@ -72,6 +72,7 @@ const AUTHENTICATED_USER_SCOPED = {
REMOVE_PINS: Pinning.removePins,
TRIM_PINS: Pinning.trimPins,
COOKIE: Core.haveACookie,
DESTROY: () => {}
};
var isAuthenticatedCall = function (call) {
@ -190,6 +191,11 @@ var rpc = function (Env, Server, userId, data, respond) {
if (command === 'COOKIE' && !hadSession && Env.logIP) {
Env.Log.info('NEW_RPC_SESSION', {userId: userId, publicKey: publicKey});
}
if (command === "DESTROY") {
HK.unauthenticateNetfluxSession(Env, userId, publicKey);
return; // No need to respond, user will close the session
}
HK.authenticateNetfluxSession(Env, userId, publicKey);
return void handleAuthenticatedMessage(Env, publicKey, msg, respond, Server);
});

View File

@ -264,6 +264,8 @@ var factory = function (Util, Nacl) {
clearTimeout(to);
});
ctx.send('DESTROY', "", function () {});
// remove the ctx from the network's stack
var idx = networkContext.authenticated.indexOf(ctx);
if (idx === -1) { return; }

View File

@ -25,6 +25,7 @@ const factory = (Sortify, UserObject, ProxyManager,
const Saferphore = Util.Saferphore;
var onReadyEvt = Util.mkEvent(true);
var onCacheReadyEvt = Util.mkEvent(true);
var onDriveReadyEvt = Util.mkEvent(true);
var onPadRejectedEvt = Util.mkEvent(true);
const setCustomize = data => {
@ -1608,7 +1609,7 @@ const factory = (Sortify, UserObject, ProxyManager,
if (!Array.isArray(allowed)) { return void cb('ERESTRICTED'); }
onPadRejectedEvt.fire();
onReadyEvt.reg(() => {
onDriveReadyEvt.reg(() => {
// There is an allow list: check if we can authenticate
if (!store.loggedIn || !store.proxy.edPublic) { return void cb('ERESTRICTED'); }
@ -2570,6 +2571,7 @@ const factory = (Sortify, UserObject, ProxyManager,
cacheCb(store.cacheReturned || store.returned);
});
onDriveReady(() => {
onDriveReadyEvt.fire();
cb(store.returned);
});

View File

@ -24,7 +24,16 @@ const factory = (Crypto) => {
msg: data.msg,
uid: data.uid,
};
chan.sendMsg(JSON.stringify(obj), cb);
if (obj.msg === 'ISAVE') {
ctx.pending[data.uid] = true;
}
chan.sendMsg(JSON.stringify(obj), obj => {
if (!ctx.pending[data.uid]) {
return void setTimeout(cb, 1000);
}
delete ctx.pending[data.uid];
cb(obj);
});
ctx.emit('MESSAGE', obj, chan.clients.filter(function (cl) {
return cl !== client;
}));
@ -90,6 +99,9 @@ const factory = (Crypto) => {
var parsed;
try {
parsed = JSON.parse(msg);
if (parsed.msg === "ISAVE") {
delete ctx.pending[parsed.uid];
}
ctx.emit('MESSAGE', parsed, chan.clients);
} catch (e) { console.error(e); }
});
@ -176,6 +188,7 @@ const factory = (Crypto) => {
store: cfg.store,
emit: emit,
channels: {},
pending: {}, // prevent ISAVE race condition
clients: {}
};

View File

@ -107,6 +107,7 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager,
try { team.roster.stop(); } catch (e) {}
team.proxy = {};
team.stopped = true;
team?.rpc?.destroy();
delete ctx.teams[teamId];
delete ctx.cache[teamId];
delete ctx.store.proxy.teams[teamId];

View File

@ -78,6 +78,7 @@ let start = (cfg: StoreConfig):void => {
Store,
Account,
Mailbox,
Messenger,
Badge
].forEach(dep => {
if (typeof(dep.setCustomize) === "function") {

View File

@ -1054,7 +1054,9 @@ define([
redraw();
var upload = blocks.button('primary', '', Messages.admin_logoButton);
upload.prepend(Icons.get('upload'));
var remove = blocks.button('danger', '', Messages.admin_logoRemoveButton);
remove.prepend(Icons.get('restore'));
let spinnerBlock = blocks.inline();
let spinner = UI.makeSpinner($(spinnerBlock));
@ -1147,6 +1149,7 @@ define([
let $preview = $(preview);
let remove = blocks.button('danger', '', Messages.admin_logoRemoveButton);
remove.prepend(Icons.get('restore'));
let $remove = $(remove);
let setColor = (color, done) => {
@ -1191,6 +1194,7 @@ define([
let color = $input.val();
setColor(color, done);
});
btn.prepend(Icons.get('color-palette'));
UI.confirmButton($remove, {

View File

@ -172,6 +172,10 @@
text-align:center;
flex-shrink: 0;
}
.tui-full-calendar-calendar-dot {
margin-right: 10px;
top: 0;
}
.tui-full-calendar-popup-detail-item {
display: flex;
margin-bottom: 0.3rem;
@ -195,7 +199,6 @@
}
}
a {
margin:0.1rem;
border-radius: @variables_radius;
color: @cryptpad_color_link;
text-decoration: underline;
@ -314,6 +317,9 @@
font-size: inherit;
line-height: inherit;
}
* {
box-sizing: content-box;
}
}
.CodeMirror-placeholder {
color: @cp_forms-placeholder;

View File

@ -2387,6 +2387,23 @@ APP.recurrenceRule = {
});
}
var privateData = metadataMgr.getPrivateData();
$el.find('.event-description').click(e => {
if (!e.target) { return; }
var $t = $(e.target);
if (!$t.is('a') && !$t.parents('a').length) { return; }
e.preventDefault();
var $a = $t.is('a') ? $t : $t.parents('a').first();
var href = $a.attr('href');
if (/^#/.test(href)) { return; }
if (/^\/[^\/]/.test(href)) {
href = privateData.origin + href;
return void common.openURL(href);
}
common.openUnsafeURL(href);
});
console.error($el.find('.event-description'), $el);
var $section = $el.find('.tui-full-calendar-section-button');
var ev = APP.editModalData;
var data = ev.schedule || {};

View File

@ -1651,6 +1651,27 @@ define([
});
});
// confirm that POST requests to the `/upload-blob` endpoint
// return something other than a 404, which would probably indicate
// a reverse proxy misconfiguration
assert(function (cb, msg) {
msg.appendChild(h('span', [
`The server returned a 404 error when attempting to reach the `,
h('code', `/upload-blob`),
` endpoint. This can be caused by an incorrectly configured reverse proxy.`,
]));
fetch('/upload-blob', {
method: 'POST',
}).then(res => {
console.log({ upload_fetch_response: res });
cb(res.status !== 404);
}).catch(err => {
console.error(err);
cb(false);
});
});
var row = function (cells) {
return h('tr', cells.map(function (cell) {
return h('td', cell);

View File

@ -129,6 +129,7 @@ define([
"ellipsis-vertical": "ellipsis-vertical",
"ellipsis-horizontal": 'ellipsis',
"toolbar-insert": "image-plus",
"features": "info",
// Login + Register
"login": "log-in",
"logout": "log-out",
@ -145,7 +146,7 @@ define([
"history-next": "arrow-right",
"history-fast-next": "arrow-right-to-line",
"history-fast-prev": "arrow-left-to-line",
"history-timeline-position": "flag-triangle-right",
"history-timeline-position": "chevron-down",
"history-restore": "archive-restore",
"remove-history": "eraser",
// Calendar
@ -178,6 +179,7 @@ define([
"code": "code-xml",
"qr-code": "qr-code",
"lock": "lock",
"unlocked": "lock-open",
"help": "info",
"expand-menu": "chevron-right",
"location": "navigation",
@ -198,6 +200,7 @@ define([
"notifications" : "notebook-text",
"mute": "bell-off",
"cursor": "text-cursor",
"import": "import",
// Settings + Admin
"settings": "settings",
"apps-settings": "wrench",

View File

@ -663,7 +663,7 @@ define([
tag: 'a',
attributes: attributes,
content: [
$icon.length ? $icon.clone()[0] : null,,
$icon.length ? $icon.clone()[0] : null,
h('span', $button.text())
],
action: function () {
@ -4467,9 +4467,8 @@ define([
let nodeWithOrder;
if (isDrawer) { // HACK: the order is set on their inner "a" tag
let $n = $(node);
if (!$n.attr('class') &&
($n.find('.fa').length || $n.find('.cptools').length)) {
nodeWithOrder = $n.find('.fa')[0] || $n.find('.cptools')[0];
if (!$n.attr('class') && $n.find('.lucide').length) {
nodeWithOrder = $n.find('.lucide')[0];
}
}
var order = getComputedStyle(nodeWithOrder || node).getPropertyValue("order");

View File

@ -80,7 +80,9 @@ define([
var keys = [];
nThen(function (waitFor) {
// Not logged in? check for temp RPC keys
if (!LocalStore.isLoggedIn() && Env?.returned?.tempKeys) {
const anon = !LocalStore.isLoggedIn()
|| common.neverDrive;
if (anon && Env?.returned?.tempKeys) {
keys.push(Env.returned.tempKeys);
return;
}
@ -2672,6 +2674,7 @@ define([
Messages,
AppConfig
};
common.neverDrive = rdyCfg.neverDrive;
common.userHash = userHash || LocalStore.getUserHash();
// FIXME Backward compatibility

View File

@ -2529,7 +2529,7 @@ define([
return;
}
$element.find('.fa').on('mouseenter', function (e) {
$element.find('.lucide').on('mouseenter', function (e) {
if ($element[0] && $element[0]._tippy) {
$element[0]._tippy.destroy();
}
@ -3358,11 +3358,13 @@ define([
var SORT_FILE_BY = 'sortFilesBy';
var SORT_FILE_DESC = 'sortFilesDesc';
var getSortFileDesc = function () {
return APP.store[SORT_FILE_DESC]+"" === "true";
var getSortFolderDesc = function () { // this way the icon change is triggered
var v = APP.store[SORT_FOLDER_DESC];
return v === true;
};
var getSortFolderDesc = function () {
return APP.store[SORT_FOLDER_DESC]+"" === "true";
var getSortFileDesc = function () {
var v = APP.store[SORT_FILE_DESC];
return v === true;
};
var onSortByClick = function () {
@ -4647,7 +4649,7 @@ define([
(isRootOpened ? $folderOpenedIcon : $folderIcon);
var $rootElement = createTreeElement(rootName, $rootIcon.clone(), path.slice(), false, true, true, isRootOpened);
if (!manager.hasSubfolder(root)) {
$rootElement.find('.cp-app-drive-icon-expcol').addClass('cp-icon-hidden');
$rootElement.find('.cp-app-drive-icon-expcol').addClass('cp-icon-hidden').attr('tabindex','-1');
}
$rootElement.addClass('cp-app-drive-tree-root');
$rootElement.find('>.cp-app-drive-element-row')

View File

@ -15,9 +15,9 @@ define([
'/customize/messages.js',
'/components/nthen/index.js',
'/components/saferphore/index.js',
'/components/jszip/dist/jszip.min.js',
'/customize/fonts/lucide.js',
'/common/common-icons.js',
'/components/jszip/dist/jszip.min.js',
], function ($, FileCrypto, Hash, Util, UI, h, Feedback, UO,
Cache, Messages, nThen, Saferphore, Lucide, Icons) {
var saveAs = window.saveAs;
@ -509,8 +509,7 @@ define([
var complete = function(h, err) {
if (completed) { return; }
completed = true;
$(progress).find('.fa-square-o').removeClass('fa-square-o')
.addClass('fa-check-square-o');
$(progress).find('svg').empty().append(Icons.get('checked-box'));
$(cancel).text(Messages.filePicker_close).off('click').click(function() {
_onCancel.forEach(function(h) { h(); });
});
@ -527,8 +526,7 @@ define([
// New step
if (!done[step]) {
$(progress).find('.fa-square-o').removeClass('fa-square-o')
.addClass('fa-check-square-o');
$(progress).find('svg').empty().append(Icons.get('checked-box'));
$(progress).append(h('p', [
Icons.get('checked-box'),
h('span.text', Messages['settings_export_' + step] || step)

View File

@ -130,7 +130,7 @@ define([
toolbar['chat'].find('button').addClass('cp-toolbar-notification');
}
if (!toolbar['chat'].hasClass('cp-leftside-active')) {
toolbar['chat'].find('span.fa').addClass('cp-team-chat-notification');
toolbar['chat'].find('span .lucide').addClass('cp-team-chat-notification');
}
};

View File

@ -2163,7 +2163,7 @@ define([
url: url,
permissions: {
download: dc?.permissions?.download || false,
print: dc?.permissions?.print || true,
print: dc?.permissions?.print !== false,
protect: file.type === 'xlsx',
}
},

View File

@ -670,6 +670,10 @@ define([
UI.removeLoadingScreen(emitResize);
if (integrationChannel) {
integrationChannel.event('EV_INTEGRATION_READY');
}
if (AppConfig.textAnalyzer && textContentGetter) {
AppConfig.textAnalyzer(textContentGetter, privateDat.channel);
}

View File

@ -92,7 +92,7 @@ define([
if (state.me) { return; } // I have the lock: abort
if (state.other && state.other !== data.uid) { return; } // someone else has the lock
// If state.other === data.uid ==> save failed and someone else tries again
if (!state.changed) { return; }
if (!state.changed && state.other !== data.uid) { return; }
// If !state.other: nobody has the lock, give them
state.other = data.uid;
state.lastTmp = +new Date();
@ -103,6 +103,7 @@ define([
setStateChanged(false);
saveTo = setTimeout(function () {
// They weren't able to save in time, try ourselves
setStateChanged(true);
var id = state.other;
state.other = false;
save(id);
@ -151,7 +152,7 @@ define([
// is already saving
requestSave = function (id, cb) {
if (state.other || state.me) { return void cb(false); } // save in progress
debug('Integration send ISAVE');
debug('Integration send ISAVE', id);
alreadySaved = false; // someone may have saved while we were waiting for our callback
execCommand('SEND', {
msg: 'ISAVE',

View File

@ -750,7 +750,7 @@ MessengerUI, Messages, Pages, PadTypes, Lucide, Icons) {
$text.addClass("cp-toolbar-title-editable");
var $icon = Icons.get('edit', {class: 'cp-toolbar-title-icon-readonly'});
$pencilIcon.append($icon).appendTo($hoverable);
var $icon2 = Icons.get('check', {class: 'cp-toolbar-title-icon-readonly'})
var $icon2 = Icons.get('check', {class: 'cp-toolbar-title-icon-readonly'});
$saveIcon.append($icon2).appendTo($hoverable);
}

View File

@ -609,7 +609,7 @@
"friendRequest_later": "Tentukan nanti",
"friendRequest_accept": "Terima (Enter)",
"profile_addDescription": "Tambahkan deskripsi",
"profile_addLink": "Tambahkan tautan ke situs web Anda",
"profile_addLink": "Tautan ke situs web Anda",
"notification_padShared": "{0} telah membagikan dokumen dengan Anda: <b>{1}</b>",
"notification_folderShared": "{0} telah membagikan folder dengan Anda: <b>{1}</b>",
"share_filterFriend": "Cari berdasarkan nama",
@ -622,7 +622,7 @@
"footer_donate": "Berdonasi",
"drive_active7Days": "7 hari terakhir",
"drive_active28Days": "4 minggu terakhir",
"profile_editDescription": "Sunting deskripsi Anda",
"profile_editDescription": "Deskripsi profil",
"notification_fileShared": "{0} telah membagikan berkas dengan Anda: <b>{1}</b>",
"admin_supportAddError": "Kunci privat tidak absah",
"password_info": "Dokumen yang Anda buka sudah tidak ada atau dilindungi dengan kata sandi baru. Masukkan kata sandi yang benar untuk mengakses kontennya.",
@ -1091,7 +1091,7 @@
"mediatag_notReady": "Silakan selesaikan unduhan",
"addOptionalPassword": "Tambahkan kata sandi (opsional)",
"broadcast_defaultLanguage": "Gunakan bahasa ini sebagai cadangan",
"calendar_errorNoCalendar": "Tidak ada kalender dapat disunting yang dipilih",
"calendar_errorNoCalendar": "Tidak ada kalender yang tersedia",
"calendar_import": "Tambahkan ke kalender saya",
"calendar_dateTimeRange": "{0} {1} - {2}",
"admin_supportPrivTitle": "Kunci pribadi kotak surat bantuan",
@ -1174,7 +1174,7 @@
"calendar_more": "{0} lagi",
"form_invalidQuestion": "Pertanyaan {0}",
"mdToolbar_embed": "Sematkan berkas",
"fm_link_invalid": "URL tidak valid",
"fm_link_invalid": "Silakan sediakan URL yang valid",
"calendar_str_monthly": "{0} bulan",
"comments_reply": "Balas",
"comments_resolve": "Selesaikan",
@ -1780,5 +1780,66 @@
"admin_onboardingNamePlaceholder": "Judul server",
"admin_onboardingDescPlaceholder": "Teks deskripsi server",
"admin_onboardingOptionsHint": "Silakan pilih opsi sesuai untuk server Anda.<br>Pengaturan ini dapat diubah lagi dalam panel admin.",
"install_notes": "<ul class=\"cp-notes-list\"><li>Buat akun administrator Anda yang pertama di laman ini. Administrator mengelola pengaturan server termasuk kuota penyimpanan dan memiliki akses ke peralatan moderasi.</li><li>Kata sandi Anda adalah kunci rahasia yang mengenkripsi semua dokumen dan hak administrator Anda di server ini.<span class=\"red\">Jika Anda kehilangan kata sandi tersebut, kami tidak dapat memulihkan data Anda.</span></li><li>Jika Anda menggunakan komputer terbagi, <span class=\"red\">jangan lupa untuk keluar dari akun</span> setelah Anda selesai. Hanya menutup jendela peramban membuat akun Anda rentan.</li></ul>"
"install_notes": "<ul class=\"cp-notes-list\"><li>Buat akun administrator Anda yang pertama di laman ini. Administrator mengelola pengaturan server termasuk kuota penyimpanan dan memiliki akses ke peralatan moderasi.</li><li>Kata sandi Anda adalah kunci rahasia yang mengenkripsi semua dokumen dan hak administrator Anda di server ini.<span class=\"red\">Jika Anda kehilangan kata sandi tersebut, kami tidak dapat memulihkan data Anda.</span></li><li>Jika Anda menggunakan komputer terbagi, <span class=\"red\">jangan lupa untuk keluar dari akun</span> setelah Anda selesai. Hanya menutup jendela peramban membuat akun Anda rentan.</li></ul>",
"form_passwordWarning": "Diingat bahwa kata sandi Form hanya dapat diatur sekarang pada waktu pembuatan dan tidak dapat diubah nanti.",
"admin_addKeyLabel": "Tambahkan admin menggunakan kunci publiknya",
"admin_documentsDeletionTitle": "Arsipkan beberapa dokumen",
"admin_addAdminsHint": "Tambahkan administrator dari kunci publiknya atau dari daftar kontak Anda",
"admin_listConfirm": "Apakah Anda yakin ingin menghapus hak admin dari pengguna ini?",
"skipLink": "Lewati ke konten utama",
"toggleArrows": "Tombol panah untuk memindahkan item",
"oo_couldNotConvertDocument": "Konversi dokumen gagal. Saat ini format Microsoft Office (.docx, .xlsx, .pptx) memberikan hasil terbaik untuk pengimporan dan pengeksporan.",
"admin_documentsDeletionHint": "Arsipkan daftar dokumen menggunakan id-nya (satu id dokumen per baris)",
"fm_restoreMultipleDialog": "Apakah Anda yakin ingin memulihkan {0} berkas dan/atau folder ke tempat sebelumnya?",
"calendar_show": "Tampilkan kalender",
"calendar_hide": "Sembunyikan kalender",
"oo_unstableMigrationWarning": "Impor dan Ekspor beberapa format OpenDocument (.odt, .odp) saat ini tidak stabil. Kami menyarankan menggunakan format lain jika dimungkinkan. CryptPad akan mencoba konversi sebaik mungkin.",
"admin_logoSize_error": "Ukuran logo terlalu besar",
"error_limit": "Silakan masukkan angka yang valid",
"form_answerType_error": "Silakan pilih cara menjawab formulir",
"error_positiveNumber": "Silakan masukkan angka positif",
"admin_cat_admins": "Administrator",
"admin_admin": "Admin",
"admin_listAdminsTitle": "Administrator saat ini",
"admin_listAdminsHint": "Tampilkan dan hapus administrator",
"admin_addAdminsTitle": "Tambahkan administrator",
"admin_addAdminsAdd": "Promosikan kontak sebagai admin",
"admin_errorAddKeyLabel": "Tambahkan kunci publik yang valid",
"admin_errorAddAdmins": "Pilih kontak untuk dipromosikan sebagai admin",
"admin_listName": "Nama admin",
"admin_listKey": "Kunci admin",
"admin_listAction": "Hapus hak admin",
"admin_listHardcoded": "Admin ditambahkan ke config.js. Hanya dapat dihapus dengan menyunting berkas konfig.",
"addItemBottom": "Tambahkan kartu ke bawah papan",
"addItemTop": "Tambahkan kartu ke atas papan",
"moveItemLeft": "Pindahkan item ke kiri",
"moveItemRight": "Pindahkan item ke kanan",
"kanban_moveBoardLeft": "Pindahkan papan ke kiri",
"kanban_moveBoardRight": "Pindahkan papan ke kanan",
"moveItemUp": "Pindahkan item ke atas",
"moveItemDown": "Pindahkan item ke bawah",
"toggleDrag": "Tarik untuk memindahkan item",
"profile_remove_avatar": "Hapus avatar ini",
"team_autoTrim": "Memangkas riwayat drive tim... Silakan tunggu.",
"admin_mfa_confirm_enable": "Apakah Anda yakin ingin mengaktifkan Autentikasi Multi-Faktor?",
"admin_mfa_confirm_disable": "Apakah Anda yakin ingin menonaktifkan Autentikasi Multi-Faktor?",
"badges_moderator": "Bantuan dan moderasi",
"badges_admin": "Administrator",
"badges_premium": "Pelanggan",
"badges_error": "Kesalahan validasi",
"profile_badges": "Lencana",
"show_password": "Tampilkan kata sandi",
"hide_password": "Sembunyikan kata sandi",
"page_previous": "Halaman sebelumnya",
"page_next": "Halaman berikutnya",
"contact_mastodon": "Mastodon",
"contact_forum": "Forum",
"settings_profileAvatarLabel": "Avatar",
"settings_profileHeaderTitle": "Informasi profil",
"settings_profileHeaderHint": "Pilih apa saja tentang akun Anda yang dapat dilihat oleh orang lain",
"toolbar_text_tools": "Peralatan teks",
"toolbar_show_text_tools": "Tampilkan peralatan teks",
"toolbar_hide_text_tools": "Sembunyikan peralatan teks",
"fc_open_formaud": "Buka (sebagai pengaudit)",
"help_close_button": "Tutup notifikasi bantuan"
}

View File

@ -1825,5 +1825,6 @@
"admin_addAdminsHint": "Aggiungi amministratori/trici tramite la loro chiave pubblica o dalla tua lista contatti",
"admin_addAdminsAdd": "Promuovi un contatto ad amministratore/trice",
"toggleArrows": "Pulsanti freccia per spostare gli elementi",
"oo_unstableMigrationWarning": "L'importazione e l'esportazione di alcuni formati OpenDocument (.odt, .odp) è attualmente instabile. Si consiglia di utilizzare altri formati quando possibile. CryptPad tenterà ora una conversione."
"oo_unstableMigrationWarning": "L'importazione e l'esportazione di alcuni formati OpenDocument (.odt, .odp) è attualmente instabile. Si consiglia di utilizzare altri formati quando possibile. CryptPad tenterà ora una conversione.",
"settings_profileHeaderTitle": "Informazioni del profilo"
}

View File

@ -113,7 +113,7 @@
"settings_save": "保存",
"profile_viewMyProfile": "自分のプロフィールを表示",
"clickToEdit": "クリックして編集",
"profile_addLink": "あなたのウェブサイトへのリンクを追加",
"profile_addLink": "あなたのウェブサイトへのリンク",
"shareSuccess": "リンクをクリップボードにコピーしました",
"shareButton": "共有",
"login_hashing": "パスワードをハッシュ化しています。この処理には時間がかかる場合があります。",
@ -144,7 +144,7 @@
"saved": "保存済",
"error": "エラー",
"deleted": "削除しました",
"profile_editDescription": "説明文を編集",
"profile_editDescription": "プロフィールの説明文",
"profile_addDescription": "説明文を追加",
"profileButton": "プロフィール",
"profile_upload": " 新しいアバターをアップロード",
@ -1818,5 +1818,27 @@
"admin_errorAddKeyLabel": "正しい公開鍵を追加してください",
"skipLink": "メインの内容にスキップ",
"addItemTop": "カードをボードの最上部に追加",
"profile_remove_avatar": "このアバターを削除"
"profile_remove_avatar": "このアバターを削除",
"oo_couldNotConvertDocument": "ドキュメントの変換に失敗しました。現在はMicrosoft Officeのフォーマット.docx, .xlsx, .pptxがインポートとエクスポートに最もよく対応しています。",
"oo_unstableMigrationWarning": "現在、一部のOpenDocumentのフォーマット.odt, .odpのインポートとエクスポートは不安定です。可能な場合は他のフォーマットを使用することを推奨します。これから、可能な範囲での変換を試みます。",
"badges_moderator": "サポートとモデレート",
"badges_admin": "管理者",
"badges_premium": "定額利用のユーザー",
"badges_error": "検証エラー",
"profile_badges": "バッジ",
"show_password": "パスワードを表示",
"hide_password": "パスワードを表示しない",
"page_previous": "前のページ",
"page_next": "次のページ",
"settings_profileHeaderHint": "アカウントの画面に表示するものを選択してください",
"contact_mastodon": "Mastodon",
"contact_forum": "フォーラム",
"settings_profileAvatarLabel": "アバター",
"settings_profileHeaderTitle": "プロフィールの情報",
"toolbar_text_tools": "テキストツール",
"toolbar_show_text_tools": "テキストツールを表示",
"toolbar_hide_text_tools": "テキストツールを表示しない",
"help_close_button": "ヘルプの通知を閉じる",
"admin_documentsDeletionTitle": "複数のドキュメントをアーカイブ",
"admin_documentsDeletionHint": "IDをリストの形式で指定してドキュメントをアーカイブ1行に1つのドキュメントを指定してください"
}

View File

@ -899,8 +899,8 @@
"isContact": "{0} - один из Ваших контактов",
"profile_friendRequestSent": "Запрос на контакт ожидает рассмотрения ...",
"profile_info": "Другие пользователи могут найти ваш профиль через ваш аватар в списках пользователей документов.",
"profile_addLink": "Добавьте ссылку на свой вебсайт",
"profile_editDescription": "Изменить описание",
"profile_addLink": "Ссылка на Ваш вебсайт",
"profile_editDescription": "Описание профиля",
"profile_addDescription": "Добавить описание",
"notifications_empty": "Нет доступных уведомлений",
"friendRequest_notification": "<b>{0}</b> отправил(а) Вам запрос на контакт",
@ -1820,5 +1820,26 @@
"moveItemDown": "Переместить элемент ниже",
"profile_remove_avatar": "Удалить этот аватар",
"oo_couldNotConvertDocument": "Не удалось сконвертировать документ. Обратите внимание, что форматы Microsoft Office (.docx, .xlsx, .pptx) в настоящее время дают наилучшие результаты для импорта и экспорта.",
"oo_unstableMigrationWarning": "Импорт и экспорт некоторых форматов OpenDocument (.odt, .odp) в настоящее время нестабильны. Мы рекомендуем использовать другие форматы, где это возможно. Сейчас CryptPad попытается выполнить преобразование как можно лучше."
"oo_unstableMigrationWarning": "Импорт и экспорт некоторых форматов OpenDocument (.odt, .odp) в настоящее время нестабильны. Мы рекомендуем использовать другие форматы, где это возможно. Сейчас CryptPad попытается выполнить преобразование как можно лучше.",
"badges_moderator": "Поддержка и модерация",
"badges_admin": "Администратор",
"badges_premium": "Подписчик",
"badges_error": "Ошибка валидации",
"profile_badges": "Значок",
"show_password": "Показать пароль",
"hide_password": "Скрыть пароль",
"page_previous": "Предыдущая страница",
"page_next": "Следующая страница",
"settings_profileHeaderHint": "Выберите, что другие пользователи видят о Вашем аккаунте",
"contact_mastodon": "Mastodon",
"contact_forum": "Форум",
"settings_profileAvatarLabel": "Аватар",
"settings_profileHeaderTitle": "Информация профиля",
"toolbar_text_tools": "Инструменты для работы с текстом",
"toolbar_show_text_tools": "Показать текстовые инструменты",
"toolbar_hide_text_tools": "Скрыть текстовые инструменты",
"help_close_button": "Закрыть уведомление о помощи",
"fc_open_formaud": "Открыть (как аудитор)",
"admin_documentsDeletionTitle": "Архивировать несколько документов",
"admin_documentsDeletionHint": "Архивировать несколько документов, используя их идентификаторы (по одному идентификатору документа в строке)"
}

View File

@ -1837,5 +1837,9 @@
"settings_profileAvatarLabel": "头像",
"toolbar_text_tools": "文本工具",
"toolbar_show_text_tools": "显示文本工具",
"toolbar_hide_text_tools": "隐藏文本工具"
"toolbar_hide_text_tools": "隐藏文本工具",
"fc_open_formaud": "打开(作为审计者)",
"help_close_button": "关闭帮助通知",
"admin_documentsDeletionTitle": "归档多个文档",
"admin_documentsDeletionHint": "使用文档 ID 归档文档列表(每行一个文档 ID"
}

File diff suppressed because one or more lines are too long

View File

@ -63,9 +63,11 @@ define([
var onDrawioInit = function() {
drawIoInitalized = true;
var readOnly = framework.isReadOnly() || framework.isLocked();
var grid = readOnly ? 0 : 1;
lastContent.mxfile.diagram.mxGraphModel._grid = grid;
if (lastContent?.mxfile?.diagram?.mxGraphModel) {
let readOnly = framework.isReadOnly() || framework.isLocked();
let grid = readOnly ? 0 : 1;
lastContent.mxfile.diagram.mxGraphModel._grid = grid;
}
var xmlStr = DiagramUtil.jsonContentAsXML(lastContent);
postMessageToDrawio({
action: 'load',

View File

@ -191,9 +191,6 @@
position: relative;
.cp-markdown-toggle-button {
.markdown-toolbar-button-style();
&.cp-toolbar-button-active {
//background-color: transparent !important;
}
}
}
@ -482,8 +479,8 @@
.cp-form-creator-inline-add {
svg {
margin: 0;
width: 1.5rem;
height: 1.5rem;
width: @variables_icon_width;
height: @variables_icon_height;
}
.add-close { display: none; }
&.displayed {
@ -750,7 +747,7 @@
text-align: center;
padding: 10px;
svg {
margin-right: 5px;
margin-right: @variables_icon_margin;
}
}
.cp-form-edit-buttons-container {
@ -869,7 +866,6 @@
}
.cp-markdown-toolbar {
display: block;
padding: 0.1rem 0;
border-radius: @variables_radius 0;
width: 100%;
background-color: transparent;
@ -1418,7 +1414,7 @@
line-height: 40px;
margin-top: -12px;
svg {
margin-right: 5px;
margin-right: @variables_icon_margin;
}
}
& > *:not(h2) {

View File

@ -159,6 +159,10 @@
&.cp-toolbar-button-active {
background-color: transparent;
}
.lucide-pencil {
margin: 0;
width: 1em;
}
}
#cp-kanban-edit-body {
@ -177,12 +181,6 @@
background-color: transparent;
color: @cp_kanban-fg;
border-radius: @variables_radius @variables_radius 0px 0px;
button {
&:hover {
background-color: @cp_kanban-fg;
color: @cp_kanban-conflict-bg;
}
}
.btn {
outline: 0;
border-radius: @variables_radius;
@ -242,6 +240,9 @@
{
margin-right:0px;
}
.lucide-pencil {
width: 1em;
}
}
.item-icon-container{ // Board arrows
@ -383,9 +384,6 @@
overflow-wrap: anywhere;
display: flex;
flex: 1;
&:empty::before {
content: "\200b";
}
input#kanban-edit {
margin: 0;
padding: 0;

View File

@ -108,8 +108,8 @@
}
}
.cp-avatar-calendar {
width: 2rem;
height: 2rem;
min-width: 2em;
min-height: 2em;
margin: 1rem 0 1rem 1rem;
}
&.cp-app-notification-archived {

View File

@ -202,15 +202,15 @@ define([
var $input = $(table).find('input[disabled="disabled"][data-rt-id^="' + id + '"]')
.removeAttr('disabled');
$input.closest('td').addClass('cp-app-poll-table-editing');
$(table).find('.cp-app-poll-table-lock[data-rt-id="' + id + '"]').addClass('fa-unlock')
.removeClass('fa-lock').attr('title', Messages.poll_unlocked);
$(table).find('.cp-app-poll-table-lock[data-rt-id="' + id + '"]').empty().append(Icons.get('unlock'))
.attr('title', Messages.poll_unlocked);
};
var disableColumn = function (id) {
var $input = $('input[data-rt-id^="' + id + '"]')
.attr('disabled', 'disabled');
$input.closest('td').removeClass('cp-app-poll-table-editing');
$('.cp-app-poll-table-lock[data-rt-id="' + id + '"]').addClass('fa-lock')
.removeClass('fa-unlock').attr('title', Messages.poll_locked);
$('.cp-app-poll-table-lock[data-rt-id="' + id + '"]').empty().append(Icons.get('lock'))
.attr('title', Messages.poll_locked);
};
var enableRow = APP.enableRow = function (id, table) {
table = table || $('body');
@ -466,7 +466,7 @@ define([
.indexOf('cp-app-poll-table-bookmark') !== -1;
var isLock = span.className && span.className.split(' ')
.indexOf('cp-app-poll-table-lock') !== -1;
var isLocked = span.className && span.className.split(' ').indexOf('fa-lock') !== -1;
var isLocked = span.querySelector('[data-lucide="lock"]') !== null;
if (type === 'row') {
if (isRemove) {
UI.confirm(Messages.poll_removeOption, function (res) {
@ -578,10 +578,10 @@ define([
var msg = (p ? Messages.poll_edit : Messages.poll_publish_button);
APP.$publishButton.find('.cp-toolbar-name').text(msg);
if (p) {
APP.$publishButton.find('i').removeClass('fa-check').addClass('fa-pencil');
APP.$publishButton.find('.lucide').empty().append(Icons.get('edit'));
return;
}
APP.$publishButton.find('i').addClass('fa-check').removeClass('fa-pencil');
APP.$publishButton.find('.lucide').empty().append(Icons.get('check'));
};
var publish = APP.publish = function (bool) {
if (!APP.readOnly) {
@ -609,7 +609,7 @@ define([
// disable all the things
$('.cp-app-poll-realtime input, .cp-app-poll-realtime button, .cp-app-poll-upper button, .cp-app-poll-realtime textarea').attr('disabled', true);
$('span.cp-app-poll-table-edit, span.cp-app-poll-table-remove').hide();
$('span.cp-app-poll-table-lock').addClass('fa-lock').removeClass('fa-unlock')
$('span.cp-app-poll-table-lock').empty().append(Icons.get('lock'))
.attr('title', Messages.poll_locked)
.css({'cursor': 'default'});
} else {
@ -709,7 +709,6 @@ define([
'data-rt-id': k
}, Icons.get('close')).appendTo($actions).click(function () { removeComment(k); });
/*$('<button>', {
'class': 'fa fa-pencil',
'title': 'TODO: edit comment',
'data-rt-id': c.uid
}).appendTo($actions).click(editComment);*/

View File

@ -447,6 +447,7 @@ define([
APP.getEdPublic = function () {
var metadataMgr = APP.common.getMetadataMgr();
var privateData = metadataMgr.getPrivateData();
const data = APP._lastUpdate;
var url = Hash.getPublicSigningKeyString(privateData.origin, data.name, data.edPublic);
Clipboard.copy(url, (err) => {
if (!err) { UI.log(Messages.genericCopySuccess); }

View File

@ -32,8 +32,8 @@ define([
h,
Sortify,
Messages,
Lucide,
Icons)
Lucide
)
{
var APP = window.APP = {};

View File

@ -30,6 +30,7 @@
svg {
width: 1.2rem;
height: 1.2rem;
margin: @variables_icon_margin;
}
}
.cp-checkmark.noTitle:not(.cp-settings-radio-container .cp-checkmark.noTitle, .cp-settings-code-spellcheck .noTitle.cp-checkmark) {
@ -137,7 +138,7 @@
padding-bottom:0.5rem;
}
svg {
margin: 0 0 0.5rem;
margin: 0 0 @variables_icon_margin;
}
}
@ -347,6 +348,9 @@
font-size: inherit;
line-height: inherit;
}
* {
box-sizing: content-box;
}
}
.cp-markdown-toggle-button {
.markdown-toolbar-button-style();

View File

@ -242,6 +242,7 @@ define([
'class': 'btn btn-primary'
}).text(Messages.settings_logoutEverywhereButton)
.appendTo($div);
$button.prepend(Icons.get('logout-everywhere'));
var spinner = UI.makeSpinner($div);
$button.click(function() {
@ -485,6 +486,7 @@ define([
if (!common.isLoggedIn()) { return cb(false); }
var button = h('button.btn.btn-danger', Messages.settings_deleteButton);
button.prepend(Icons.get('trash-full'));
var form = h('div', [
UI.passwordInput({
id: 'cp-settings-delete-account',
@ -1055,7 +1057,7 @@ define([
.text(Messages.settings_resetThumbnailsDescription).appendTo($div);
var $button = $('<button>', { 'id': 'resetThumbnails', 'class': 'btn btn-primary' })
.text(Messages.settings_resetThumbnailsAction).appendTo($div);
$button.prepend(Icons.get('clear-canvas'));
$button.click(function() {
sframeChan.query("Q_THUMBNAIL_CLEAR", null, function(err) {
if (err) { return void console.error("Cannot clear localForage"); }
@ -1151,6 +1153,7 @@ define([
.text(Messages.settings_backupHint2).appendTo($div);
var $export2 = common.createButton('export', true, {}, exportDrive);
$export2.attr('class', 'btn btn-success').text(Messages.settings_backup2);
$export2.prepend(Icons.get('download'));
$div.append($export2);
return $div;
@ -1166,6 +1169,7 @@ define([
'id': 'cp-settings-import-local-pads',
'class': 'btn btn-primary'
}).text(Messages.settings_import).appendTo($div);
$button.prepend(Icons.get('import'));
var spinner = UI.makeSpinner($div);
$button.click(function() {
UI.confirm(Messages.settings_importConfirm, function(yes) {
@ -1186,6 +1190,7 @@ define([
var button = h('button.btn.btn-danger-alt', {
disabled: 'disabled'
}, Messages.trimHistory_button);
button.prepend(Icons.get('trash-full'));
var currentSize = h('p', $(spinner.spinner).clone()[0]);
var content = h('div#cp-settings-trim-container', [
currentSize,

View File

@ -47,7 +47,7 @@
.cp-spinner, .cp-ok {
svg {
margin: 0.5rem;
margin: @variables_icon_margin;
}
}

View File

@ -1269,6 +1269,7 @@ define([
makeBlock('delete', function (common, cb, $div) { // Msg.team_deleteHint, .team_deleteTitle
$div.addClass('cp-online');
var deleteTeam = h('button.btn.btn-danger', Messages.team_deleteButton);
deleteTeam.prepend(Icons.get('trash-full'));
var spinnerContainer = h('span', {class: 'cp-team-spinner'});
var spinner = UI.makeSpinner($(spinnerContainer));