402 Commits

Author SHA1 Message Date
sebivh
b5af399ca1 Fix error with database query 2025-10-21 18:28:37 +02:00
sebivh
1ebc551370 add +x flag to mode 2025-10-21 17:57:34 +02:00
sebivh
b7aaedba14 Added Authentication for Minecraft Server
In this commit, a beautiful authentication method was added! It can be
uses to authenticate SECURLY!!!! with the McFet Plugin! This is pretty
USEFULL!!!
2025-10-20 15:22:58 +02:00
7b16f85dd1 update gitignore 2025-10-17 14:27:00 +02:00
0a67502dc5 update README 2025-10-17 14:26:48 +02:00
34ec726c10 update docker compose 2025-10-17 14:25:48 +02:00
54f9394673 add nginx conf for homepage 2025-10-17 14:25:06 +02:00
fc8de40524 add dockerfile only for django project 2025-10-17 14:21:50 +02:00
fb3466ff63 change package management for developing to uv 2025-10-17 14:19:47 +02:00
cd9c81cfc2 add python-version file for uv 2025-10-17 14:12:46 +02:00
83cbf037fc deactivate pdf render 2025-10-17 00:57:41 +02:00
484dce8305 add rental calendar 2025-10-14 13:44:34 +02:00
1a47dd2165 Add autofocus to firstname field 2025-07-18 11:34:12 +02:00
1b73b94e07 Refactor baseform templates 2025-07-18 11:33:29 +02:00
7b78368eb0 Set logging level for Image module to info 2025-07-16 22:53:07 +02:00
8939fe5776 improve form layout 2025-07-16 22:33:12 +02:00
96b2549503 better file display 2025-07-16 22:30:47 +02:00
60f231d908 fix css style 2025-07-16 21:16:56 +02:00
42b80bd143 add Verleihformular 2025-07-16 19:21:47 +02:00
15e8ffc3c8 remove dead code 2025-07-05 12:07:50 +02:00
ead98785de remove feature 'fee' 2025-06-25 23:30:15 +02:00
0ae2c86e90 update django to 5.2.3 2025-06-19 16:34:58 +02:00
f107c3dd13 update segno to 1.6.6 2025-06-19 16:34:36 +02:00
d975477705 update pypdf to 5.6.0 2025-06-19 16:34:16 +02:00
022e8537c5 update html2text to 2025.4.15 2025-06-19 16:33:50 +02:00
6bc265bdd8 update djangorestframework to 3.16.0 2025-06-19 14:26:12 +02:00
5922340ebc formatting 2025-03-08 22:10:18 +01:00
c9c33d780f update tailwindcss to 3.4.17 and flowbite to 3.1.2 2025-03-08 21:59:54 +01:00
7a7ddc034b update mail address and message 2025-03-08 14:20:40 +01:00
4f57e01326 delete django-crontab 2025-03-05 21:59:08 +01:00
aef9a0871b update xhtml2pdf to 0.2.17 2025-03-05 21:44:45 +01:00
14617e5492 update django to 5.1.6 2025-03-05 21:42:06 +01:00
4ee9b3eaa5 update django-ckeditor to 6.7.2 2025-03-05 21:41:15 +01:00
faad8635e5 update django-environ to 0.12.0 2025-03-05 21:40:28 +01:00
ed9d115361 update django-filter to 25.1 2025-03-05 21:39:24 +01:00
b24a17b3b6 update django-taggit to 6.1.0 2025-03-05 21:15:52 +01:00
c0fe059e78 update pypdf to 5.3.1 2025-03-05 21:15:26 +01:00
4c669c0fb6 update python-dateutil to 2.9.0.post0 2025-03-05 21:15:01 +01:00
3db68f4bf4 add aria-label 2025-03-05 21:12:06 +01:00
77d18cf58c add detailview, mail sending and new db values 2025-03-05 21:11:03 +01:00
dc263ee28c ruff formating 2025-03-05 17:51:23 +01:00
97c01c4a97 add filter, search text and per page choices 2025-03-05 15:43:20 +01:00
c6684122ea add spacing 2025-03-05 14:06:43 +01:00
5b0b071564 add whatsapp channel 2025-02-25 21:32:05 +01:00
4e278fccab delete crontab 2025-02-22 18:32:03 +01:00
e17d12a079 use hyphen from tailwind-css instead of django-softhypen 2025-02-22 18:27:14 +01:00
1cfe36197f version is only visible for auth user 2025-02-22 18:17:53 +01:00
2e55fae418 Simplify if condition 2025-02-22 18:16:57 +01:00
c15d60ac6a update classes 2025-02-22 18:15:45 +01:00
e98da4426a update fields and wordings 2025-02-22 18:14:34 +01:00
97f2425434 fix max number of rental item filters 2025-02-22 16:12:18 +01:00
3adc98144f add rental 2025-02-22 15:24:13 +01:00
1f3fc92f6b add own bills to bankdata admin view 2025-02-07 14:45:41 +01:00
0ee85a2a77 fix import 2025-02-07 14:41:06 +01:00
6bbb92e9a9 add image extensions 2025-02-07 13:34:29 +01:00
23544cbaff fix type 2025-02-07 13:28:49 +01:00
58b74bdfab add fee 2025-02-07 13:26:47 +01:00
f6ffcd37da formatting 2025-02-04 00:42:25 +01:00
3fd408846e update django to 5.1.5 2025-02-04 00:41:21 +01:00
591b757a8e add python-dateutil 2025-02-04 00:40:35 +01:00
bc105eefcd Displayed only permanent and max 2 years old finance resolutions 2025-02-02 13:11:57 +01:00
2bc64cdc5b code optimization 2025-02-02 12:42:20 +01:00
ace625a530 update template to previous changes 2025-02-02 12:41:08 +01:00
b1e02bbf0a code optimization 2025-02-01 14:51:31 +01:00
ad74ae2c51 Code optimization 2025-02-01 01:21:44 +01:00
e68c2eca63 Renaming words 2025-01-29 23:32:59 +01:00
8121a45ead add default storage for easy thumbnail 2025-01-29 23:06:16 +01:00
c2b6dfa3e4 Add app model sorting for finance and alphabet sorting for others 2025-01-29 23:05:04 +01:00
a7ee650729 fix total being not zero when adding a new resolution 2025-01-29 19:48:36 +01:00
6d5694a153 format_html formatting 2025-01-27 01:05:33 +01:00
c897b5be08 replace string with enum 2025-01-27 01:04:55 +01:00
fcf63d8bf9 ruff formatting 2025-01-27 01:02:42 +01:00
f0d0c44fd6 djade formatting 2025-01-26 22:42:20 +01:00
f999a98d7c add a new Vorlage file, update number of bill to 10 and fix text to multiline 2025-01-26 22:06:16 +01:00
9b05663cf5 delete old stuffs 2025-01-26 15:12:57 +01:00
532b834629 update api key path 2025-01-26 13:13:56 +01:00
57b3e2144e update media url and context processor 2025-01-26 13:13:09 +01:00
5cac8f8275 change ldap auth to ldap backend to be able to program without ldap 2025-01-26 13:10:35 +01:00
dd401538d3 update mysqlclient to 2.2.7 2025-01-18 16:29:46 +01:00
08a0f43fff update pillow to 11.1.0 2025-01-18 16:28:36 +01:00
9663df15d3 update xhtml2pdf to 0.2.16 2025-01-18 16:18:19 +01:00
bf13b1ebd2 update pypdf to 5.1.0 2025-01-18 00:15:09 +01:00
e80094f1bf fix month number of January 2025-01-18 00:14:20 +01:00
2138f6da24 black formatting 2024-09-07 21:14:11 +02:00
be234907cc update django-filter to 24.3 2024-09-07 20:47:36 +02:00
0455c6ec62 update django-haystack to 3.3.0 2024-09-07 20:45:08 +02:00
f82582a449 update django-static-jquery-ui to 1.13.3.1 2024-09-07 20:23:25 +02:00
8c9f9702d7 update django-taggit to 6.0.0 2024-09-07 20:15:25 +02:00
8feb25d7f7 update djangorestframework to 3.15.2 2024-09-07 20:14:10 +02:00
c70f6228bd update easy-thumbnails to 2.9 2024-09-07 20:12:45 +02:00
eb232b7f56 update html2text to 2024.2.26 2024-09-07 20:03:57 +02:00
4bf74ded5a update segno to 1.6.1 2024-09-07 19:52:00 +02:00
f0763d2c05 update fontawesomefree to 6.6.0 2024-09-07 19:42:45 +02:00
a7d951dbab change duration of pinned events to 1 day 2024-09-06 16:21:27 +02:00
13d7969532 fix the order when getting next or prev post and at the post view 2024-08-25 20:37:17 +02:00
f121239d31 News are now pinned for 1 month and events for 7 days. 2024-08-21 16:59:27 +02:00
4134ad67d5 use correct variable for condtion 2024-08-11 12:21:17 +02:00
d8dec47c6a add listfilter for filter bills in periods 2024-08-10 17:51:30 +02:00
2f94b0f510 code formatting (black, isort and flake8) 2024-08-10 17:48:08 +02:00
9408208ed6 fix condition 2024-08-09 14:10:20 +02:00
555f4ebe49 del print 2024-08-06 01:34:15 +02:00
opruffy
3419f8b044 rework posts models and ep api 2024-08-06 01:30:39 +02:00
baa0845344 add link 'view on site' 2024-03-04 22:30:11 +00:00
2990cfd2cd add link to fetmeeting 2024-03-04 22:29:20 +00:00
797ff84b32 add wiref id to qs if wiref is already transferred 2024-03-04 18:04:12 +00:00
4d8088fb3e add mitmachen as a page 2024-02-23 15:17:23 +00:00
65b0e2494c rename incomplete 2024-02-17 10:53:21 +00:00
c831000fae bill creator is only required if a user add a new bill 2024-02-17 10:51:29 +00:00
2c80bb3c88 move shortcut icon 2024-02-17 10:26:00 +00:00
1bb359b322 add safe option to text of textarea 2024-02-17 10:25:34 +00:00
18f73b5f21 update getting cleaned data 2024-02-17 10:24:58 +00:00
a4cba458ee update django to 4.2.10 2024-02-06 22:58:04 +00:00
ce97a5f27e add affiliation to bill inline 2024-02-05 18:27:50 +00:00
de14fdc9d3 update text deco 2024-02-04 22:34:16 +00:00
dcc9f13804 add detail 2024-02-04 21:45:56 +00:00
c219059cb3 update design 2024-02-04 21:29:18 +00:00
0483c9b7dc update fontawesomefree to 6.5.1 2024-02-04 21:06:07 +00:00
36627adb94 update django-taggit to 5.0.1 2024-02-04 21:03:39 +00:00
04f878dd9f update django-filter to 23.5 2024-02-04 20:47:05 +00:00
3f8241cc63 del unused import 2024-01-30 22:23:19 +00:00
8dd9ab1511 use format_html instead of mark_safe 2024-01-30 22:19:47 +00:00
99b06b78a5 if no input, all posts are shown 2024-01-30 18:15:10 +00:00
ec3c11467f delete old flowbite version 2024-01-30 17:43:22 +00:00
d1c235f7cb black formatting 2024-01-30 17:31:33 +00:00
a23321a98b add incomplete status to update view and update other status here 2024-01-29 23:05:56 +00:00
491a81aece update migration 2024-01-29 21:46:01 +00:00
53d099a55c update assets 2024-01-29 21:43:49 +00:00
c16bcb9291 black 2024-01-29 21:43:35 +00:00
327b84d137 change pymupdf to pypdf 2024-01-28 10:31:01 +00:00
89eb72f8c1 fix syntax again 2024-01-28 08:59:57 +00:00
9359a1ae52 fix syntax 2024-01-28 08:54:50 +00:00
9f21a16ab3 add pymupdf again 2024-01-28 08:51:15 +00:00
8512c82d3f delete pymupdf temporary 2024-01-28 08:28:15 +00:00
6248a5343a fix again 2024-01-28 07:43:15 +00:00
a6bb11d64d fix again 2024-01-28 07:24:31 +00:00
3991895ac2 fix again 2024-01-28 07:12:43 +00:00
d91f4c6228 dix dockerfile again 2024-01-28 06:59:29 +00:00
2f4a53d1ce fix dockerfile 2024-01-28 06:44:30 +00:00
35749c2ff6 add mupdf-dev 2024-01-27 11:36:59 +00:00
f22de7d919 set PYMUPDF_SETUP_MUPDF_TESSERACT to 0 2024-01-27 11:09:07 +00:00
3e2d124a63 fix pymupdf req 2024-01-27 10:57:29 +00:00
21aaef068b update assets 2024-01-24 01:15:25 +00:00
803610ea5e optimize get url and get filename functions for agenda and protocol 2024-01-24 01:15:11 +00:00
f58006f6c6 update link to resolution list 2024-01-24 00:23:53 +00:00
3e2022f353 add order to jobs sidebar 2024-01-24 00:18:05 +00:00
7ca73f65f8 update flowbite to 2.2.1 2024-01-24 00:01:27 +00:00
762cda8b20 update design 2024-01-23 23:58:29 +00:00
5f5414f29a use PEP 572 2024-01-23 23:38:59 +00:00
2eadadc452 change breakpoint to lg 2024-01-23 22:52:41 +00:00
c0301d97fe login username is always lowercase 2024-01-23 19:53:37 +00:00
0f2e3a0d8a add bic as required if private payer 2024-01-23 19:11:43 +00:00
938c3e1bdd fix button 2024-01-23 01:33:09 +00:00
906c3da007 update text color 2024-01-23 00:59:40 +00:00
798dba3fe6 add saving button and iban/bic has no whitespace 2024-01-23 00:59:24 +00:00
aa2d8b385f update design for bill_update 2024-01-22 22:35:44 +00:00
aa5e45c430 fix div 2024-01-22 22:32:53 +00:00
d11dc8d7fe update design for bill_create 2024-01-22 22:15:53 +00:00
ced2a1dfab add option to list 2024-01-22 22:13:45 +00:00
706b711d22 change from pymupdf to pymupdfb 2024-01-22 16:31:08 +00:00
56cec2bc44 downgrade pymupdf to 1.23.9 2024-01-22 00:57:06 +00:00
7f139b2172 downgrade pymupdf to 1.23.11 2024-01-22 00:47:23 +00:00
d73d7b329f add package pymupdf 2024-01-21 23:49:40 +00:00
da3586b38e update assets 2024-01-21 22:32:24 +00:00
ff78e823db add migrations 2024-01-21 22:29:10 +00:00
bcf8956c05 update design and add pagination 2024-01-21 22:26:50 +00:00
77811f4017 add order by name 2024-01-18 22:53:33 +00:00
5db1887e40 add bic to admin list 2024-01-18 22:51:32 +00:00
0091339014 fix condition for changing status to submitted 2024-01-18 22:44:41 +00:00
51d6a89d11 add bank data if available 2024-01-17 20:05:56 +00:00
28d37933cd update django to 4.2.9 2024-01-17 19:52:13 +00:00
f01eb87f08 formatting 2024-01-17 19:47:06 +00:00
4b01e89265 add resolution update 2024-01-17 17:51:28 +00:00
9292eaf1cf add name 2024-01-17 17:49:43 +00:00
d11dace81f update bill list view 2024-01-17 17:40:38 +00:00
d560f56d86 update css 2024-01-17 17:38:28 +00:00
8c6685a12c add filter status 2024-01-17 14:33:21 +00:00
1b9a6aeec3 add automatically generation of wiref pdf 2024-01-17 14:32:09 +00:00
d83f14894c fix naming 2024-01-17 13:21:09 +00:00
4bb673f096 filter by opened status 2024-01-17 13:17:44 +00:00
5ce1b3b4f9 move qr code to admin fieldsets 2024-01-12 15:20:32 +00:00
54e8675b15 update status 2024-01-12 15:19:47 +00:00
e2cb2c8a90 update message 2024-01-10 10:28:46 +00:00
45279aac8d add status to wiref 2024-01-10 10:24:48 +00:00
d54a632d67 update ordering, queryset 2024-01-10 10:00:32 +00:00
fee676d0c5 add exception message 2024-01-07 12:20:37 +00:00
8073215888 add qr code 2024-01-05 20:18:24 +00:00
a0fd1844f2 fix import 2023-11-25 21:25:20 +00:00
8c17506a4b fix if condition 2023-11-25 21:19:23 +00:00
c9d4a09203 add optional if not required 2023-11-24 19:11:53 +00:00
dab1391a07 add autofocus 2023-11-24 18:58:45 +00:00
0682df6472 update form to baseform, autofocus to all form 2023-11-24 18:56:48 +00:00
3f9e41a7e7 add autofocus 2023-11-24 18:17:17 +00:00
46d715d96e add event_end as optional 2023-11-24 18:04:49 +00:00
21abfa5eda check if key exists before creating key and rename functions 2023-11-24 17:45:15 +00:00
eb782d879c add migration 2023-11-23 11:35:09 +00:00
cdb36aaf1a update django to 4.2.7 2023-11-23 11:34:20 +00:00
48f36b54f7 rework etherpad functions 2023-11-23 11:14:22 +00:00
c01d4bb4a4 simplify admin register 2023-11-21 18:55:08 +00:00
ec7e225783 isort 2023-11-20 21:43:18 +00:00
d2ffadf96a delete some task stuffs 2023-11-20 21:26:43 +00:00
39247b3e46 flake8 2023-11-20 21:26:14 +00:00
2ff9b47983 avoid pre-formatting log messages 2023-11-20 20:43:55 +00:00
e648a45aa9 delete unused imports 2023-11-20 20:26:38 +00:00
16fa0064dd add ordering and search fields 2023-11-18 16:56:03 +00:00
12b8d13a45 sorted by ID 2023-11-18 16:45:30 +00:00
178cb9e53f add representation to affiliation 2023-11-15 18:14:35 +00:00
3c387c22c6 add payer to list_filter 2023-11-15 18:13:38 +00:00
71117b8e63 created primary keys are not editable 2023-11-15 17:54:06 +00:00
b4a288be0a update string for resolution 2023-11-15 16:08:58 +00:00
6f94bceb08 add pillow because it only works with this version 9.5.0 2023-11-13 08:54:04 +00:00
13f7080503 delete app tasks 2023-11-13 08:52:18 +00:00
0a3e343adb set username if not equal 2023-11-13 08:50:39 +00:00
37b9375389 allow that you dont need a resolution if amount > 30 2023-10-27 11:16:56 +00:00
082ad8f0b9 set color for status incomplete 2023-10-27 09:44:03 +00:00
1c6c850689 allow creating a bill without resolution 2023-10-27 09:29:40 +00:00
b12e7d8f16 update django to 4.2.6 2023-10-27 08:31:42 +00:00
93a5be82a8 update django-filter to 23.3 2023-10-27 08:28:12 +00:00
a7b1033a87 update django-environ to 0.11.2 2023-10-27 08:22:37 +00:00
b6cd9d5b16 fix button 2023-10-27 08:17:26 +00:00
9433a58a0b update assets 2023-10-27 07:54:32 +00:00
17741daeb9 fix migrations 2023-10-27 07:15:49 +00:00
403684d558 fix username: blank is True 2023-10-27 07:14:22 +00:00
dc1a5bc405 add finance migrations 2023-10-27 06:45:21 +00:00
49d904c49d add memer migrations 2023-10-27 06:45:07 +00:00
3dc5d43d21 add a new status incomplete 2023-10-27 06:35:48 +00:00
bde7b72d40 fix description and image. New member can be created after log in. 2023-10-27 06:32:06 +00:00
a290ba8c9f set nickname if a member is created 2023-10-27 06:17:40 +00:00
6a1b576bbe delete finance perm check 2023-10-25 19:34:50 +00:00
4a6be8f75e check if user has finance perm 2023-10-25 10:43:17 +00:00
5a1222187a add creating resolution and view of them 2023-10-10 11:01:45 +00:00
afa05afcc0 fix if there is no instance, it throws an error 2023-09-18 11:39:34 +00:00
76eba4392e add done page for bill created 2023-09-18 09:10:56 +00:00
3a7d87c3eb fix wording 2023-09-18 09:10:00 +00:00
c8fd414f8c add wiref, bill inline, total 2023-09-18 07:38:36 +00:00
faf80d59f0 add colored status 2023-09-05 14:49:58 +00:00
9f37ab1097 fix wording 2023-08-29 11:50:04 +00:00
d23b4ef87b fix "mehr/weniger anzeigen" button 2023-08-29 10:13:06 +00:00
63679973f7 Update Redesign to 2.0.0 - Switched to CSP safe 2023-08-29 10:06:48 +00:00
91c5cd9dfc now it works to add the hastag fachschaft 2023-08-28 16:29:19 +00:00
0616849a6d update django-ckeditor to 6.7.0 2023-08-22 20:34:56 +00:00
67917dd05c update django to 4.2.4 2023-08-22 20:28:06 +00:00
308461b0c0 delete migrations 2023-08-22 20:23:43 +00:00
047eac7b5c fix import 2023-08-22 20:23:02 +00:00
647544b460 black 2023-08-22 20:14:00 +00:00
7d2091b0a9 add new feature finance (submit bill) 2023-08-22 20:10:38 +00:00
eeeeaa50dc add new and update existing baseforms 2023-08-22 20:03:57 +00:00
35bae02f48 fix icon 2023-08-07 15:51:59 +00:00
51a233ce92 update assets 2023-08-02 10:14:46 +00:00
f4991b863d add migrations 2023-08-02 09:34:30 +00:00
59c546a035 change superuser to user with all perms 2023-08-01 23:17:06 +00:00
7abc6f1d0d add event place to album 2023-08-01 23:05:46 +00:00
3107cd0806 add order to jobs 2023-08-01 22:42:53 +00:00
61b68ec8ea change admin title 2023-08-01 21:32:47 +00:00
eb0b4af9d7 black formatting 2023-08-01 19:35:23 +00:00
0d17f30d72 update authentications 2023-08-01 16:02:01 +00:00
70b017af9e add helptext 2023-07-10 19:02:06 +00:00
3cfab5e13e delete big first letter 2023-07-02 23:15:44 +00:00
24ceef1c7c add links 2023-06-25 10:18:28 +00:00
3d12454700 add migrations 2023-06-21 12:52:16 +00:00
a6d2c43a6c update close button because of django 4.2 2023-06-21 12:50:39 +00:00
a3d5e28ccd deprecation in django 5.0 2023-06-21 12:49:56 +00:00
ecf2871ba8 update django to 4.2.2 2023-06-21 12:48:49 +00:00
db01cb3a9c change wording to "Angeheftet" 2023-06-21 11:12:48 +00:00
842c19ad65 update django-environ to 0.10.0 2023-06-21 11:08:20 +00:00
2a2b8909db update django-filter to 23.2 2023-06-21 11:06:53 +00:00
0fcead7454 update django-taggit to 4.0.0 2023-06-21 10:51:12 +00:00
d38a76a341 update easy-thumbnails to 2.8.5 2023-06-21 10:43:17 +00:00
cae5221581 update fontawesomefree to 6.4.0 2023-06-21 10:36:55 +00:00
503bbe8237 fix pycairo 2023-06-21 10:21:56 +00:00
97d0fa97a2 update xhtml2pdf to 0.2.11 2023-06-21 09:50:43 +00:00
2dfaf326f1 fix url 2023-06-20 08:51:18 +00:00
db0b3b3b41 fix clean functions 2023-06-20 08:47:29 +00:00
18c114a1c5 black format 2023-06-20 07:59:39 +00:00
c05993dcba create pad rework 2023-05-31 21:56:01 +02:00
19e272e9be add libraries for pycairo install 2023-05-31 21:33:01 +02:00
d921336ff9 search script 2023-05-14 20:08:52 +02:00
5c1d62c9f6 Fix gallery thumbnail creation 2023-03-23 19:43:00 +01:00
294bffdef4 requirements txt 2023-03-23 19:11:42 +01:00
478619c1dd authentications fix 2023-03-23 17:49:49 +00:00
c69a4469da format 2023-03-23 17:49:41 +00:00
cd8eb957ec search 2 2023-03-23 17:48:05 +00:00
ffd9281df7 legacy search 2023-03-23 17:47:23 +00:00
6f7eab8c38 set decimal places to 2 2023-02-09 10:26:59 +00:00
c5a67ad37c swap next and prev 2023-01-30 09:24:00 +00:00
0a0282cdfa change 'Bearbeiten' to 'Speichern' 2023-01-29 21:48:47 +00:00
3d854c0617 add csrf token 2023-01-29 21:41:22 +00:00
46836370ef code styling 2023-01-29 21:38:23 +00:00
69b8b926c7 jobs order by name 2023-01-29 21:35:21 +00:00
6a32504e59 Merge branch 'master' of https://git.fet.at/bofh/fet2020 2023-01-13 13:51:16 +00:00
ea567f5a89 fix extend with wrong html file 2023-01-13 10:27:45 +00:00
d4edec9a09 Merge branch 'master' of https://git.fet.at/bofh/fet2020 2023-01-12 17:16:38 +01:00
92ef3b3fae updated docker-compose.yml according to test 2023-01-12 17:05:57 +01:00
67dd93dd2b change code to bash 2023-01-12 11:39:31 +00:00
3c0810d9a9 add code formatting 2023-01-12 11:19:50 +00:00
a04e4018c8 sorted jobs in member profile 2023-01-12 11:18:57 +00:00
5b52470f87 fix set active 2023-01-12 10:48:52 +00:00
1fc063a378 ordering member 2023-01-12 03:25:59 +00:00
2622e82500 fix set active 2023-01-12 03:21:53 +00:00
3b9be918bf jobs in profile, order by job name 2023-01-12 00:53:11 +00:00
a44fc0bfcb fix templatetag 2023-01-12 00:06:23 +00:00
d85e81b184 disable infoBox 2023-01-10 17:34:54 +00:00
c32619b703 add password change as a button in admin view 2023-01-10 17:30:27 +00:00
2b3302d9c4 isort formatting then black formatting 2023-01-09 18:22:26 +00:00
eca6d68dc3 Reordering imports 2023-01-09 16:34:02 +00:00
771eaa3917 black formatting 2023-01-09 16:25:51 +00:00
b47aa54ffe add tag while creating a new fetmeeting 2023-01-09 11:56:28 +00:00
f42e47a650 job sidebar as a templatetag 2023-01-08 12:42:02 +00:00
274257ff58 publish project version 2023-01-08 10:28:51 +00:00
cd28dd177d black formatting 2023-01-08 00:09:46 +00:00
eba93d87b1 delete unused context 2023-01-07 23:03:37 +00:00
b5f274328f update path names 2023-01-07 12:26:24 +00:00
5a8d993cbb fix get_app_list 2023-01-07 11:43:34 +00:00
a2ae24d0ae add change password 2023-01-06 16:03:33 +00:00
0ee942e296 simplify authentication 2023-01-06 14:40:02 +00:00
7fb89158a9 change loginPage to LoginView 2023-01-06 13:20:35 +00:00
b48a817e8c update assets 2023-01-02 20:12:29 +00:00
e213f41bb7 show related posts when there are more than one. 2023-01-02 19:44:54 +00:00
af7dbe74f3 fix tags in posts 2023-01-02 19:44:18 +00:00
1ca5049a06 move head.html to base.html 2023-01-02 17:46:26 +00:00
8c8d53a238 reorder import 2023-01-02 17:45:53 +00:00
632a097a25 fix form method 2023-01-02 17:40:36 +00:00
641d435d4e add speed dial and shortcut to create fetmeeting 2023-01-02 17:40:06 +00:00
3793aa914c update show to DetailViews, add UpdateViews and CreateView 2023-01-02 17:38:43 +00:00
7ab97c91b7 remove fotos and change resolver in nginx conf 2023-01-01 14:27:43 +01:00
1a3f87ef9e redo the healthchecks in test.yml 2023-01-01 11:56:01 +01:00
851c10c274 healthcheck test tag 2022-12-31 14:57:43 +01:00
0e0aeee5f0 modified etherpad healthcheck timeout 2022-12-31 14:43:29 +01:00
7365009e0f fix mysql version 2022-12-29 15:13:58 +01:00
a803c97307 custom network 2022-12-23 10:11:59 +01:00
afe4235a8f restart test_containers 2022-12-23 09:02:41 +01:00
c8daeb043e test etherpad version fixed to n1.8.17 2022-12-22 22:15:52 +01:00
83debd3824 import slugify in tasks migratgion 2022-12-22 19:35:10 +01:00
9a7245294b Merge branch 'master' of https://git.fet.at/bofh/fet2020 2022-12-22 19:12:06 +01:00
78e5f03830 no public sql port 2022-12-22 19:10:40 +01:00
55df4f266a healthcheck for etherpad sql 2022-12-22 19:10:01 +01:00
b0dfe25ac5 update dependencies 2022-12-21 12:23:19 +00:00
e8a772ea7f create migration according to howto from Django homepage 2022-12-21 12:04:39 +00:00
077f70bf9f delete logging, add update_fields 2022-12-21 11:30:01 +00:00
b2573b398e add debug and delete time for tests 2022-12-19 17:33:29 +00:00
8007480ed7 delete debug stuffs 2022-12-19 17:17:15 +00:00
3de3e2780e fix length 2022-12-19 16:27:03 +00:00
c0f85896f0 xrange to range 2022-12-19 11:49:19 +01:00
593f9025a1 intent fixed 2022-12-19 11:20:48 +01:00
fe83d69453 tasks migration 2022-12-19 11:16:11 +01:00
3c54be75d6 chekc for past ids 2022-12-19 11:09:53 +01:00
9b0a2cd70c increase length of randomid 2022-12-19 10:44:56 +01:00
c10091a9c9 extend length of taskid 2022-12-19 10:24:36 +01:00
2a01717033 Merge branch 'master' of https://git.fet.at/bofh/fet2020 2022-12-19 09:30:56 +01:00
191ffc682f docker test mysql for fet2020 2022-12-18 15:29:58 +01:00
a3f9965d87 add logging 2022-12-17 22:06:20 +00:00
131b5580c4 change volumes 2022-12-17 20:37:06 +00:00
5d0a31d7f0 delete links and add ports 2022-12-14 15:02:57 +00:00
830c7b7616 add links to test 2022-12-14 14:24:36 +00:00
96d78f0f32 fixing etherpad not getting healthy 2022-12-10 11:07:15 +01:00
6a3354c5c2 fix docker compose 2022-11-29 22:03:12 +00:00
9f7e4f3659 fix docker compose 2022-11-29 21:52:50 +00:00
2b52e6433b fix docker compose 2022-11-29 21:50:12 +00:00
df7b804b2b fix docker compose 2022-11-29 21:24:24 +00:00
3e8ffe058d fix docker compose 2022-11-29 21:05:01 +00:00
ee2bbdb4b8 fix docker compose 2022-11-29 20:55:16 +00:00
25f60c5dbf fix migration 2022-11-29 20:24:56 +00:00
d85728858f remove flaskfetfotos 2022-11-29 18:56:27 +00:00
081d612bff fix member url 2022-11-29 17:12:50 +00:00
dcdbb6ea68 add button to admin 2022-11-29 16:36:34 +00:00
35453ffe8b fix missing access to topic 2022-11-29 16:14:24 +00:00
66b5bc1603 update assets 2022-11-29 13:10:05 +00:00
9a59727124 fix PopUpNav 2022-11-29 13:07:54 +00:00
02130df21f search only for authenticated users 2022-11-29 12:48:51 +00:00
a8c52bdf7b fix alpine-js stuffs blocked by csp 2022-11-29 10:06:04 +00:00
a62ec0c2cb fix sitemaps 2022-11-28 10:17:07 +00:00
75cad5cc4c add alpine-js stuffs blocked by csp 2022-11-24 17:17:26 +00:00
7a5b888152 fix icon 2022-11-24 16:24:00 +00:00
e333bae8ca update assets part 7 2022-11-23 08:58:02 +00:00
608277f7de update assets part 6 2022-11-23 08:57:49 +00:00
c83e9fb93b update assets part 5 2022-11-23 08:57:11 +00:00
c609e7de5b update assets part 4 2022-11-23 08:56:53 +00:00
e019ec9965 update assets part 3 2022-11-23 08:55:59 +00:00
0470900951 update assets part 2 2022-11-23 08:55:21 +00:00
c2f3feb9b7 update assets part 1 2022-11-23 08:54:40 +00:00
f75cdcdae7 update blueimp-gallery to 3.4.0 2022-11-23 08:45:11 +00:00
dc3bdb59a3 update fontawesomefree to 6.2.0 2022-11-23 08:40:30 +00:00
eef6b59f9b fix migration 2022-11-21 21:57:21 +00:00
bc69f366df add dark mode button 2022-11-21 19:35:43 +00:00
916e7caaa5 change wording 2022-11-21 13:45:57 +00:00
76804d6c2a change jobs to section and blackboard to jobs 2022-11-21 13:43:26 +00:00
881eec0ec7 fix symbol 2022-11-21 13:09:47 +00:00
44e9dddf23 update Redesign to v1.2.0-dev 2022-11-21 11:56:52 +00:00
8ce674e2de merge branch 'master' 2022-11-21 10:28:38 +00:00
53ca22f003 update django-taggit to 3.1.0 2022-11-21 10:25:28 +00:00
f55b67e20f fix mapping for docker test 2022-11-20 22:29:09 +01:00
94c8fb7326 test dockerfile 2022-11-20 21:55:25 +01:00
9018fda102 fix alpine-js stuffs blocked by csp 2022-11-20 19:09:45 +00:00
ee357cae28 update test docker compose 2022-11-17 21:00:14 +01:00
f48c6439d0 add migration 2022-11-05 08:36:23 +00:00
f2e45d85cc fix migration 2022-10-21 08:35:49 +00:00
77d6536c61 delete unused imports and _-translation 2022-10-21 08:10:56 +00:00
6d72c7a2d3 add exception 2022-10-21 07:54:57 +00:00
8dfa69cf8d add search as a app 2022-10-17 09:44:26 +00:00
ce7529e871 delete local app 2022-10-17 09:43:30 +00:00
7dd6a91658 update django to 4.1.2 2022-10-17 08:17:36 +00:00
0cef42afbe update djangorestframework to 3.14.0 2022-10-17 07:28:38 +00:00
9149a6c690 update django-ckeditor to 6.5.1 2022-10-17 07:21:04 +00:00
6856 changed files with 576962 additions and 147798 deletions

View File

@@ -1,6 +0,0 @@
DEBUG=FALSE
HOST_NAME=uat1.2020.fet.at
SECRET_KEY=235t3groing43qo4ntgigon43qgi3q4gong
MYSQL_USER=user
MYSQL_PASSWORD=hgu
MYSQL_PORT=3306

9
.gitignore vendored
View File

@@ -1,7 +1,6 @@
.env/*
*.pyc
*_design1
fet2020/files/*
fet2020/.env/*
*.sqlite3
.theia/*
@@ -12,3 +11,11 @@ run
*~
APIKEY.txt
tmp
.ruff_cache
.venv
etherpad
files
flowbite
gallery
tailwind
whoosh_index

View File

@@ -1,17 +0,0 @@
{
"folders": [
{
"path": "fet2020"
}
],
"settings": {
"launch": {},
"python.linting.flake8Enabled": true,
"python.linting.banditEnabled": true,
"python.testing.pytestEnabled": true,
"python.linting.flake8Args": [
"--max-line-length=100"
]
}
}

View File

@@ -5,13 +5,43 @@ RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
RUN apk add --no-cache --virtual .build-deps ca-certificates gcc linux-headers \
musl-dev jpeg-dev zlib-dev libffi-dev mysql mariadb-dev freetype-dev\
musl-dev \
jpeg-dev \
zlib-dev \
libffi-dev \
mysql \
mariadb-dev \
freetype-dev \
# install for pymupdf
# && apk add --no-cache \
# libffi-dev \
# zlib-dev \
# freetype-dev \
# make \
# build-base \
# gcc \
# jbig2dec \
# jpeg-dev \
# harfbuzz-dev \
# libc-dev \
# mupdf-dev \
# musl-dev \
# openjpeg-dev \
# swig \
# && ln -s /usr/lib/libjbig2dec.so.0 /usr/lib/libjbig2dec.so \
# && pip install pymupdf==1.23.18 \
# upgrade pip
&& pip install --upgrade pip
# setting for pymupdf
# ENV PYMUPDF_SETUP_MUPDF_TESSERACT="0"
COPY ./fet2020/requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
# Remove virtual environment dependencies
# RUN apk del .builddeps
FROM tiangolo/uwsgi-nginx:python3.8-alpine

163
Readme.md
View File

@@ -1,11 +1,12 @@
##Fet 2020 Django Project
# Fet 2020 Django Project
Diese Webseite ist im Jahr 2020 entwickelt worden. Wir haben dazu einige Designentscheidungen getroffen:
1. Zunächst auf die externen Kernfunktionen fokusieren
1. Zunächst auf die externen Kernfunktionen fokussieren
2. Python + Django nutzen weil:
* Wir Python mögen
* Das Framework uns freiheit gibt zB die Mitglieder Daten entsprechend abzubilden
* Das Design unabhängig von der Funktion bleibt
* wir Python mögen
* das Framework uns die Freiheit gibt, zB die Mitglieder Daten entsprechend abzubilden
* das Design unabhängig von der Funktion bleibt
* und einiges mehr
3. Als Kernfunktionen festgelegt wurden anfangs:
* Neuigkeiten posten
@@ -14,48 +15,138 @@ Diese Webseite ist im Jahr 2020 entwickelt worden. Wir haben dazu einige Designe
* Informationen zu Mitgliedern anzeigen
4. Unter dem Eindruck eines Jahres des Lockdown wurde zusätzlich hinzugefügt
* Ein virtuelles Schwarzesbrett
* Eine virtuelle Aufgabenliste
### Ablage und Entwicklung
Der Master liegt auf dem virtuellen git Server und kann wie folgt geholt werden:
## Development
The main branch is hosted on the FET git server. Clone the repository using the following command:
```bash
git clone https://git.fet.at/bofh/fet2020
```
### Deployment
{{docker-compose.yml}}
<code>
docker-compose up
</code>
## Debug
### Command Befehle
If you are developing on Windows, install Visual Studio Code and Docker Desktop.
Erstellt die fehlenden Thumbs für die Alben in der Galerie:
<code>
python3 fet2020/manage.py create_thumbs
</code>
Add a local user/member for login because the project is not connected to FET LDAP in dev mode:
Erstellt alle Searchindexes neu:
<code>
```bash
python manage.py createsuperuser
```
### Python version
View all python versions:
```bash
uv python list
```
Installing Python executables:
```bash
uv python install $(.python-version) --default
```
Update the following files if the python version is increased:
* .python-version
* pyproject.toml
* run-pre-commit.sh
## Deployment
### Docker image for django
Makemigrations:
```bash
python fet2020/manage.py makemigrations blackboard core finance gallery members posts rental
```
```bash
python fet2020/manage.py makemigrations intern
```
Add all static files to the assets:
```bash
python fet2020/manage.py collectstatic
```
Check if the project is for deployment:
```bash
python fet2020/manage.py check --deploy
```
Build the docker image of django project:
```bash
docker build -t django-image -f fet2020/Dockerfile ./fet2020
```
### Docker image for nginx
Build the docker image of nginx:
```bash
docker build -t django-nginx-image -f nginx/Dockerfile ./nginx
```
### Start docker container
Build the docker containers:
```bash
docker compose -f docker-compose.yml up -d
```
Remove all unused docker images older than 24 hours:
```bash
docker image prune -a --filter "until=24h"
```
## Other Useful Commands
Please use the command carefully! Remove all unused docker volumes:
```bash
docker volume prune -a
```
Rebuilds all search indexes:
```bash
python3 fet2020/manage.py rebuild_index
</code>
```
Aktualisiert alle Searchindexes:
<code>
Updates all search indexes:
```bash
python3 fet2020/manage.py update_index
</code>
```
Fügt alle Cronjobs in diesem Projekt hinzu:
<code>
python3 fet2020/manage.py crontab add
</code>
## TODO
Fügt alle Staticfiles in die Assets hinzu:
<code>
python3 fet2020/manage.py collectstatic
</code>
ckeditor -> django-prose-editor
Überprüft, ob die Software bereit für die Produktion ist.
<code>
python3 fet2020/manage.py check --deploy
</code>
## Version History
Next
* Add rental
2.1.0
* Add finance system
2.0.0
* Update the homepage design
* Add intern
1.0.0
* First release of the new homepage

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,3 @@
#!/bin/sh
cd "$(dirname "$0")/.."
cp node_modules/jquery/dist/jquery.js js/vendor/

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"version":3,"sources":["blueimp-gallery.css","blueimp-gallery-indicator.css","blueimp-gallery-video.css"],"names":[],"mappings":"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"}
{"version":3,"sources":["blueimp-gallery.css","blueimp-gallery-indicator.css","blueimp-gallery-video.css"],"names":[],"mappings":"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"}

View File

Before

Width:  |  Height:  |  Size: 163 B

After

Width:  |  Height:  |  Size: 163 B

View File

Before

Width:  |  Height:  |  Size: 258 B

After

Width:  |  Height:  |  Size: 258 B

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 394 B

After

Width:  |  Height:  |  Size: 394 B

View File

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 166 B

After

Width:  |  Height:  |  Size: 166 B

View File

Before

Width:  |  Height:  |  Size: 194 B

After

Width:  |  Height:  |  Size: 194 B

View File

Before

Width:  |  Height:  |  Size: 432 B

After

Width:  |  Height:  |  Size: 432 B

View File

Before

Width:  |  Height:  |  Size: 434 B

After

Width:  |  Height:  |  Size: 434 B

View File

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 170 B

View File

Before

Width:  |  Height:  |  Size: 194 B

After

Width:  |  Height:  |  Size: 194 B

View File

Before

Width:  |  Height:  |  Size: 993 B

After

Width:  |  Height:  |  Size: 993 B

View File

Before

Width:  |  Height:  |  Size: 271 B

After

Width:  |  Height:  |  Size: 271 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

6768
assets/Gallery-3.4.0/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "blueimp-gallery",
"version": "3.3.0",
"version": "3.4.0",
"title": "blueimp Gallery",
"description": "blueimp Gallery is a touch-enabled, responsive and customizable image and video gallery, carousel and lightbox, optimized for both mobile and desktop web browsers. It features swipe, mouse and keyboard navigation, transition effects, slideshow functionality, fullscreen support and on-demand content loading and can be extended to display additional content types.",
"keywords": [
@@ -33,16 +33,17 @@
},
"license": "MIT",
"devDependencies": {
"clean-css-cli": "4",
"clean-css-cli": "5",
"eslint": "7",
"eslint-config-blueimp": "2",
"eslint-config-prettier": "6",
"eslint-plugin-jsdoc": "30",
"eslint-plugin-prettier": "3",
"eslint-config-prettier": "8",
"eslint-plugin-jsdoc": "36",
"eslint-plugin-prettier": "4",
"jquery": "1",
"prettier": "2",
"stylelint": "13",
"stylelint-config-prettier": "8",
"stylelint-config-recommended": "3",
"stylelint-config-recommended": "5",
"uglify-js": "3"
},
"stylelint": {
@@ -77,6 +78,7 @@
},
"scripts": {
"test": "stylelint '**/*.css' && eslint .",
"prebuild": "bin/sync-vendor-libs.sh",
"build:js": "cd js && uglifyjs blueimp-helper.js blueimp-gallery.js blueimp-gallery-fullscreen.js blueimp-gallery-indicator.js blueimp-gallery-video.js blueimp-gallery-vimeo.js blueimp-gallery-youtube.js --ie8 -c -m -o blueimp-gallery.min.js --source-map url=blueimp-gallery.min.js.map",
"build:jquery": "cd js && uglifyjs blueimp-gallery.js blueimp-gallery-fullscreen.js blueimp-gallery-indicator.js blueimp-gallery-video.js blueimp-gallery-vimeo.js blueimp-gallery-youtube.js jquery.blueimp-gallery.js --ie8 -c -m -o jquery.blueimp-gallery.min.js --source-map url=jquery.blueimp-gallery.min.js.map",
"build:css": "cd css && cleancss -c ie7 --source-map -o blueimp-gallery.min.css blueimp-gallery.css blueimp-gallery-indicator.css blueimp-gallery-video.css",

BIN
assets/Vorlage.pdf Normal file

Binary file not shown.

View File

@@ -2,9 +2,8 @@
DJANGO Admin styles
*/
@import url(fonts.css);
/* VARIABLE DEFINITIONS */
html[data-theme="light"],
:root {
--primary: #79aec8;
--secondary: #417690;
@@ -25,7 +24,7 @@
--breadcrumbs-link-fg: var(--body-bg);
--breadcrumbs-bg: var(--primary);
--link-fg: #447e9b;
--link-fg: #417893;
--link-hover-color: #036;
--link-selected-fg: #5b80b2;
@@ -47,48 +46,46 @@
--button-hover-bg: #609ab6;
--default-button-bg: var(--secondary);
--default-button-hover-bg: #205067;
--close-button-bg: #888; /* Previously #bbb, contrast 1.92 */
--close-button-hover-bg: #747474;
--close-button-bg: #747474;
--close-button-hover-bg: #333;
--delete-button-bg: #ba2121;
--delete-button-hover-bg: #a41515;
--object-tools-fg: var(--button-fg);
--object-tools-bg: var(--close-button-bg);
--object-tools-hover-bg: var(--close-button-hover-bg);
}
@media (prefers-color-scheme: dark) {
:root {
--primary: #264b5d;
--primary-fg: #eee;
--body-fg: #eeeeee;
--body-bg: #121212;
--body-quiet-color: #e0e0e0;
--body-loud-color: #ffffff;
--breadcrumbs-link-fg: #e0e0e0;
--breadcrumbs-bg: var(--primary);
--link-fg: #81d4fa;
--link-hover-color: #4ac1f7;
--link-selected-fg: #6f94c6;
--hairline-color: #272727;
--border-color: #353535;
--error-fg: #e35f5f;
--message-success-bg: #006b1b;
--message-warning-bg: #583305;
--message-error-bg: #570808;
--darkened-bg: #212121;
--selected-bg: #1b1b1b;
--selected-row: #00363a;
--close-button-bg: #333333;
--close-button-hover-bg: #666666;
}
--font-family-primary:
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
system-ui,
Roboto,
"Helvetica Neue",
Arial,
sans-serif,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol",
"Noto Color Emoji";
--font-family-monospace:
ui-monospace,
Menlo,
Monaco,
"Cascadia Mono",
"Segoe UI Mono",
"Roboto Mono",
"Oxygen Mono",
"Ubuntu Monospace",
"Source Code Pro",
"Fira Mono",
"Droid Sans Mono",
"Courier New",
monospace,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol",
"Noto Color Emoji";
}
html, body {
@@ -98,8 +95,8 @@ html, body {
body {
margin: 0;
padding: 0;
font-size: 14px;
font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
font-size: 0.875rem;
font-family: var(--font-family-primary);
color: var(--body-fg);
background: var(--body-bg);
}
@@ -151,12 +148,12 @@ h1,h2,h3,h4,h5 {
h1 {
margin: 0 0 20px;
font-weight: 300;
font-size: 20px;
font-size: 1.25rem;
color: var(--body-quiet-color);
}
h2 {
font-size: 16px;
font-size: 1rem;
margin: 1em 0 .5em 0;
}
@@ -166,20 +163,20 @@ h2.subhead {
}
h3 {
font-size: 14px;
font-size: 0.875rem;
margin: .8em 0 .3em 0;
color: var(--body-quiet-color);
font-weight: bold;
}
h4 {
font-size: 12px;
font-size: 0.75rem;
margin: 1em 0 .8em 0;
padding-bottom: 3px;
}
h5 {
font-size: 10px;
font-size: 0.625rem;
margin: 1.5em 0 .5em 0;
color: var(--body-quiet-color);
text-transform: uppercase;
@@ -196,8 +193,8 @@ li ul {
}
li, dt, dd {
font-size: 13px;
line-height: 20px;
font-size: 0.8125rem;
line-height: 1.25rem;
}
dt {
@@ -223,7 +220,7 @@ fieldset {
}
blockquote {
font-size: 11px;
font-size: 0.6875rem;
color: #777;
margin-left: 2px;
padding-left: 10px;
@@ -231,9 +228,9 @@ blockquote {
}
code, pre {
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
font-family: var(--font-family-monospace);
color: var(--body-quiet-color);
font-size: 12px;
font-size: 0.75rem;
overflow-x: auto;
}
@@ -255,22 +252,21 @@ hr {
border: none;
margin: 0;
padding: 0;
font-size: 1px;
line-height: 1px;
}
/* TEXT STYLES & MODIFIERS */
.small {
font-size: 11px;
font-size: 0.6875rem;
}
.mini {
font-size: 10px;
font-size: 0.625rem;
}
.help, p.help, form p.help, div.help, form div.help, div.help li {
font-size: 11px;
font-size: 0.6875rem;
color: var(--body-quiet-color);
}
@@ -300,7 +296,7 @@ p img, h1 img, h2 img, h3 img, h4 img, td img {
}
.hidden {
display: none;
display: none !important;
}
/* TABLES */
@@ -311,8 +307,8 @@ table {
}
td, th {
font-size: 13px;
line-height: 16px;
font-size: 0.8125rem;
line-height: 1rem;
border-bottom: 1px solid var(--hairline-color);
vertical-align: top;
padding: 8px;
@@ -327,7 +323,7 @@ thead th,
tfoot td {
color: var(--body-quiet-color);
padding: 5px 10px;
font-size: 11px;
font-size: 0.6875rem;
background: var(--body-bg);
border: none;
border-top: 1px solid var(--hairline-color);
@@ -437,7 +433,7 @@ table thead th.sorted .sortoptions a.sortremove:after {
top: -6px;
left: 3px;
font-weight: 200;
font-size: 18px;
font-size: 1.125rem;
color: var(--body-quiet-color);
}
@@ -476,9 +472,9 @@ input, textarea, select, .form-row p, form .button {
margin: 2px 0;
padding: 2px 3px;
vertical-align: middle;
font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif;
font-family: var(--font-family-primary);
font-weight: normal;
font-size: 13px;
font-size: 0.8125rem;
}
.form-row div.help {
padding: 2px 3px;
@@ -505,7 +501,7 @@ textarea:focus, select:focus, .vTextField:focus {
}
select {
height: 30px;
height: 1.875rem;
}
select[multiple] {
@@ -541,7 +537,6 @@ a.button {
}
.button.default, input[type=submit].default, .submit-row input.default {
float: right;
border: none;
font-weight: 400;
background: var(--default-button-bg);
@@ -589,7 +584,7 @@ input[type=button][disabled].default {
margin: 0;
padding: 8px;
font-weight: 400;
font-size: 13px;
font-size: 0.8125rem;
text-align: left;
background: var(--primary);
color: var(--header-link-color);
@@ -597,7 +592,7 @@ input[type=button][disabled].default {
.module caption,
.inline-group h2 {
font-size: 12px;
font-size: 0.75rem;
letter-spacing: 0.5px;
text-transform: uppercase;
}
@@ -616,12 +611,13 @@ ul.messagelist {
ul.messagelist li {
display: block;
font-weight: 400;
font-size: 13px;
font-size: 0.8125rem;
padding: 10px 10px 10px 65px;
margin: 0 0 10px 0;
background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat;
background-size: 16px auto;
color: var(--body-fg);
word-break: break-word;
}
ul.messagelist li.warning {
@@ -635,7 +631,7 @@ ul.messagelist li.error {
}
.errornote {
font-size: 14px;
font-size: 0.875rem;
font-weight: 700;
display: block;
padding: 10px 12px;
@@ -656,7 +652,7 @@ ul.errorlist {
}
ul.errorlist li {
font-size: 13px;
font-size: 0.8125rem;
display: block;
margin-bottom: 4px;
overflow-wrap: break-word;
@@ -697,7 +693,7 @@ td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea {
}
.description {
font-size: 12px;
font-size: 0.75rem;
padding: 5px 0 0 12px;
}
@@ -753,7 +749,7 @@ a.deletelink:focus, a.deletelink:hover {
/* OBJECT TOOLS */
.object-tools {
font-size: 10px;
font-size: 0.625rem;
font-weight: bold;
padding-left: 0;
float: right;
@@ -765,7 +761,7 @@ a.deletelink:focus, a.deletelink:hover {
display: block;
float: left;
margin-left: 5px;
height: 16px;
height: 1rem;
}
.object-tools a {
@@ -779,7 +775,7 @@ a.deletelink:focus, a.deletelink:hover {
background: var(--object-tools-bg);
color: var(--object-tools-fg);
font-weight: 400;
font-size: 11px;
font-size: 0.6875rem;
text-transform: uppercase;
letter-spacing: 0.5px;
}
@@ -808,14 +804,21 @@ a.deletelink:focus, a.deletelink:hover {
/* OBJECT HISTORY */
table#change-history {
#change-history table {
width: 100%;
}
table#change-history tbody th {
#change-history table tbody th {
width: 16em;
}
#change-history .paginator {
color: var(--body-quiet-color);
border-bottom: 1px solid var(--hairline-color);
background: var(--body-bg);
overflow: hidden;
}
/* PAGE STRUCTURE */
#container {
@@ -842,6 +845,20 @@ table#change-history tbody th {
max-width: 100%;
}
.skip-to-content-link {
position: absolute;
top: -999px;
margin: 5px;
padding: 5px;
background: var(--body-bg);
z-index: 1;
}
.skip-to-content-link:focus {
left: 0px;
top: 0px;
}
#content {
padding: 20px 40px;
}
@@ -905,7 +922,7 @@ table#change-history tbody th {
overflow: hidden;
}
#header a:link, #header a:visited {
#header a:link, #header a:visited, #logout-form button {
color: var(--header-link-color);
}
@@ -914,24 +931,25 @@ table#change-history tbody th {
}
#branding {
float: left;
display: flex;
}
#branding h1 {
padding: 0;
margin: 0 20px 0 0;
margin: 0;
margin-inline-end: 20px;
font-weight: 300;
font-size: 24px;
color: var(--accent);
font-size: 1.5rem;
color: var(--header-branding-color);
}
#branding h1, #branding h1 a:link, #branding h1 a:visited {
#branding h1 a:link, #branding h1 a:visited {
color: var(--accent);
}
#branding h2 {
padding: 0 10px;
font-size: 14px;
font-size: 0.875rem;
margin: -8px 0 8px 0;
font-weight: normal;
color: var(--header-color);
@@ -941,25 +959,43 @@ table#change-history tbody th {
text-decoration: none;
}
#logout-form {
display: inline;
}
#logout-form button {
background: none;
border: 0;
cursor: pointer;
font-family: var(--font-family-primary);
}
#user-tools {
float: right;
padding: 0;
margin: 0 0 0 20px;
font-weight: 300;
font-size: 11px;
letter-spacing: 0.5px;
text-transform: uppercase;
text-align: right;
}
#user-tools a {
#user-tools, #logout-form button{
padding: 0;
font-weight: 300;
font-size: 0.6875rem;
letter-spacing: 0.5px;
text-transform: uppercase;
}
#user-tools a, #logout-form button {
border-bottom: 1px solid rgba(255, 255, 255, 0.25);
}
#user-tools a:focus, #user-tools a:hover {
#user-tools a:focus, #user-tools a:hover,
#logout-form button:active, #logout-form button:hover {
text-decoration: none;
border-bottom-color: var(--primary);
color: var(--primary);
border-bottom: 0;
}
#logout-form button:active, #logout-form button:hover {
margin-bottom: 1px;
}
/* SIDEBAR */
@@ -979,7 +1015,7 @@ table#change-history tbody th {
}
#content-related h4 {
font-size: 13px;
font-size: 0.8125rem;
}
#content-related p {
@@ -1003,7 +1039,7 @@ table#change-history tbody th {
padding: 16px;
margin-bottom: 16px;
border-bottom: 1px solid var(--hairline-color);
font-size: 18px;
font-size: 1.125rem;
color: var(--body-fg);
}
@@ -1023,8 +1059,8 @@ table#change-history tbody th {
.delete-confirmation form .cancel-link {
display: inline-block;
vertical-align: middle;
height: 15px;
line-height: 15px;
height: 0.9375rem;
line-height: 0.9375rem;
border-radius: 4px;
padding: 10px 15px;
color: var(--button-fg);
@@ -1050,3 +1086,60 @@ table#change-history tbody th {
.popup #header {
padding: 10px 20px;
}
/* PAGINATOR */
.paginator {
display: flex;
align-items: center;
gap: 4px;
font-size: 0.8125rem;
padding-top: 10px;
padding-bottom: 10px;
line-height: 22px;
margin: 0;
border-top: 1px solid var(--hairline-color);
width: 100%;
}
.paginator a:link, .paginator a:visited {
padding: 2px 6px;
background: var(--button-bg);
text-decoration: none;
color: var(--button-fg);
}
.paginator a.showall {
border: none;
background: none;
color: var(--link-fg);
}
.paginator a.showall:focus, .paginator a.showall:hover {
background: none;
color: var(--link-hover-color);
}
.paginator .end {
margin-right: 6px;
}
.paginator .this-page {
padding: 2px 6px;
font-weight: bold;
font-size: 0.8125rem;
vertical-align: top;
}
.paginator a:focus, .paginator a:hover {
color: white;
background: var(--link-hover-color);
}
.paginator input {
margin-left: auto;
}
.base-svgs {
display: none;
}

View File

@@ -84,18 +84,18 @@
#toolbar form input {
border-radius: 4px;
font-size: 14px;
font-size: 0.875rem;
padding: 5px;
color: var(--body-fg);
}
#toolbar #searchbar {
height: 19px;
height: 1.1875rem;
border: 1px solid var(--border-color);
padding: 2px 5px;
margin: 0;
vertical-align: top;
font-size: 13px;
font-size: 0.8125rem;
max-width: 100%;
}
@@ -105,7 +105,7 @@
#toolbar form input[type="submit"] {
border: 1px solid var(--border-color);
font-size: 13px;
font-size: 0.8125rem;
padding: 4px 8px;
margin: 0;
vertical-align: middle;
@@ -140,7 +140,7 @@
}
#changelist-filter h2 {
font-size: 14px;
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 5px 15px;
@@ -148,12 +148,35 @@
border-bottom: none;
}
#changelist-filter h3 {
#changelist-filter h3,
#changelist-filter details summary {
font-weight: 400;
padding: 0 15px;
margin-bottom: 10px;
}
#changelist-filter details summary > * {
display: inline;
}
#changelist-filter details > summary {
list-style-type: none;
}
#changelist-filter details > summary::-webkit-details-marker {
display: none;
}
#changelist-filter details > summary::before {
content: '→';
font-weight: bold;
color: var(--link-hover-color);
}
#changelist-filter details[open] > summary::before {
content: '↓';
}
#changelist-filter ul {
margin: 5px 0;
padding: 0 15px 15px;
@@ -173,8 +196,7 @@
#changelist-filter a {
display: block;
color: var(--body-quiet-color);
text-overflow: ellipsis;
overflow-x: hidden;
word-break: break-word;
}
#changelist-filter li.selected {
@@ -194,83 +216,34 @@
}
#changelist-filter #changelist-filter-clear a {
font-size: 13px;
font-size: 0.8125rem;
padding-bottom: 10px;
border-bottom: 1px solid var(--hairline-color);
}
/* DATE DRILLDOWN */
.change-list ul.toplinks {
display: block;
float: left;
padding: 0;
margin: 0;
width: 100%;
}
.change-list ul.toplinks li {
padding: 3px 6px;
.change-list .toplinks {
display: flex;
padding-bottom: 5px;
flex-wrap: wrap;
gap: 3px 17px;
font-weight: bold;
list-style-type: none;
display: inline-block;
}
.change-list ul.toplinks .date-back a {
.change-list .toplinks a {
font-size: 0.8125rem;
}
.change-list .toplinks .date-back {
color: var(--body-quiet-color);
}
.change-list ul.toplinks .date-back a:focus,
.change-list ul.toplinks .date-back a:hover {
.change-list .toplinks .date-back:focus,
.change-list .toplinks .date-back:hover {
color: var(--link-hover-color);
}
/* PAGINATOR */
.paginator {
font-size: 13px;
padding-top: 10px;
padding-bottom: 10px;
line-height: 22px;
margin: 0;
border-top: 1px solid var(--hairline-color);
width: 100%;
}
.paginator a:link, .paginator a:visited {
padding: 2px 6px;
background: var(--button-bg);
text-decoration: none;
color: var(--button-fg);
}
.paginator a.showall {
border: none;
background: none;
color: var(--link-fg);
}
.paginator a.showall:focus, .paginator a.showall:hover {
background: none;
color: var(--link-hover-color);
}
.paginator .end {
margin-right: 6px;
}
.paginator .this-page {
padding: 2px 6px;
font-weight: bold;
font-size: 13px;
vertical-align: top;
}
.paginator a:focus, .paginator a:hover {
color: white;
background: var(--link-hover-color);
}
/* ACTIONS */
.filtered .actions {
@@ -282,7 +255,13 @@
vertical-align: baseline;
}
#changelist table tbody tr.selected {
/* Once the :has() pseudo-class is supported by all browsers, the tr.selected
selector and the JS adding the class can be removed. */
#changelist tbody tr.selected {
background-color: var(--selected-row);
}
#changelist tbody tr:has(.action-select:checked) {
background-color: var(--selected-row);
}
@@ -291,22 +270,16 @@
background: var(--body-bg);
border-top: none;
border-bottom: none;
line-height: 24px;
line-height: 1.5rem;
color: var(--body-quiet-color);
width: 100%;
}
#changelist .actions.selected { /* XXX Probably unused? */
background: var(--body-bg);
border-top: 1px solid var(--body-bg);
border-bottom: 1px solid #edecd6;
}
#changelist .actions span.all,
#changelist .actions span.action-counter,
#changelist .actions span.clear,
#changelist .actions span.question {
font-size: 13px;
font-size: 0.8125rem;
margin: 0 0.5em;
}
@@ -316,11 +289,11 @@
#changelist .actions select {
vertical-align: top;
height: 24px;
height: 1.5rem;
color: var(--body-fg);
border: 1px solid var(--border-color);
border-radius: 4px;
font-size: 14px;
font-size: 0.875rem;
padding: 0 0 0 4px;
margin: 0;
margin-left: 10px;
@@ -333,17 +306,17 @@
#changelist .actions label {
display: inline-block;
vertical-align: middle;
font-size: 13px;
font-size: 0.8125rem;
}
#changelist .actions .button {
font-size: 13px;
font-size: 0.8125rem;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--body-bg);
box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
cursor: pointer;
height: 24px;
height: 1.5rem;
line-height: 1;
padding: 4px 8px;
margin: 0;

View File

@@ -0,0 +1,137 @@
@media (prefers-color-scheme: dark) {
:root {
--primary: #264b5d;
--primary-fg: #f7f7f7;
--body-fg: #eeeeee;
--body-bg: #121212;
--body-quiet-color: #e0e0e0;
--body-loud-color: #ffffff;
--breadcrumbs-link-fg: #e0e0e0;
--breadcrumbs-bg: var(--primary);
--link-fg: #81d4fa;
--link-hover-color: #4ac1f7;
--link-selected-fg: #6f94c6;
--hairline-color: #272727;
--border-color: #353535;
--error-fg: #e35f5f;
--message-success-bg: #006b1b;
--message-warning-bg: #583305;
--message-error-bg: #570808;
--darkened-bg: #212121;
--selected-bg: #1b1b1b;
--selected-row: #00363a;
--close-button-bg: #333333;
--close-button-hover-bg: #666666;
}
}
html[data-theme="dark"] {
--primary: #264b5d;
--primary-fg: #f7f7f7;
--body-fg: #eeeeee;
--body-bg: #121212;
--body-quiet-color: #e0e0e0;
--body-loud-color: #ffffff;
--breadcrumbs-link-fg: #e0e0e0;
--breadcrumbs-bg: var(--primary);
--link-fg: #81d4fa;
--link-hover-color: #4ac1f7;
--link-selected-fg: #6f94c6;
--hairline-color: #272727;
--border-color: #353535;
--error-fg: #e35f5f;
--message-success-bg: #006b1b;
--message-warning-bg: #583305;
--message-error-bg: #570808;
--darkened-bg: #212121;
--selected-bg: #1b1b1b;
--selected-row: #00363a;
--close-button-bg: #333333;
--close-button-hover-bg: #666666;
}
/* THEME SWITCH */
.theme-toggle {
cursor: pointer;
border: none;
padding: 0;
background: transparent;
vertical-align: middle;
margin-inline-start: 5px;
margin-top: -1px;
}
.theme-toggle svg {
vertical-align: middle;
height: 1rem;
width: 1rem;
display: none;
}
/*
Fully hide screen reader text so we only show the one matching the current
theme.
*/
.theme-toggle .visually-hidden {
display: none;
}
html[data-theme="auto"] .theme-toggle .theme-label-when-auto {
display: block;
}
html[data-theme="dark"] .theme-toggle .theme-label-when-dark {
display: block;
}
html[data-theme="light"] .theme-toggle .theme-label-when-light {
display: block;
}
/* ICONS */
.theme-toggle svg.theme-icon-when-auto,
.theme-toggle svg.theme-icon-when-dark,
.theme-toggle svg.theme-icon-when-light {
fill: var(--header-link-color);
color: var(--header-bg);
}
html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto {
display: block;
}
html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark {
display: block;
}
html[data-theme="light"] .theme-toggle svg.theme-icon-when-light {
display: block;
}
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0,0,0,0);
white-space: nowrap;
border: 0;
color: var(--body-fg);
background-color: var(--body-bg);
}

View File

@@ -1,4 +1,7 @@
/* DASHBOARD */
.dashboard td, .dashboard th {
word-break: break-word;
}
.dashboard .module table th {
width: 100%;

View File

@@ -5,7 +5,7 @@
.form-row {
overflow: hidden;
padding: 10px;
font-size: 13px;
font-size: 0.8125rem;
border-bottom: 1px solid var(--hairline-color);
}
@@ -22,12 +22,24 @@ form .form-row p {
padding-left: 0;
}
.flex-container {
display: flex;
}
.form-multiline {
flex-wrap: wrap;
}
.form-multiline > div {
padding-bottom: 10px;
}
/* FORM LABELS */
label {
font-weight: normal;
color: var(--body-quiet-color);
font-size: 13px;
font-size: 0.8125rem;
}
.required label, label.required {
@@ -69,7 +81,7 @@ form ul.inline li {
.aligned label {
display: block;
padding: 4px 10px 0 0;
float: left;
min-width: 160px;
width: 160px;
word-wrap: break-word;
line-height: 1;
@@ -79,14 +91,14 @@ form ul.inline li {
content: '';
display: inline-block;
vertical-align: middle;
height: 26px;
height: 1.625rem;
}
.aligned label + p, .aligned label + div.help, .aligned label + div.readonly {
.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly {
padding: 6px 0;
margin-top: 0;
margin-bottom: 0;
margin-left: 170px;
margin-left: 0;
overflow-wrap: break-word;
}
@@ -117,16 +129,17 @@ form .aligned div.radiolist {
form .aligned p.help,
form .aligned div.help {
clear: left;
margin-top: 0;
margin-left: 160px;
padding-left: 10px;
}
form .aligned label + p.help,
form .aligned label + div.help {
form .aligned p.date div.help.timezonewarning,
form .aligned p.datetime div.help.timezonewarning,
form .aligned p.time div.help.timezonewarning {
margin-left: 0;
padding-left: 0;
font-weight: normal;
}
form .aligned p.help:last-child,
@@ -171,14 +184,7 @@ form .aligned table p {
width: 610px;
}
.checkbox-row p.help,
.checkbox-row div.help {
margin-left: 0;
padding-left: 0;
}
fieldset .fieldBox {
float: left;
margin-right: 20px;
}
@@ -189,6 +195,7 @@ fieldset .fieldBox {
}
form .wide p,
form .wide ul.errorlist,
form .wide input + p.help,
form .wide input + div.help {
margin-left: 200px;
@@ -196,7 +203,7 @@ form .wide input + div.help {
form .wide p.help,
form .wide div.help {
padding-left: 38px;
padding-left: 50px;
}
form div.help ul {
@@ -242,19 +249,21 @@ fieldset.collapsed .collapse-toggle {
/* MONOSPACE TEXTAREAS */
fieldset.monospace textarea {
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
font-family: var(--font-family-monospace);
}
/* SUBMIT ROW */
.submit-row {
padding: 12px 14px;
padding: 12px 14px 12px;
margin: 0 0 20px;
background: var(--darkened-bg);
border: 1px solid var(--hairline-color);
border-radius: 4px;
text-align: right;
overflow: hidden;
display: flex;
gap: 10px;
flex-wrap: wrap;
}
body.popup .submit-row {
@@ -262,32 +271,29 @@ body.popup .submit-row {
}
.submit-row input {
height: 35px;
line-height: 15px;
margin: 0 0 0 5px;
height: 2.1875rem;
line-height: 0.9375rem;
}
.submit-row input, .submit-row a {
margin: 0;
}
.submit-row input.default {
margin: 0 0 0 8px;
text-transform: uppercase;
}
.submit-row p {
margin: 0.3em;
}
.submit-row p.deletelink-box {
float: left;
margin: 0;
.submit-row a.deletelink {
margin-left: auto;
}
.submit-row a.deletelink {
display: block;
background: var(--delete-button-bg);
border-radius: 4px;
padding: 10px 15px;
height: 15px;
line-height: 15px;
padding: 0.625rem 0.9375rem;
height: 0.9375rem;
line-height: 0.9375rem;
color: var(--button-fg);
}
@@ -296,9 +302,8 @@ body.popup .submit-row {
background: var(--close-button-bg);
border-radius: 4px;
padding: 10px 15px;
height: 15px;
line-height: 15px;
margin: 0 0 0 5px;
height: 0.9375rem;
line-height: 0.9375rem;
color: var(--button-fg);
}
@@ -306,12 +311,14 @@ body.popup .submit-row {
.submit-row a.deletelink:hover,
.submit-row a.deletelink:active {
background: var(--delete-button-hover-bg);
text-decoration: none;
}
.submit-row a.closelink:focus,
.submit-row a.closelink:hover,
.submit-row a.closelink:active {
background: var(--close-button-hover-bg);
text-decoration: none;
}
/* CUSTOM FORM FIELDS */
@@ -353,10 +360,6 @@ body.popup .submit-row {
width: 2.2em;
}
.vTextField, .vUUIDField {
width: 20em;
}
.vIntegerField {
width: 5em;
}
@@ -369,6 +372,10 @@ body.popup .submit-row {
width: 5em;
}
.vTextField, .vUUIDField {
width: 20em;
}
/* INLINES */
.inline-group {
@@ -392,7 +399,7 @@ body.popup .submit-row {
margin: 0;
color: var(--body-quiet-color);
padding: 5px;
font-size: 13px;
font-size: 0.8125rem;
background: var(--darkened-bg);
border-top: 1px solid var(--hairline-color);
border-bottom: 1px solid var(--hairline-color);
@@ -404,7 +411,7 @@ body.popup .submit-row {
.inline-related h3 span.delete label {
margin-left: 2px;
font-size: 11px;
font-size: 0.6875rem;
}
.inline-related fieldset {
@@ -417,7 +424,7 @@ body.popup .submit-row {
.inline-related fieldset.module h3 {
margin: 0;
padding: 2px 5px 3px 5px;
font-size: 11px;
font-size: 0.6875rem;
text-align: left;
font-weight: bold;
background: #bcd;
@@ -458,7 +465,7 @@ body.popup .submit-row {
height: 1.1em;
padding: 2px 9px;
overflow: hidden;
font-size: 9px;
font-size: 0.5625rem;
font-weight: bold;
color: var(--body-quiet-color);
_width: 700px;
@@ -493,7 +500,7 @@ body.popup .submit-row {
.inline-group .tabular tr.add-row td a {
background: url(../img/icon-addlink.svg) 0 1px no-repeat;
padding-left: 16px;
font-size: 12px;
font-size: 0.75rem;
}
.empty-form {
@@ -511,8 +518,8 @@ body.popup .submit-row {
}
.related-lookup {
width: 16px;
height: 16px;
width: 1rem;
height: 1rem;
background-image: url(../img/search.svg);
}

View File

@@ -12,7 +12,7 @@
}
.login #header h1 {
font-size: 18px;
font-size: 1.125rem;
margin: 0;
}

View File

@@ -16,7 +16,7 @@
border-right: 1px solid var(--hairline-color);
background-color: var(--body-bg);
cursor: pointer;
font-size: 20px;
font-size: 1.25rem;
color: var(--link-fg);
padding: 0;
}
@@ -59,8 +59,13 @@
content: '\00AB';
}
.main > #nav-sidebar {
visibility: hidden;
}
.main.shifted > #nav-sidebar {
margin-left: 0;
visibility: visible;
}
[dir="rtl"] .main.shifted > #nav-sidebar {

View File

@@ -14,11 +14,11 @@ input[type="submit"], button {
td, th {
padding: 10px;
font-size: 14px;
font-size: 0.875rem;
}
.small {
font-size: 12px;
font-size: 0.75rem;
}
/* Layout */
@@ -28,7 +28,7 @@ input[type="submit"], button {
}
#content {
padding: 20px 30px 30px;
padding: 15px 20px 20px;
}
div.breadcrumbs {
@@ -45,7 +45,6 @@ input[type="submit"], button {
#branding h1 {
margin: 0 0 8px;
font-size: 20px;
line-height: 1.2;
}
@@ -88,7 +87,7 @@ input[type="submit"], button {
}
td .changelink, td .addlink {
font-size: 13px;
font-size: 0.8125rem;
}
/* Changelist */
@@ -105,13 +104,13 @@ input[type="submit"], button {
}
#changelist-search label {
line-height: 22px;
line-height: 1.375rem;
}
#toolbar form #searchbar {
flex: 1 0 auto;
width: 0;
height: 22px;
height: 1.375rem;
margin: 0 10px 0 6px;
}
@@ -131,10 +130,6 @@ input[type="submit"], button {
padding: 15px 0;
}
#changelist .actions.selected {
border: none;
}
#changelist .actions label {
display: flex;
}
@@ -152,7 +147,7 @@ input[type="submit"], button {
#changelist .actions span.clear,
#changelist .actions span.question,
#changelist .actions span.action-counter {
font-size: 11px;
font-size: 0.6875rem;
margin: 0 10px 0 0;
}
@@ -176,7 +171,7 @@ input[type="submit"], button {
/* Forms */
label {
font-size: 14px;
font-size: 0.875rem;
}
.form-row input[type=text],
@@ -191,12 +186,12 @@ input[type="submit"], button {
box-sizing: border-box;
margin: 0;
padding: 6px 8px;
min-height: 36px;
font-size: 14px;
min-height: 2.25rem;
font-size: 0.875rem;
}
.form-row select {
height: 36px;
height: 2.25rem;
}
.form-row select[multiple] {
@@ -204,12 +199,6 @@ input[type="submit"], button {
min-height: 0;
}
fieldset .fieldBox {
float: none;
margin: 0 -10px;
padding: 0 10px;
}
fieldset .fieldBox + .fieldBox {
margin-top: 10px;
padding-top: 10px;
@@ -236,6 +225,18 @@ input[type="submit"], button {
margin-left: 2px;
}
.submit-row {
padding: 8px;
}
.submit-row a.deletelink {
padding: 10px 7px;
}
.button, input[type=submit], input[type=button], .submit-row input, a.button {
padding: 7px;
}
/* Related widget */
.related-widget-wrapper {
@@ -383,22 +384,18 @@ input[type="submit"], button {
display: none;
}
form .form-row p.datetime {
width: 100%;
}
.datetime input {
width: 50%;
max-width: 120px;
}
.datetime span {
font-size: 13px;
font-size: 0.8125rem;
}
.datetime .timezonewarning {
display: block;
font-size: 11px;
font-size: 0.6875rem;
color: var(--body-quiet-color);
}
@@ -496,7 +493,7 @@ input[type="submit"], button {
#content-related .module h2 {
padding: 10px 15px;
font-size: 16px;
font-size: 1rem;
}
/* Changelist */
@@ -557,8 +554,6 @@ input[type="submit"], button {
.aligned .form-row,
.aligned .form-row > div {
display: flex;
flex-wrap: wrap;
max-width: 100vw;
}
@@ -566,6 +561,14 @@ input[type="submit"], button {
width: calc(100vw - 30px);
}
.flex-container {
flex-flow: column;
}
.flex-container.checkbox-row {
flex-flow: row;
}
textarea {
max-width: none;
}
@@ -585,6 +588,7 @@ input[type="submit"], button {
.aligned label {
width: 100%;
min-width: auto;
padding: 0 0 10px;
}
@@ -599,10 +603,6 @@ input[type="submit"], button {
max-width: 100%;
}
.aligned .checkbox-row {
align-items: center;
}
.aligned .checkbox-row input {
flex: 0 1 auto;
margin: 0;
@@ -621,8 +621,7 @@ input[type="submit"], button {
}
.aligned p.file-upload {
margin-left: 0;
font-size: 13px;
font-size: 0.8125rem;
}
span.clearable-file-input {
@@ -630,7 +629,7 @@ input[type="submit"], button {
}
span.clearable-file-input label {
font-size: 13px;
font-size: 0.8125rem;
padding-bottom: 0;
}
@@ -645,7 +644,8 @@ input[type="submit"], button {
padding: 0;
}
form .aligned ul {
form .aligned ul,
form .aligned ul.errorlist {
margin-left: 0;
padding-left: 0;
}
@@ -812,28 +812,23 @@ input[type="submit"], button {
/* Submit row */
.submit-row {
padding: 10px 10px 0;
padding: 10px;
margin: 0 0 15px;
display: flex;
flex-direction: column;
gap: 8px;
}
.submit-row > * {
width: 100%;
}
.submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink {
float: none;
margin: 0 0 10px;
.submit-row input, .submit-row input.default, .submit-row a {
text-align: center;
}
.submit-row a.closelink {
padding: 10px 0;
text-align: center;
}
.submit-row p.deletelink-box {
order: 4;
.submit-row a.deletelink {
margin: 0;
}
/* Messages */
@@ -907,7 +902,7 @@ input[type="submit"], button {
.errornote {
margin: 0 0 20px;
padding: 8px 12px;
font-size: 13px;
font-size: 0.8125rem;
}
/* Calendar and clock */
@@ -954,8 +949,8 @@ input[type="submit"], button {
.calendar-shortcuts {
padding: 10px 0;
font-size: 12px;
line-height: 12px;
font-size: 0.75rem;
line-height: 0.75rem;
}
.calendar-shortcuts a {
@@ -987,7 +982,7 @@ input[type="submit"], button {
/* History */
table#change-history tbody th, table#change-history tbody td {
font-size: 13px;
font-size: 0.8125rem;
word-break: break-word;
}
@@ -998,7 +993,7 @@ input[type="submit"], button {
/* Docs */
table.model tbody th, table.model tbody td {
font-size: 13px;
font-size: 0.8125rem;
word-break: break-word;
}
}

View File

@@ -69,7 +69,8 @@
margin-right: 15px;
}
[dir="rtl"] .aligned ul {
[dir="rtl"] .aligned ul,
[dir="rtl"] form .aligned ul.errorlist {
margin-right: 0;
}
@@ -77,4 +78,7 @@
margin-left: 0;
margin-right: 0;
}
[dir="rtl"] .aligned .vCheckboxLabel {
padding: 1px 5px 0 0;
}
}

View File

@@ -107,23 +107,25 @@ thead th.sorted .text {
border-left: none;
}
.paginator .end {
margin-left: 6px;
margin-right: 0;
}
.paginator input {
margin-left: 0;
margin-right: auto;
}
/* FORMS */
.aligned label {
padding: 0 0 3px 1em;
float: right;
}
.submit-row {
text-align: left
}
.submit-row p.deletelink-box {
float: right;
}
.submit-row input.default {
.submit-row a.deletelink {
margin-left: 0;
margin-right: auto;
}
.vDateField, .vTimeField {
@@ -134,13 +136,11 @@ thead th.sorted .text {
margin-left: 5px;
}
form .aligned p.help, form .aligned div.help {
clear: right;
}
form .aligned ul {
margin-right: 163px;
padding-right: 10px;
margin-left: 0;
padding-left: 0;
}
form ul.inline li {
@@ -149,12 +149,39 @@ form ul.inline li {
padding-left: 7px;
}
input[type=submit].default, .submit-row input.default {
float: left;
form .aligned p.help,
form .aligned div.help {
margin-right: 160px;
padding-right: 10px;
}
form div.help ul,
form .aligned .checkbox-row + .help,
form .aligned p.date div.help.timezonewarning,
form .aligned p.datetime div.help.timezonewarning,
form .aligned p.time div.help.timezonewarning {
margin-right: 0;
padding-right: 0;
}
form .wide p.help, form .wide div.help {
padding-left: 0;
padding-right: 50px;
}
form .wide p,
form .wide ul.errorlist,
form .wide input + p.help,
form .wide input + div.help {
margin-right: 200px;
margin-left: 0px;
}
.submit-row {
text-align: right;
}
fieldset .fieldBox {
float: right;
margin-left: 20px;
margin-right: 0;
}
@@ -175,12 +202,24 @@ fieldset .fieldBox {
top: 0;
left: auto;
right: 10px;
background: url(../img/calendar-icons.svg) 0 -30px no-repeat;
}
.calendarbox .calendarnav-previous:focus,
.calendarbox .calendarnav-previous:hover {
background-position: 0 -45px;
}
.calendarnav-next {
top: 0;
right: auto;
left: 10px;
background: url(../img/calendar-icons.svg) 0 0 no-repeat;
}
.calendarbox .calendarnav-next:focus,
.calendarbox .calendarnav-next:hover {
background-position: 0 -15px;
}
.calendar caption, .calendarbox h2 {
@@ -195,6 +234,38 @@ fieldset .fieldBox {
text-align: right;
}
.selector-add {
background: url(../img/selector-icons.svg) 0 -64px no-repeat;
}
.active.selector-add:focus, .active.selector-add:hover {
background-position: 0 -80px;
}
.selector-remove {
background: url(../img/selector-icons.svg) 0 -96px no-repeat;
}
.active.selector-remove:focus, .active.selector-remove:hover {
background-position: 0 -112px;
}
a.selector-chooseall {
background: url(../img/selector-icons.svg) right -128px no-repeat;
}
a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
background-position: 100% -144px;
}
a.selector-clearall {
background: url(../img/selector-icons.svg) 0 -160px no-repeat;
}
a.active.selector-clearall:focus, a.active.selector-clearall:hover {
background-position: 0 -176px;
}
.inline-deletelink {
float: left;
}

View File

@@ -3,22 +3,21 @@
.selector {
width: 800px;
float: left;
display: flex;
}
.selector select {
width: 380px;
height: 17.2em;
flex: 1 0 auto;
}
.selector-available, .selector-chosen {
float: left;
width: 380px;
text-align: center;
margin-bottom: 5px;
}
.selector-chosen select {
border-top: none;
display: flex;
flex-direction: column;
}
.selector-available h2, .selector-chosen h2 {
@@ -26,6 +25,21 @@
border-radius: 4px 4px 0 0;
}
.selector-chosen .list-footer-display {
border: 1px solid var(--border-color);
border-top: none;
border-radius: 0 0 4px 4px;
margin: 0 0 10px;
padding: 8px;
text-align: center;
background: var(--primary);
color: var(--header-link-color);
cursor: pointer;
}
.selector-chosen .list-footer-display__clear {
color: var(--breadcrumbs-fg);
}
.selector-chosen h2 {
background: var(--primary);
color: var(--header-link-color);
@@ -41,7 +55,7 @@
border-width: 0 1px;
padding: 8px;
color: var(--body-quiet-color);
font-size: 10px;
font-size: 0.625rem;
margin: 0;
text-align: left;
}
@@ -55,20 +69,23 @@
padding: 0;
overflow: hidden;
line-height: 1;
min-width: auto;
}
.selector .selector-available input {
.selector .selector-available input,
.selector .selector-chosen input {
width: 320px;
margin-left: 8px;
}
.selector ul.selector-chooser {
float: left;
align-self: center;
width: 22px;
background-color: var(--selected-bg);
border-radius: 10px;
margin: 10em 5px 0 5px;
margin: 0 5px;
padding: 0;
transform: translateY(-17px);
}
.selector-chooser li {
@@ -82,6 +99,15 @@
margin: 0 0 10px;
border-radius: 0 0 4px 4px;
}
.selector .selector-chosen--with-filtered select {
margin: 0;
border-radius: 0;
height: 14em;
}
.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display {
display: none;
}
.selector-add, .selector-remove {
width: 16px;
@@ -168,6 +194,7 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover {
.stacked {
float: left;
width: 490px;
display: block;
}
.stacked select {
@@ -193,6 +220,7 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover {
margin: 0 0 10px 40%;
background-color: #eee;
border-radius: 10px;
transform: none;
}
.stacked .selector-chooser li {
@@ -250,8 +278,8 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover {
.selector .search-label-icon {
background: url(../img/search.svg) 0 0 no-repeat;
display: inline-block;
height: 18px;
width: 18px;
height: 1.125rem;
width: 1.125rem;
}
/* DATE AND TIME */
@@ -267,7 +295,7 @@ p.datetime {
.datetime span {
white-space: nowrap;
font-weight: normal;
font-size: 11px;
font-size: 0.6875rem;
color: var(--body-quiet-color);
}
@@ -277,7 +305,7 @@ p.datetime {
}
table p.datetime {
font-size: 11px;
font-size: 0.6875rem;
margin-left: 0;
padding-left: 0;
}
@@ -311,7 +339,7 @@ table p.datetime {
}
.timezonewarning {
font-size: 11px;
font-size: 0.6875rem;
color: var(--body-quiet-color);
}
@@ -322,7 +350,7 @@ p.url {
margin: 0;
padding: 0;
color: var(--body-quiet-color);
font-size: 11px;
font-size: 0.6875rem;
font-weight: bold;
}
@@ -337,14 +365,10 @@ p.file-upload {
margin: 0;
padding: 0;
color: var(--body-quiet-color);
font-size: 11px;
font-size: 0.6875rem;
font-weight: bold;
}
.aligned p.file-upload {
margin-left: 170px;
}
.file-upload a {
font-weight: normal;
}
@@ -355,7 +379,7 @@ p.file-upload {
span.clearable-file-input label {
color: var(--body-fg);
font-size: 11px;
font-size: 0.6875rem;
display: inline;
float: none;
}
@@ -364,7 +388,7 @@ span.clearable-file-input label {
.calendarbox, .clockbox {
margin: 5px auto;
font-size: 12px;
font-size: 0.75rem;
width: 19em;
text-align: center;
background: var(--body-bg);
@@ -398,7 +422,7 @@ span.clearable-file-input label {
text-align: center;
border-top: none;
font-weight: 700;
font-size: 12px;
font-size: 0.75rem;
color: #333;
background: var(--accent);
}
@@ -408,14 +432,14 @@ span.clearable-file-input label {
background: var(--darkened-bg);
border-bottom: 1px solid var(--border-color);
font-weight: 400;
font-size: 12px;
font-size: 0.75rem;
text-align: center;
color: var(--body-quiet-color);
}
.calendar td {
font-weight: 400;
font-size: 12px;
font-size: 0.75rem;
text-align: center;
padding: 0;
border-top: 1px solid var(--hairline-color);
@@ -455,7 +479,7 @@ span.clearable-file-input label {
}
.calendarnav {
font-size: 10px;
font-size: 0.625rem;
text-align: center;
color: #ccc;
margin: 0;
@@ -470,8 +494,8 @@ span.clearable-file-input label {
.calendar-shortcuts {
background: var(--body-bg);
color: var(--body-quiet-color);
font-size: 11px;
line-height: 11px;
font-size: 0.6875rem;
line-height: 0.6875rem;
border-top: 1px solid var(--hairline-color);
padding: 8px 0;
}
@@ -509,7 +533,7 @@ span.clearable-file-input label {
.calendar-cancel {
margin: 0;
padding: 4px 0;
font-size: 12px;
font-size: 0.75rem;
background: #eee;
border-top: 1px solid var(--border-color);
color: var(--body-fg);
@@ -572,3 +596,9 @@ select + .related-widget-wrapper-link,
.related-widget-wrapper-link + .related-widget-wrapper-link {
margin-left: 7px;
}
/* GIS MAPS */
.dj_map {
width: 600px;
height: 400px;
}

View File

@@ -41,6 +41,10 @@
}
SelectBox.redisplay(id);
},
get_hidden_node_count(id) {
const cache = SelectBox.cache[id] || [];
return cache.filter(node => node.displayed === 0).length;
},
delete_from_cache: function(id, value) {
let delete_index = null;
const cache = SelectBox.cache[id];

View File

@@ -78,7 +78,7 @@ Requires core.js and SelectBox.js.
remove_link.className = 'selector-remove';
// <div class="selector-chosen">
const selector_chosen = quickElement('div', selector_div);
const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen');
selector_chosen.className = 'selector-chosen';
const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
quickElement(
@@ -94,8 +94,29 @@ Requires core.js and SelectBox.js.
)
);
const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected');
filter_selected_p.className = 'selector-filter';
const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input');
quickElement(
'span', search_filter_selected_label, '',
'class', 'help-tooltip search-label-icon',
'title', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name])
);
filter_selected_p.appendChild(document.createTextNode(' '));
const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter"));
filter_selected_input.id = field_id + '_selected_input';
const to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', '', 'size', from_box.size, 'name', from_box.name);
to_box.className = 'filtered';
const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display');
quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text');
quickElement('span', warning_footer, ' (click to clear)', 'class', 'list-footer-display__clear');
const clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link');
clear_all.className = 'selector-clearall';
@@ -106,6 +127,8 @@ Requires core.js and SelectBox.js.
if (elem.classList.contains('active')) {
move_func(from, to);
SelectFilter.refresh_icons(field_id);
SelectFilter.refresh_filtered_selects(field_id);
SelectFilter.refresh_filtered_warning(field_id);
}
e.preventDefault();
};
@@ -121,14 +144,29 @@ Requires core.js and SelectBox.js.
clear_all.addEventListener('click', function(e) {
move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from');
});
warning_footer.addEventListener('click', function(e) {
filter_selected_input.value = '';
SelectBox.filter(field_id + '_to', '');
SelectFilter.refresh_filtered_warning(field_id);
SelectFilter.refresh_icons(field_id);
});
filter_input.addEventListener('keypress', function(e) {
SelectFilter.filter_key_press(e, field_id);
SelectFilter.filter_key_press(e, field_id, '_from', '_to');
});
filter_input.addEventListener('keyup', function(e) {
SelectFilter.filter_key_up(e, field_id);
SelectFilter.filter_key_up(e, field_id, '_from');
});
filter_input.addEventListener('keydown', function(e) {
SelectFilter.filter_key_down(e, field_id);
SelectFilter.filter_key_down(e, field_id, '_from', '_to');
});
filter_selected_input.addEventListener('keypress', function(e) {
SelectFilter.filter_key_press(e, field_id, '_to', '_from');
});
filter_selected_input.addEventListener('keyup', function(e) {
SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input');
});
filter_selected_input.addEventListener('keydown', function(e) {
SelectFilter.filter_key_down(e, field_id, '_to', '_from');
});
selector_div.addEventListener('change', function(e) {
if (e.target.tagName === 'SELECT') {
@@ -146,6 +184,7 @@ Requires core.js and SelectBox.js.
}
});
from_box.closest('form').addEventListener('submit', function() {
SelectBox.filter(field_id + '_to', '');
SelectBox.select_all(field_id + '_to');
});
SelectBox.init(field_id + '_from');
@@ -153,24 +192,6 @@ Requires core.js and SelectBox.js.
// Move selected from_box options to to_box
SelectBox.move(field_id + '_from', field_id + '_to');
if (!is_stacked) {
// In horizontal mode, give the same height to the two boxes.
const j_from_box = document.getElementById(field_id + '_from');
const j_to_box = document.getElementById(field_id + '_to');
let height = filter_p.offsetHeight + j_from_box.offsetHeight;
const j_to_box_style = window.getComputedStyle(j_to_box);
if (j_to_box_style.getPropertyValue('box-sizing') === 'border-box') {
// Add the padding and border to the final height.
height += parseInt(j_to_box_style.getPropertyValue('padding-top'), 10)
+ parseInt(j_to_box_style.getPropertyValue('padding-bottom'), 10)
+ parseInt(j_to_box_style.getPropertyValue('border-top-width'), 10)
+ parseInt(j_to_box_style.getPropertyValue('border-bottom-width'), 10);
}
j_to_box.style.height = height + 'px';
}
// Initial icon refresh
SelectFilter.refresh_icons(field_id);
},
@@ -181,6 +202,24 @@ Requires core.js and SelectBox.js.
field.required = false;
return any_selected;
},
refresh_filtered_warning: function(field_id) {
const count = SelectBox.get_hidden_node_count(field_id + '_to');
const selector = document.getElementById(field_id + '_selector_chosen');
const warning = document.getElementById(field_id + '_list-footer-display-text');
selector.className = selector.className.replace('selector-chosen--with-filtered', '');
warning.textContent = interpolate(ngettext(
'%s selected option not visible',
'%s selected options not visible',
count
), [count]);
if(count > 0) {
selector.className += ' selector-chosen--with-filtered';
}
},
refresh_filtered_selects: function(field_id) {
SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value);
SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value);
},
refresh_icons: function(field_id) {
const from = document.getElementById(field_id + '_from');
const to = document.getElementById(field_id + '_to');
@@ -190,39 +229,47 @@ Requires core.js and SelectBox.js.
// Active if the corresponding box isn't empty
document.getElementById(field_id + '_add_all_link').classList.toggle('active', from.querySelector('option'));
document.getElementById(field_id + '_remove_all_link').classList.toggle('active', to.querySelector('option'));
SelectFilter.refresh_filtered_warning(field_id);
},
filter_key_press: function(event, field_id) {
const from = document.getElementById(field_id + '_from');
filter_key_press: function(event, field_id, source, target) {
const source_box = document.getElementById(field_id + source);
// don't submit form if user pressed Enter
if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) {
from.selectedIndex = 0;
SelectBox.move(field_id + '_from', field_id + '_to');
from.selectedIndex = 0;
source_box.selectedIndex = 0;
SelectBox.move(field_id + source, field_id + target);
source_box.selectedIndex = 0;
event.preventDefault();
}
},
filter_key_up: function(event, field_id) {
const from = document.getElementById(field_id + '_from');
const temp = from.selectedIndex;
SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
from.selectedIndex = temp;
filter_key_up: function(event, field_id, source, filter_input) {
const input = filter_input || '_input';
const source_box = document.getElementById(field_id + source);
const temp = source_box.selectedIndex;
SelectBox.filter(field_id + source, document.getElementById(field_id + input).value);
source_box.selectedIndex = temp;
SelectFilter.refresh_filtered_warning(field_id);
SelectFilter.refresh_icons(field_id);
},
filter_key_down: function(event, field_id) {
const from = document.getElementById(field_id + '_from');
filter_key_down: function(event, field_id, source, target) {
const source_box = document.getElementById(field_id + source);
// right key (39) or left key (37)
const direction = source === '_from' ? 39 : 37;
// right arrow -- move across
if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) {
const old_index = from.selectedIndex;
SelectBox.move(field_id + '_from', field_id + '_to');
from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index;
if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) {
const old_index = source_box.selectedIndex;
SelectBox.move(field_id + source, field_id + target);
SelectFilter.refresh_filtered_selects(field_id);
SelectFilter.refresh_filtered_warning(field_id);
source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index;
return;
}
// down arrow -- wrap around
if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) {
from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1;
}
// up arrow -- wrap around
if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) {
from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1;
source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1;
}
}
};

View File

@@ -90,10 +90,9 @@
}
message = interpolate(message, [timezoneOffset]);
const warning = document.createElement('span');
warning.className = warningClass;
const warning = document.createElement('div');
warning.classList.add('help', warningClass);
warning.textContent = message;
inp.parentNode.appendChild(document.createElement('br'));
inp.parentNode.appendChild(warning);
},
// Add clock widget to a given field
@@ -388,13 +387,7 @@
DateTimeShortcuts.calendars[num].drawNextMonth();
},
handleCalendarCallback: function(num) {
let format = get_format('DATE_INPUT_FORMATS')[0];
// the format needs to be escaped a little
format = format.replace('\\', '\\\\')
.replace('\r', '\\r')
.replace('\n', '\\n')
.replace('\t', '\\t')
.replace("'", "\\'");
const format = get_format('DATE_INPUT_FORMATS')[0];
return function(y, m, d) {
DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format);
DateTimeShortcuts.calendarInputs[num].focus();

View File

@@ -4,14 +4,43 @@
'use strict';
{
const $ = django.jQuery;
let popupIndex = 0;
const relatedWindows = [];
function dismissChildPopups() {
relatedWindows.forEach(function(win) {
if(!win.closed) {
win.dismissChildPopups();
win.close();
}
});
}
function setPopupIndex() {
if(document.getElementsByName("_popup").length > 0) {
const index = window.name.lastIndexOf("__") + 2;
popupIndex = parseInt(window.name.substring(index));
} else {
popupIndex = 0;
}
}
function addPopupIndex(name) {
return name + "__" + (popupIndex + 1);
}
function removePopupIndex(name) {
return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), '');
}
function showAdminPopup(triggeringLink, name_regexp, add_popup) {
const name = triggeringLink.id.replace(name_regexp, '');
const name = addPopupIndex(triggeringLink.id.replace(name_regexp, ''));
const href = new URL(triggeringLink.href);
if (add_popup) {
href.searchParams.set('_popup', 1);
}
const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
relatedWindows.push(win);
win.focus();
return false;
}
@@ -21,13 +50,17 @@
}
function dismissRelatedLookupPopup(win, chosenId) {
const name = win.name;
const name = removePopupIndex(win.name);
const elem = document.getElementById(name);
if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) {
elem.value += ',' + chosenId;
} else {
document.getElementById(name).value = chosenId;
}
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close();
}
@@ -52,13 +85,44 @@
}
}
function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId) {
// After create/edit a model from the options next to the current
// select (+ or :pencil:) update ForeignKey PK of the rest of selects
// in the page.
const path = win.location.pathname;
// Extract the model from the popup url '.../<model>/add/' or
// '.../<model>/<id>/change/' depending the action (add or change).
const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)];
// Exclude autocomplete selects.
const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] select:not(.admin-autocomplete)`);
selectsRelated.forEach(function(select) {
if (currentSelect === select) {
return;
}
let option = select.querySelector(`option[value="${objId}"]`);
if (!option) {
option = new Option(newRepr, newId);
select.options.add(option);
return;
}
option.textContent = newRepr;
option.value = newId;
});
}
function dismissAddRelatedObjectPopup(win, newId, newRepr) {
const name = win.name;
const name = removePopupIndex(win.name);
const elem = document.getElementById(name);
if (elem) {
const elemName = elem.nodeName.toUpperCase();
if (elemName === 'SELECT') {
elem.options[elem.options.length] = new Option(newRepr, newId, true, true);
updateRelatedSelectsOptions(elem, win, null, newRepr, newId);
} else if (elemName === 'INPUT') {
if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) {
elem.value += ',' + newId;
@@ -74,11 +138,15 @@
SelectBox.add_to_cache(toId, o);
SelectBox.redisplay(toId);
}
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close();
}
function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
const id = win.name.replace(/^edit_/, '');
const id = removePopupIndex(win.name.replace(/^edit_/, ''));
const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
const selects = $(selectsSelector);
selects.find('option').each(function() {
@@ -86,18 +154,23 @@
this.textContent = newRepr;
this.value = newId;
}
});
}).trigger('change');
updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId);
selects.next().find('.select2-selection__rendered').each(function() {
// The element can have a clear button as a child.
// Use the lastChild to modify only the displayed value.
this.lastChild.textContent = newRepr;
this.title = newRepr;
});
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close();
}
function dismissDeleteRelatedObjectPopup(win, objId) {
const id = win.name.replace(/^delete_/, '');
const id = removePopupIndex(win.name.replace(/^delete_/, ''));
const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
const selects = $(selectsSelector);
selects.find('option').each(function() {
@@ -105,6 +178,10 @@
$(this).remove();
}
}).trigger('change');
const index = relatedWindows.indexOf(win);
if (index > -1) {
relatedWindows.splice(index, 1);
}
win.close();
}
@@ -115,17 +192,23 @@
window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup;
window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup;
window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup;
window.dismissChildPopups = dismissChildPopups;
// Kept for backward compatibility
window.showAddAnotherPopup = showRelatedObjectPopup;
window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
window.addEventListener('unload', function(evt) {
window.dismissChildPopups();
});
$(document).ready(function() {
setPopupIndex();
$("a[data-popup-opener]").on('click', function(event) {
event.preventDefault();
opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener"));
});
$('body').on('click', '.related-widget-wrapper-link', function(e) {
$('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) {
e.preventDefault();
if (this.href) {
const event = $.Event('django:show-related', {href: this.href});

View File

@@ -27,9 +27,7 @@
$('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
});
$(document).on('formset:added', (function() {
return function(event, $newFormset) {
return $newFormset.find('.admin-autocomplete').djangoAdminSelect2();
};
})(this));
document.addEventListener('formset:added', (event) => {
$(event.target).find('.admin-autocomplete').djangoAdminSelect2();
});
}

View File

@@ -119,11 +119,11 @@ function findPosY(obj) {
let result = '', i = 0;
while (i < format.length) {
if (format.charAt(i) === '%') {
result = result + fields[format.charAt(i + 1)];
result += fields[format.charAt(i + 1)];
++i;
}
else {
result = result + format.charAt(i);
result += format.charAt(i);
}
++i;
}

View File

@@ -0,0 +1,30 @@
/**
* Persist changelist filters state (collapsed/expanded).
*/
'use strict';
{
// Init filters.
let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState'));
if (!filters) {
filters = {};
}
Object.entries(filters).forEach(([key, value]) => {
const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`);
// Check if the filter is present, it could be from other view.
if (detailElement) {
value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open');
}
});
// Save filter state when clicks.
const details = document.querySelectorAll('details');
details.forEach(detail => {
detail.addEventListener('toggle', event => {
filters[`${event.target.dataset.filterTitle}`] = detail.open;
sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters));
});
});
}

View File

@@ -88,7 +88,12 @@
if (options.added) {
options.added(row);
}
$(document).trigger('formset:added', [row, options.prefix]);
row.get(0).dispatchEvent(new CustomEvent("formset:added", {
bubbles: true,
detail: {
formsetName: options.prefix
}
}));
};
/**
@@ -130,7 +135,11 @@
if (options.removed) {
options.removed(row);
}
$(document).trigger('formset:removed', [row, options.prefix]);
document.dispatchEvent(new CustomEvent("formset:removed", {
detail: {
formsetName: options.prefix
}
}));
// Update the TOTAL_FORMS form count.
const forms = $("." + options.formCssClass);
$("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length);
@@ -296,7 +305,13 @@
dependency_list = input.data('dependency_list') || [],
dependencies = [];
$.each(dependency_list, function(i, field_name) {
dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id'));
// Dependency in a fieldset.
let field_element = row.find('.form-row .field-' + field_name);
// Dependency without a fieldset.
if (!field_element.length) {
field_element = row.find('.form-row.field-' + field_name);
}
dependencies.push('#' + field_element.find('input, select, textarea').attr('id'));
});
if (dependencies.length) {
input.prepopulate(dependencies, input.attr('maxlength'));

View File

@@ -2,47 +2,24 @@
{
const toggleNavSidebar = document.getElementById('toggle-nav-sidebar');
if (toggleNavSidebar !== null) {
const navLinks = document.querySelectorAll('#nav-sidebar a');
function disableNavLinkTabbing() {
for (const navLink of navLinks) {
navLink.tabIndex = -1;
}
}
function enableNavLinkTabbing() {
for (const navLink of navLinks) {
navLink.tabIndex = 0;
}
}
function disableNavFilterTabbing() {
document.getElementById('nav-filter').tabIndex = -1;
}
function enableNavFilterTabbing() {
document.getElementById('nav-filter').tabIndex = 0;
}
const navSidebar = document.getElementById('nav-sidebar');
const main = document.getElementById('main');
let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen');
if (navSidebarIsOpen === null) {
navSidebarIsOpen = 'true';
}
if (navSidebarIsOpen === 'false') {
disableNavLinkTabbing();
disableNavFilterTabbing();
}
main.classList.toggle('shifted', navSidebarIsOpen === 'true');
navSidebar.setAttribute('aria-expanded', navSidebarIsOpen);
toggleNavSidebar.addEventListener('click', function() {
if (navSidebarIsOpen === 'true') {
navSidebarIsOpen = 'false';
disableNavLinkTabbing();
disableNavFilterTabbing();
} else {
navSidebarIsOpen = 'true';
enableNavLinkTabbing();
enableNavFilterTabbing();
}
localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen);
main.classList.toggle('shifted');
navSidebar.setAttribute('aria-expanded', navSidebarIsOpen);
});
}

View File

@@ -3,7 +3,11 @@
const $ = django.jQuery;
const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields');
$.each(fields, function(index, field) {
$('.empty-form .form-row .field-' + field.name + ', .empty-form.form-row .field-' + field.name).addClass('prepopulated_field');
$(
'.empty-form .form-row .field-' + field.name +
', .empty-form.form-row .field-' + field.name +
', .empty-form .form-row.field-' + field.name
).addClass('prepopulated_field');
$(field.id).data('dependency_list', field.dependency_list).prepopulate(
field.dependency_ids, field.maxLength, field.allowUnicode
);

56
assets/admin/js/theme.js Normal file
View File

@@ -0,0 +1,56 @@
'use strict';
{
window.addEventListener('load', function(e) {
function setTheme(mode) {
if (mode !== "light" && mode !== "dark" && mode !== "auto") {
console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);
mode = "auto";
}
document.documentElement.dataset.theme = mode;
localStorage.setItem("theme", mode);
}
function cycleTheme() {
const currentTheme = localStorage.getItem("theme") || "auto";
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
if (prefersDark) {
// Auto (dark) -> Light -> Dark
if (currentTheme === "auto") {
setTheme("light");
} else if (currentTheme === "light") {
setTheme("dark");
} else {
setTheme("auto");
}
} else {
// Auto (light) -> Dark -> Light
if (currentTheme === "auto") {
setTheme("dark");
} else if (currentTheme === "dark") {
setTheme("light");
} else {
setTheme("auto");
}
}
}
function initTheme() {
// set theme defined in localStorage if there is one, or fallback to auto mode
const currentTheme = localStorage.getItem("theme");
currentTheme ? setTheme(currentTheme) : setTheme("auto");
}
function setupTheme() {
// Attach event handlers for toggling themes
const buttons = document.getElementsByClassName("theme-toggle");
Array.from(buttons).forEach((btn) => {
btn.addEventListener("click", cycleTheme);
});
initTheme();
}
setupTheme();
});
}

View File

@@ -163,8 +163,7 @@
s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens
s = s.substring(0, num_chars); // trim to first num_chars chars
s = s.replace(/-+$/g, ''); // trim any trailing hyphens
return s;
return s.replace(/-+$/g, ''); // trim any trailing hyphens
}
window.URLify = URLify;
}

View File

@@ -1,5 +1,5 @@
/*!
* jQuery JavaScript Library v3.6.0
* jQuery JavaScript Library v3.6.4
* https://jquery.com/
*
* Includes Sizzle.js
@@ -9,7 +9,7 @@
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2021-03-02T17:08Z
* Date: 2023-03-08T15:28Z
*/
( function( global, factory ) {
@@ -23,7 +23,7 @@
// (such as Node.js), expose a factory as module.exports.
// This accentuates the need for the creation of a real `window`.
// e.g. var jQuery = require("jquery")(window);
// See ticket #14549 for more info.
// See ticket trac-14549 for more info.
module.exports = global.document ?
factory( global, true ) :
function( w ) {
@@ -151,7 +151,7 @@ function toType( obj ) {
var
version = "3.6.0",
version = "3.6.4",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -522,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
* Sizzle CSS Selector Engine v2.3.6
* Sizzle CSS Selector Engine v2.3.10
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2021-02-16
* Date: 2023-02-14
*/
( function( window ) {
var i,
@@ -633,7 +633,7 @@ var i,
whitespace + "+$", "g" ),
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
"*" ),
rdescend = new RegExp( whitespace + "|>" ),
@@ -850,7 +850,7 @@ function Sizzle( selector, context, results, seed ) {
// as such selectors are not recognized by querySelectorAll.
// Thanks to Andrew Dupont for this technique.
if ( nodeType === 1 &&
( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
// Expand context for sibling selectors
newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
@@ -1174,6 +1174,24 @@ setDocument = Sizzle.setDocument = function( node ) {
!el.querySelectorAll( ":scope fieldset div" ).length;
} );
// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
// Make sure the the `:has()` argument is parsed unforgivingly.
// We include `*` in the test to detect buggy implementations that are
// _selectively_ forgiving (specifically when the list includes at least
// one valid selector).
// Note that we treat complete lack of support for `:has()` as if it were
// spec-compliant support, which is fine because use of `:has()` in such
// environments will fail in the qSA path and fall back to jQuery traversal
// anyway.
support.cssHas = assert( function() {
try {
document.querySelector( ":has(*,:jqfake)" );
return false;
} catch ( e ) {
return true;
}
} );
/* Attributes
---------------------------------------------------------------------- */
@@ -1440,6 +1458,17 @@ setDocument = Sizzle.setDocument = function( node ) {
} );
}
if ( !support.cssHas ) {
// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
// Our regular `try-catch` mechanism fails to detect natively-unsupported
// pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
// in browsers that parse the `:has()` argument as a forgiving selector list.
// https://drafts.csswg.org/selectors/#relational now requires the argument
// to be parsed unforgivingly, but browsers have not yet fully adjusted.
rbuggyQSA.push( ":has" );
}
rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
@@ -1452,7 +1481,14 @@ setDocument = Sizzle.setDocument = function( node ) {
// As in, an element does not contain itself
contains = hasCompare || rnative.test( docElem.contains ) ?
function( a, b ) {
var adown = a.nodeType === 9 ? a.documentElement : a,
// Support: IE <9 only
// IE doesn't have `contains` on `document` so we need to check for
// `documentElement` presence.
// We need to fall back to `a` when `documentElement` is missing
// as `ownerDocument` of elements within `<template/>` may have
// a null one - a default behavior of all modern browsers.
var adown = a.nodeType === 9 && a.documentElement || a,
bup = b && b.parentNode;
return a === bup || !!( bup && bup.nodeType === 1 && (
adown.contains ?
@@ -2242,7 +2278,7 @@ Expr = Sizzle.selectors = {
return elem.nodeName.toLowerCase() === "input" &&
elem.type === "text" &&
// Support: IE<8
// Support: IE <10 only
// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
( ( attr = elem.getAttribute( "type" ) ) == null ||
attr.toLowerCase() === "text" );
@@ -2342,7 +2378,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
matched = false;
// Combinators
if ( ( match = rcombinators.exec( soFar ) ) ) {
if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
matched = match.shift();
tokens.push( {
value: matched,
@@ -3129,8 +3165,8 @@ jQuery.fn.extend( {
var rootjQuery,
// A simple way to check for HTML strings
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
// Strict HTML recognition (#11290: must start with <)
// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
// Strict HTML recognition (trac-11290: must start with <)
// Shortcut simple #id case for speed
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
@@ -4087,7 +4123,7 @@ jQuery.extend( {
isReady: false,
// A counter to track how many items to wait for before
// the ready event fires. See #6781
// the ready event fires. See trac-6781
readyWait: 1,
// Handle when the DOM is ready
@@ -4215,7 +4251,7 @@ function fcamelCase( _all, letter ) {
// Convert dashed to camelCase; used by the css and data modules
// Support: IE <=9 - 11, Edge 12 - 15
// Microsoft forgot to hump their vendor prefix (#9572)
// Microsoft forgot to hump their vendor prefix (trac-9572)
function camelCase( string ) {
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
}
@@ -4251,7 +4287,7 @@ Data.prototype = {
value = {};
// We can accept data for non-element nodes in modern browsers,
// but we should not, see #8335.
// but we should not, see trac-8335.
// Always return an empty object.
if ( acceptData( owner ) ) {
@@ -4490,7 +4526,7 @@ jQuery.fn.extend( {
while ( i-- ) {
// Support: IE 11 only
// The attrs elements can be null (#14894)
// The attrs elements can be null (trac-14894)
if ( attrs[ i ] ) {
name = attrs[ i ].name;
if ( name.indexOf( "data-" ) === 0 ) {
@@ -4913,9 +4949,9 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
input = document.createElement( "input" );
// Support: Android 4.0 - 4.3 only
// Check state lost if the name is set (#11217)
// Check state lost if the name is set (trac-11217)
// Support: Windows Web Apps (WWA)
// `name` and `type` must use .setAttribute for WWA (#14901)
// `name` and `type` must use .setAttribute for WWA (trac-14901)
input.setAttribute( "type", "radio" );
input.setAttribute( "checked", "checked" );
input.setAttribute( "name", "t" );
@@ -4939,7 +4975,7 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
} )();
// We have to close these tags to support XHTML (#13200)
// We have to close these tags to support XHTML (trac-13200)
var wrapMap = {
// XHTML parsers do not magically insert elements in the
@@ -4965,7 +5001,7 @@ if ( !support.option ) {
function getAll( context, tag ) {
// Support: IE <=9 - 11 only
// Use typeof to avoid zero-argument method invocation on host objects (#15151)
// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
var ret;
if ( typeof context.getElementsByTagName !== "undefined" ) {
@@ -5048,7 +5084,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
// Remember the top-level container
tmp = fragment.firstChild;
// Ensure the created nodes are orphaned (#12392)
// Ensure the created nodes are orphaned (trac-12392)
tmp.textContent = "";
}
}
@@ -5469,15 +5505,15 @@ jQuery.event = {
for ( ; cur !== this; cur = cur.parentNode || this ) {
// Don't check non-elements (#13208)
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
// Don't check non-elements (trac-13208)
// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
matchedHandlers = [];
matchedSelectors = {};
for ( i = 0; i < delegateCount; i++ ) {
handleObj = handlers[ i ];
// Don't conflict with Object.prototype properties (#13203)
// Don't conflict with Object.prototype properties (trac-13203)
sel = handleObj.selector + " ";
if ( matchedSelectors[ sel ] === undefined ) {
@@ -5731,7 +5767,7 @@ jQuery.Event = function( src, props ) {
// Create target properties
// Support: Safari <=6 - 7 only
// Target should not be a text node (#504, #13143)
// Target should not be a text node (trac-504, trac-13143)
this.target = ( src.target && src.target.nodeType === 3 ) ?
src.target.parentNode :
src.target;
@@ -5854,10 +5890,10 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
// Suppress native focus or blur as it's already being fired
// in leverageNative.
_default: function() {
return true;
// Suppress native focus or blur if we're currently inside
// a leveraged native-event stack
_default: function( event ) {
return dataPriv.get( event.target, type );
},
delegateType: delegateType
@@ -5956,7 +5992,8 @@ var
// checked="checked" or checked
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
// Prefer a tbody over its parent table for containing new rows
function manipulationTarget( elem, content ) {
@@ -6070,7 +6107,7 @@ function domManip( collection, args, callback, ignored ) {
// Use the original fragment for the last item
// instead of the first because it can end up
// being emptied incorrectly in certain situations (#8070).
// being emptied incorrectly in certain situations (trac-8070).
for ( ; i < l; i++ ) {
node = fragment;
@@ -6111,6 +6148,12 @@ function domManip( collection, args, callback, ignored ) {
}, doc );
}
} else {
// Unwrap a CDATA section containing script contents. This shouldn't be
// needed as in XML documents they're already not visible when
// inspecting element contents and in HTML documents they have no
// meaning but we're preserving that logic for backwards compatibility.
// This will be removed completely in 4.0. See gh-4904.
DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
}
}
@@ -6393,9 +6436,12 @@ jQuery.each( {
} );
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
var rcustomProp = /^--/;
var getStyles = function( elem ) {
// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
// IE throws on elements created in popups
// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
var view = elem.ownerDocument.defaultView;
@@ -6430,6 +6476,15 @@ var swap = function( elem, options, callback ) {
var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
var whitespace = "[\\x20\\t\\r\\n\\f]";
var rtrimCSS = new RegExp(
"^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
"g"
);
( function() {
@@ -6495,7 +6550,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
}
// Support: IE <=9 - 11 only
// Style of cloned element affects source element cloned (#8908)
// Style of cloned element affects source element cloned (trac-8908)
div.style.backgroundClip = "content-box";
div.cloneNode( true ).style.backgroundClip = "";
support.clearCloneStyle = div.style.backgroundClip === "content-box";
@@ -6575,6 +6630,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
function curCSS( elem, name, computed ) {
var width, minWidth, maxWidth, ret,
isCustomProp = rcustomProp.test( name ),
// Support: Firefox 51+
// Retrieving style before computed somehow
@@ -6585,11 +6641,42 @@ function curCSS( elem, name, computed ) {
computed = computed || getStyles( elem );
// getPropertyValue is needed for:
// .css('filter') (IE 9 only, #12537)
// .css('--customProperty) (#3144)
// .css('filter') (IE 9 only, trac-12537)
// .css('--customProperty) (gh-3144)
if ( computed ) {
// Support: IE <=9 - 11+
// IE only supports `"float"` in `getPropertyValue`; in computed styles
// it's only available as `"cssFloat"`. We no longer modify properties
// sent to `.css()` apart from camelCasing, so we need to check both.
// Normally, this would create difference in behavior: if
// `getPropertyValue` returns an empty string, the value returned
// by `.css()` would be `undefined`. This is usually the case for
// disconnected elements. However, in IE even disconnected elements
// with no styles return `"none"` for `getPropertyValue( "float" )`
ret = computed.getPropertyValue( name ) || computed[ name ];
if ( isCustomProp && ret ) {
// Support: Firefox 105+, Chrome <=105+
// Spec requires trimming whitespace for custom properties (gh-4926).
// Firefox only trims leading whitespace. Chrome just collapses
// both leading & trailing whitespace to a single space.
//
// Fall back to `undefined` if empty string returned.
// This collapses a missing definition with property defined
// and set to an empty string but there's no standard API
// allowing us to differentiate them without a performance penalty
// and returning `undefined` aligns with older jQuery.
//
// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
// as whitespace while CSS does not, but this is not a problem
// because CSS preprocessing replaces them with U+000A LINE FEED
// (which *is* CSS whitespace)
// https://www.w3.org/TR/css-syntax-3/#input-preprocessing
ret = ret.replace( rtrimCSS, "$1" ) || undefined;
}
if ( ret === "" && !isAttached( elem ) ) {
ret = jQuery.style( elem, name );
}
@@ -6685,7 +6772,6 @@ var
// except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
letterSpacing: "0",
@@ -6921,15 +7007,15 @@ jQuery.extend( {
if ( value !== undefined ) {
type = typeof value;
// Convert "+=" or "-=" to relative numbers (#7345)
// Convert "+=" or "-=" to relative numbers (trac-7345)
if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
value = adjustCSS( elem, name, ret );
// Fixes bug #9237
// Fixes bug trac-9237
type = "number";
}
// Make sure that null and NaN values aren't set (#7116)
// Make sure that null and NaN values aren't set (trac-7116)
if ( value == null || value !== value ) {
return;
}
@@ -7553,7 +7639,7 @@ function Animation( elem, properties, options ) {
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
// Support: Android 2.3 only
// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
temp = remaining / animation.duration || 0,
percent = 1 - temp,
index = 0,
@@ -7943,7 +8029,6 @@ jQuery.fx.speeds = {
// Based off of the plugin by Clint Helfers, with permission.
// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
jQuery.fn.delay = function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
type = type || "fx";
@@ -8168,8 +8253,7 @@ jQuery.extend( {
// Support: IE <=9 - 11 only
// elem.tabIndex doesn't always return the
// correct value when it hasn't been explicitly set
// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
// Use proper attribute retrieval(#12072)
// Use proper attribute retrieval (trac-12072)
var tabindex = jQuery.find.attr( elem, "tabindex" );
if ( tabindex ) {
@@ -8273,8 +8357,7 @@ function classesToArray( value ) {
jQuery.fn.extend( {
addClass: function( value ) {
var classes, elem, cur, curValue, clazz, j, finalValue,
i = 0;
var classNames, cur, curValue, className, i, finalValue;
if ( isFunction( value ) ) {
return this.each( function( j ) {
@@ -8282,36 +8365,35 @@ jQuery.fn.extend( {
} );
}
classes = classesToArray( value );
classNames = classesToArray( value );
if ( classes.length ) {
while ( ( elem = this[ i++ ] ) ) {
curValue = getClass( elem );
cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( classNames.length ) {
return this.each( function() {
curValue = getClass( this );
cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) {
j = 0;
while ( ( clazz = classes[ j++ ] ) ) {
if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
cur += clazz + " ";
for ( i = 0; i < classNames.length; i++ ) {
className = classNames[ i ];
if ( cur.indexOf( " " + className + " " ) < 0 ) {
cur += className + " ";
}
}
// Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue );
}
this.setAttribute( "class", finalValue );
}
}
} );
}
return this;
},
removeClass: function( value ) {
var classes, elem, cur, curValue, clazz, j, finalValue,
i = 0;
var classNames, cur, curValue, className, i, finalValue;
if ( isFunction( value ) ) {
return this.each( function( j ) {
@@ -8323,45 +8405,42 @@ jQuery.fn.extend( {
return this.attr( "class", "" );
}
classes = classesToArray( value );
classNames = classesToArray( value );
if ( classes.length ) {
while ( ( elem = this[ i++ ] ) ) {
curValue = getClass( elem );
if ( classNames.length ) {
return this.each( function() {
curValue = getClass( this );
// This expression is here for better compressibility (see addClass)
cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) {
j = 0;
while ( ( clazz = classes[ j++ ] ) ) {
for ( i = 0; i < classNames.length; i++ ) {
className = classNames[ i ];
// Remove *all* instances
while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
cur = cur.replace( " " + clazz + " ", " " );
while ( cur.indexOf( " " + className + " " ) > -1 ) {
cur = cur.replace( " " + className + " ", " " );
}
}
// Only assign if different to avoid unneeded rendering.
finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue );
}
this.setAttribute( "class", finalValue );
}
}
} );
}
return this;
},
toggleClass: function( value, stateVal ) {
var type = typeof value,
var classNames, className, i, self,
type = typeof value,
isValidValue = type === "string" || Array.isArray( value );
if ( typeof stateVal === "boolean" && isValidValue ) {
return stateVal ? this.addClass( value ) : this.removeClass( value );
}
if ( isFunction( value ) ) {
return this.each( function( i ) {
jQuery( this ).toggleClass(
@@ -8371,17 +8450,20 @@ jQuery.fn.extend( {
} );
}
return this.each( function() {
var className, i, self, classNames;
if ( typeof stateVal === "boolean" && isValidValue ) {
return stateVal ? this.addClass( value ) : this.removeClass( value );
}
classNames = classesToArray( value );
return this.each( function() {
if ( isValidValue ) {
// Toggle individual class names
i = 0;
self = jQuery( this );
classNames = classesToArray( value );
while ( ( className = classNames[ i++ ] ) ) {
for ( i = 0; i < classNames.length; i++ ) {
className = classNames[ i ];
// Check each className given, space separated list
if ( self.hasClass( className ) ) {
@@ -8515,7 +8597,7 @@ jQuery.extend( {
val :
// Support: IE <=10 - 11 only
// option.text throws exceptions (#14686, #14858)
// option.text throws exceptions (trac-14686, trac-14858)
// Strip and collapse whitespace
// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
stripAndCollapse( jQuery.text( elem ) );
@@ -8542,7 +8624,7 @@ jQuery.extend( {
option = options[ i ];
// Support: IE <=9 only
// IE8-9 doesn't update selected after form reset (#2551)
// IE8-9 doesn't update selected after form reset (trac-2551)
if ( ( option.selected || i === index ) &&
// Don't return options that are disabled or in a disabled optgroup
@@ -8685,8 +8767,8 @@ jQuery.extend( jQuery.event, {
return;
}
// Determine event propagation path in advance, per W3C events spec (#9951)
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
// Determine event propagation path in advance, per W3C events spec (trac-9951)
// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
bubbleType = special.delegateType || type;
@@ -8738,7 +8820,7 @@ jQuery.extend( jQuery.event, {
acceptData( elem ) ) {
// Call a native DOM method on the target with the same name as the event.
// Don't do default actions on window, that's where global variables be (#6170)
// Don't do default actions on window, that's where global variables be (trac-6170)
if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
// Don't re-trigger an onFOO event when we call its FOO() method
@@ -9012,7 +9094,7 @@ var
rantiCache = /([?&])_=[^&]*/,
rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
// #7653, #8125, #8152: local protocol detection
// trac-7653, trac-8125, trac-8152: local protocol detection
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
@@ -9035,7 +9117,7 @@ var
*/
transports = {},
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
allTypes = "*/".concat( "*" ),
// Anchor tag for parsing the document origin
@@ -9106,7 +9188,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
// A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
// Fixes trac-9887
function ajaxExtend( target, src ) {
var key, deep,
flatOptions = jQuery.ajaxSettings.flatOptions || {};
@@ -9517,12 +9599,12 @@ jQuery.extend( {
deferred.promise( jqXHR );
// Add protocol if not provided (prefilters might expect it)
// Handle falsy url in the settings object (#10093: consistency with old signature)
// Handle falsy url in the settings object (trac-10093: consistency with old signature)
// We also use the url parameter if available
s.url = ( ( url || s.url || location.href ) + "" )
.replace( rprotocol, location.protocol + "//" );
// Alias method option to type as per ticket #12004
// Alias method option to type as per ticket trac-12004
s.type = options.method || options.type || s.method || s.type;
// Extract dataTypes list
@@ -9565,7 +9647,7 @@ jQuery.extend( {
}
// We can fire global events as of now if asked to
// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
fireGlobals = jQuery.event && s.global;
// Watch for a new set of requests
@@ -9594,7 +9676,7 @@ jQuery.extend( {
if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
// #9682: remove data so that it's not used in an eventual retry
// trac-9682: remove data so that it's not used in an eventual retry
delete s.data;
}
@@ -9867,7 +9949,7 @@ jQuery._evalUrl = function( url, options, doc ) {
return jQuery.ajax( {
url: url,
// Make this explicit, since user can override this through ajaxSetup (#11264)
// Make this explicit, since user can override this through ajaxSetup (trac-11264)
type: "GET",
dataType: "script",
cache: true,
@@ -9976,7 +10058,7 @@ var xhrSuccessStatus = {
0: 200,
// Support: IE <=9 only
// #1450: sometimes IE returns 1223 when it should be 204
// trac-1450: sometimes IE returns 1223 when it should be 204
1223: 204
},
xhrSupported = jQuery.ajaxSettings.xhr();
@@ -10048,7 +10130,7 @@ jQuery.ajaxTransport( function( options ) {
} else {
complete(
// File: protocol always yields status 0; see #8605, #14207
// File: protocol always yields status 0; see trac-8605, trac-14207
xhr.status,
xhr.statusText
);
@@ -10109,7 +10191,7 @@ jQuery.ajaxTransport( function( options ) {
xhr.send( options.hasContent && options.data || null );
} catch ( e ) {
// #14683: Only rethrow if this hasn't been notified as an error yet
// trac-14683: Only rethrow if this hasn't been notified as an error yet
if ( callback ) {
throw e;
}
@@ -10753,7 +10835,9 @@ jQuery.each(
// Support: Android <=4.0 only
// Make sure we trim BOM and NBSP
var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
// Require that the "whitespace run" starts from a non-whitespace
// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
// Bind a function to a context, optionally partially applying any
// arguments.
@@ -10820,7 +10904,7 @@ jQuery.isNumeric = function( obj ) {
jQuery.trim = function( text ) {
return text == null ?
"" :
( text + "" ).replace( rtrim, "" );
( text + "" ).replace( rtrim, "$1" );
};
@@ -10868,8 +10952,8 @@ jQuery.noConflict = function( deep ) {
};
// Expose jQuery and $ identifiers, even in AMD
// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (trac-13566)
if ( typeof noGlobal === "undefined" ) {
window.jQuery = window.$ = jQuery;
}

File diff suppressed because one or more lines are too long

View File

@@ -24,7 +24,7 @@
function initialiseCKEditor() {
var textareas = Array.prototype.slice.call(
document.querySelectorAll("textarea[data-type=ckeditortype]")
document.querySelectorAll("textarea[data-type=ckeditortype]"),
)
for (var i = 0; i < textareas.length; ++i) {
var t = textareas[i]

View File

@@ -0,0 +1,19 @@
/* Fix for Django dark theme background */
/* See https://github.com/django-ckeditor/django-ckeditor/issues/670 */
.cke_reset_all tr:nth-child(even),
.cke_reset_all tr:nth-child(odd),
.cke_reset_all .row-form-errors,
.cke_reset_all tr:nth-child(even) .errorlist,
.cke_reset_all tr:nth-child(odd) + .row-form-errors,
.cke_reset_all tr:nth-child(odd) + .row-form-errors .errorlist,
.cke_reset_all input[type="text"],
.cke_reset_all input[type="password"] {
background: inherit;
color: inherit;
}
/* Fix for CKEditor source editor with Django dark theme */
/* See https://github.com/django-ckeditor/django-ckeditor/issues/741 */
textarea.cke_source {
color: revert;
}

View File

@@ -1,5 +1,162 @@
CKEditor 4 Changelog
====================
⚠️️️ **CKEditor 4 (the open source edition) is no longer maintained.** ⚠️
If you would like to keep access to future CKEditor 4 security patches, check the [Extended Support Model](https://ckeditor.com/ckeditor-4-support/), which guarantees **security updates and critical bug fixes until December 2026**. Alternatively, [upgrade to CKEditor 5](https://ckeditor.com/docs/ckeditor5/latest/updating/ckeditor4/migration-from-ckeditor-4.html).
## CKEditor 4.22.0 / 4.22.1
⚠️ This is the last open source release of CKEditor 4. As announced in 2018, CKEditor 4 has reached its End of Life in June 2023.
New Features:
* [#5316](https://github.com/ckeditor/ckeditor4/issues/5316): Added vertical margins support for list elements in the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
* [#5410](https://github.com/ckeditor/ckeditor4/issues/5410): Added the ability to indicate the language of styles in the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin via the [`config.styleSet`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-stylesSet) configuration option.
* [#5510](https://github.com/ckeditor/ckeditor4/issues/5510): Added notification system to the editor informing users that the editor version is up-to-date and secure. See [`config.versionCheck`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-versionCheck) configuration option to learn more.
Fixed Issues:
* [#5437](https://github.com/ckeditor/ckeditor4/issues/5437): Fixed: Incorrect indication of selected items in combo boxes. The selected item was unmarked upon each opening of the combo box.
* [#5495](https://github.com/ckeditor/ckeditor4/issues/5495): Fixed: Insufficient color ratio for links inside [Notifications](https://ckeditor.com/cke4/addon/notification).
Other Changes:
* [#5412](https://github.com/ckeditor/ckeditor4/issues/5412): Prevent using `document.domain` in Firefox in the [Preview](https://ckeditor.com/cke4/addon/preview) plugin.
Note: CKEditor 4.22.1 has been released immediately after 4.22.0 to fix the README issues on [npm](https://www.npmjs.com/) and contains no changes vs 4.22.0.
## CKEditor 4.21.0
**Security Updates:**
A cross-site scripting vulnerability has been discovered affecting [Iframe Dialog](https://ckeditor.com/cke4/addon/iframe) and [Media Embed](https://ckeditor.com/cke4/addon/embed) plugins.
This vulnerability might affect a small percentage of integrators that depend on dynamic editor initialization/destroy mechanism. See [GitHub advisory](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-vh5c-xwqv-cv9g) for more details.
**Potential breaking changes**
In some rare cases, a security release may introduce a breaking change to your application. We have provided configuration options that will help you mitigate any potential issues with the upgrade:
- Starting from version 4.21, the [Iframe Dialog](https://ckeditor.com/cke4/addon/iframe) plugin applies the `sandbox` attribute by default, which restricts JavaScript code execution in the iframe element. To change this behavior, configure the [`config.iframe_attributes`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-iframe_attributes) option.
- Starting from version 4.21, the [Media Embed](https://ckeditor.com/cke4/addon/embed) plugin regenerates the entire content of the embed widget by default. To change this behavior, configure the [`config.embed_keepOriginalContent`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-embed_keepOriginalContent) option.
If you choose to change either of the above options, make sure to properly configure [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to avoid any potential security issues that may arise from embedding iframe elements on your web page.
You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions.
**An upgrade is highly recommended!**
New Features:
* [#4400](https://github.com/ckeditor/ckeditor4/issues/4400): Added the [`config.uploadImage_supportedTypes`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-uploadImage_supportedTypes) configuration option allowing to change the image formats accepted by the [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin. Thanks to [SilverYoCha](https://github.com/SilverYoCha)!
Fixed Issues:
* [#5431](https://github.com/ckeditor/ckeditor4/issues/5431): Fixed: No notification is shown when pasting or dropping unsupported image types into the editor.
## CKEditor 4.20.2
Fixed Issues:
* [#439](https://github.com/ckeditor/ckeditor4/issues/439): Fixed: Incorrect <kbd>Tab</kbd> and <kbd>Shift</kbd>+<kbd>Tab</kbd> navigation for radio buttons inside the dialog.
* [#4829](https://github.com/ckeditor/ckeditor4/issues/4829): Fixed: Undo reversed entire table content instead of a single cell. Thanks to that fix, multiple changes in a table can be undone one by one.
* [#5396](https://github.com/ckeditor/ckeditor4/issues/5396): Fixed: Event listeners for `popstate` and `hashchange` events on the `window`, added by the [Maximize](https://ckeditor.com/cke4/addon/maximize) plugin, were not removed when destroying the editor instance.
* [#5414](https://github.com/ckeditor/ckeditor4/issues/5414): Fixed: File and image uploaders based on the [Upload Widget plugin](https://ckeditor.com/cke4/addon/uploadwidget) and [Easy Image plugin ](https://ckeditor.com/cke4/addon/easyimage) didn't fire the [`change` event](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-change) upon finishing upload, resulting in passing incorrect data in form controls for integration frameworks, like [Reactive forms in Angular](https://angular.io/guide/reactive-forms).
* [#698](https://github.com/ckeditor/ckeditor4/issues/698): Fixed: An error was thrown after applying formatting to the widget with inline editable and switching to the source mode. Thanks to [Glen](https://github.com/glen-84)!
API changes:
* [#3540](https://github.com/ckeditor/ckeditor4/issues/3540): The [startup data](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html) passed to the widget's command is now used to also populate the widget's template.
* [#5352](https://github.com/ckeditor/ckeditor4/issues/5352): Added the [`colorButton_contentsCss`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_contentsCss) configuration option allowing to add custom CSS to the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) menu content. Thanks to [mihilion](https://github.com/mihilion)!
## CKEditor 4.20.1
Fixed Issues:
* [#5333](https://github.com/ckeditor/ckeditor4/issues/5333): Fixed: The original name of the uploaded image is not preserved by the [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin if the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin has enabled image handling.
* [#2881](https://github.com/ckeditor/ckeditor4/issues/2881): Fixed: Changing table headers from "Both" to "First column" in the [Table](https://ckeditor.com/cke4/addon/table) dialog does not change the first column cell correctly.
* [#2996](https://github.com/ckeditor/ckeditor4/issues/2996): Fixed: Table header "scope" attribute is incorrect for the "Headers: both" option in the [Table](https://ckeditor.com/cke4/addon/table) dialog.
* [#4802](https://github.com/ckeditor/ckeditor4/issues/4802): Fixed: [Tableselection](https://ckeditor.com/cke4/addon/tableselection) caret moves to the previous cell after tabbing into the next cell and then removing its content.
* [#5365](https://github.com/ckeditor/ckeditor4/issues/5365): Fixed: The value of the [`config.baseFloatZIndex`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-baseFloatZIndex) config variable is incorrectly applied to parent dialog when the child dialog is closed resulting in the dialog overlay covering up the dialog. Thanks to [JenoDK](https://github.com/JenoDK)!
* [#5305](https://github.com/ckeditor/ckeditor4/issues/5305): Fixed: Anchor name can invalidly include spaces.
## CKEditor 4.20
New Features:
* [#5084](https://github.com/ckeditor/ckeditor4/issues/5084): Added the [`config.tabletools_scopedHeaders`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-tabletools_scopedHeaders) configuration option controlling the behaviour of table headers with and without the `[scope]` attribute.
* [#5219](https://github.com/ckeditor/ckeditor4/issues/5219): Added the [`config.image2_defaultLockRatio`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-image2_defaultLockRatio) configuration option allowing to set the default value of the "Lock ratio" option in the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) dialog.
* [#2008](https://github.com/ckeditor/ckeditor-dev/pull/2008): Extended the [Mentions](https://ckeditor.com/cke4/addon/mentions) and [Emoji](https://ckeditor.com/cke4/addon/emoji) plugins with a feature option that adds a space after an accepted autocompletion match. See:
* [`configDefinition.followingSpace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_mentions_configDefinition.html#property-followingSpace) option for the mentions plugin, and
* [`config.emoji_followingSpace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-emoji_followingSpace) option for the emoji plugin.
* [#5215](https://github.com/ckeditor/ckeditor4/issues/5215): Added the [`config.coreStyles_toggleSubSup`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-coreStyles_toggleSubSup) configuration option which disallows setting the subscript and superscript on the same element simultaneously using UI buttons. This option is turned off by default.
Fixed Issues:
* [#4889](https://github.com/ckeditor/ckeditor4/issues/4889): Fixed: Incorrect position of the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) cursor after scrolling the editor horizontally.
* [#5319](https://github.com/ckeditor/ckeditor4/issues/5319): Fixed: [Autolink](https://ckeditor.com/cke4/addon/autolink) [`config.autolink_urlRegex`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-autolink_urlRegex) option produced invalid links when configured directly using the editor instance config. Thanks to [Aigars Zeiza](https://github.com/Zuzon)!
* [#4941](https://github.com/ckeditor/ckeditor4/issues/4941): Fixed: Some entities got wrongly encoded when using [`entities_processNumerical = true`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-entities_processNumerical) configuration option.
* [#4931](https://github.com/ckeditor/ckeditor4/issues/4931): Fixed: Selecting the whole editor content when there is only a list with an empty element at the end inside and deleting it did not delete all list items.
API changes:
* [#5122](https://github.com/ckeditor/ckeditor4/issues/5122): Added the ability to provide a list of buttons as an array to the [`config.removeButtons`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removeButtons) config variable.
* [#2008](https://github.com/ckeditor/ckeditor-dev/pull/2008): Added [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) [`followingSpace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_autocomplete_configDefinition.html#property-followingSpace) option that finishes an accepted match with a space.
## CKEditor 4.19.1
Fixed Issues:
* [#5125](https://github.com/ckeditor/ckeditor4/issues/5125): Fixed: Deleting a widget with disabled [autoParagraph](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-autoParagraph) by the keyboard `backspace` key removes the editor editable area and crashes the editor.
* [#5135](https://github.com/ckeditor/ckeditor4/issues/5135): Fixed: The [`checkbox.setValue`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_dialog_checkbox.html#method-setValue) and [`radio.setValue`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_dialog_radio.html#method-setValue) methods are not chainable as stated in the documentation. Thanks to [Jordan Bradford](https://github.com/LordPachelbel)!
* [#5085](https://github.com/ckeditor/ckeditor4/issues/5085): Fixed: The [Language](https://ckeditor.com/cke4/addon/language) plugin removes the element marking the text in foreign language if said element does not have an information about the text direction.
* [#4284](https://github.com/ckeditor/ckeditor4/issues/4284): Fixed: [Tableselection](https://ckeditor.com/cke4/addon/tableselection) Merging cells with a rowspan throws an unexpected error and does not create an undo step.
* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Fixed: The [Editor Placeholder](https://ckeditor.com/cke4/addon/wysiwygarea) plugin degrades typing performance.
* [#5158](https://github.com/ckeditor/ckeditor4/issues/5158): Fixed: [`CKEDITOR.tools#convertToPx()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx) gives invalid results if the helper calculator element was deleted from the DOM.
* [#5234](https://github.com/ckeditor/ckeditor4/issues/5234): Fixed: [Easy Image](https://ckeditor.com/cke4/addon/easyimage) doesn't allow to upload images files using toolbar button.
* [#438](https://github.com/ckeditor/ckeditor4/issues/438): Fixed: It is impossible to navigate to the [elementspath](https://ckeditor.com/cke4/addon/elementspath) from the [toolbar](https://ckeditor.com/cke4/addon/toolbar) by keyboard and vice versa.
* [#4449](https://github.com/ckeditor/ckeditor4/issues/4449): Fixed: [`dialog.validate#functions`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions) incorrectly composes functions that return an optional error message, like e.g. [`dialog.validate.number`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-number) due to unnecessary return type coercion.
* [#4473](https://github.com/ckeditor/ckeditor4/issues/4473): Fixed: The [dialog.validate](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html) method does not accept parameter value. The issue originated in [dialog.validate.functions](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions) method that did not properly propagate parameter value to validator. Affected validators:
* [`functions`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions)
* [`equals`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-equals)
* [`notEqual`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-notEqual)
* [`cssLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-cssLength)
* [`htmlLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-htmlLength)
* [`inlineStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-inlineStyle)
* [#5147](https://github.com/ckeditor/ckeditor4/issues/5147): Fixed: The [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) dialog does not contain info about focus being moved back to the editing area upon leaving dialogs.
* [#5144](https://github.com/ckeditor/ckeditor4/issues/5144): Fixed: [Menu buttons](https://ckeditor.com/cke4/addon/menubutton) and [panel buttons](https://ckeditor.com/cke4/addon/panelbutton) incorrectly indicate the open status of their associated pop-up menus in the browser's accessibility tree.
* [#5022](https://github.com/ckeditor/ckeditor4/issues/5022): Fixed: [Find and Replace](https://ckeditor.com/cke4/addon/find) does not respond to the `Enter` key.
API changes:
* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Added the [`config.editorplaceholder_delay`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-editorplaceholder_delay) configuration option allowing to delay placeholder before it is toggled when changing editor content.
* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Added the [`CKEDITOR.tools#debounce()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-debounce) function allowing to postpone a passed function execution until the given milliseconds have elapsed since the last time it was invoked.
## CKEditor 4.19.0
New features:
* [#2444](https://github.com/ckeditor/ckeditor4/issues/2444): Togglable toolbar buttons are now exposed as toggle buttons in the browser's accessibility tree.
* [#4641](https://github.com/ckeditor/ckeditor4/issues/4641): Added an option allowing to cancel the [Delayed Editor Creation](https://ckeditor.com/docs/ckeditor4/latest/features/delayed_creation.html) feature as a function handle for editor creators ([`CKEDITOR.replace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-replace), [`CKEDITOR.inline`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inline), [`CKEDITOR.appendTo`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTo)).
* [#4986](https://github.com/ckeditor/ckeditor4/issues/4986): Added [`config.shiftLineBreaks`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-shiftLineBreaks) allowing to preserve inline elements formatting when the `shift`+`enter` keystroke is used.
* [#2445](https://github.com/ckeditor/ckeditor4/issues/2445): Added [`config.applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-applicationTitle) configuration option allowing to customize or disable the editor's application region label. This option, combined with [`config.title`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-title), gives much better control over the editor's labels read by screen readers.
Fixed Issues:
* [#4543](https://github.com/ckeditor/ckeditor4/issues/4543): Fixed: Toolbar buttons toggle state is not correctly announced by screen readers lacking the information whether the feature is on or off.
* [#4052](https://github.com/ckeditor/ckeditor4/issues/4052): Fixed: Editor labels are read incorrectly by screen readers due to invalid editor control type for the [Iframe Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) editors.
* [#1904](https://github.com/ckeditor/ckeditor4/issues/1904): Fixed: Screen readers are not announcing the read-only editor state.
* [#4904](https://github.com/ckeditor/ckeditor4/issues/4904): Fixed: Table cell selection and navigation with the `tab` key behavior is inconsistent after adding a new row.
* [#3394](https://github.com/ckeditor/ckeditor4/issues/3394): Fixed: [Enhanced image](https://ckeditor.com/cke4/addon/image2) plugin dialog is not supporting URL with query string parameters. Thanks to [Simon Urli](https://github.com/surli)!
* [#5049](https://github.com/ckeditor/ckeditor4/issues/5049): Fixed: The editor fails in strict mode due to not following the `use strict` directives in a core editor module.
* [#5095](https://github.com/ckeditor/ckeditor4/issues/5095): Fixed: The [clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin shows notification about unsupported file format when the file type is different than `jpg`, `gif`, `png`, not respecting [supported types](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-supportedTypes) by the [Upload Widget](https://ckeditor.com/cke4/addon/uploadwidget) plugin.
* [#4855](https://github.com/ckeditor/ckeditor4/issues/4855): [iOS] Fixed: Focusing toolbar buttons with an enabled VoiceOver screen reader moves the browser focus into an editable area and interrupts button functionality.
API changes:
* [#4641](https://github.com/ckeditor/ckeditor4/issues/4641): The [`CKEDITOR.replace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-replace), [`CKEDITOR.inline`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inline), [`CKEDITOR.appendTo`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTo) functions are now returning a handle function allowing to cancel the [Delayed Editor Creation](https://ckeditor.com/docs/ckeditor4/latest/features/delayed_creation.html) feature.
* [#5095](https://github.com/ckeditor/ckeditor4/issues/5095): Added the [CKEDITOR.plugins.clipboard.addFileMatcher](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_clipboard.html#method-addFileMatcher) function allowing to define file formats supported by the [clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin. Trying to paste unsupported files will result in a notification that a file cannot be dropped or pasted into the editor.
* [#2445](https://github.com/ckeditor/ckeditor4/issues/2445): Added [`config.applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-applicationTitle) alongside [`CKEDITOR.editor#applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-applicationTitle) to allow customizing editor's application region label.
## CKEditor 4.18.0

View File

@@ -1,8 +1,16 @@
Software License Agreement
==========================
Software License Agreement for CKEditor 4 LTS (4.23.0 and above)
================================================================
CKEditor - The text editor for Internet - https://ckeditor.com/
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
CKEditor - The text editor for Internet - https://ckeditor.com/ <br>
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
CKEditor 4 LTS ("Long Term Support") is available under exclusive terms of the [Extended Support Model](https://ckeditor.com/ckeditor-4-support/). [Contact us](https://ckeditor.com/contact/) to obtain a commercial license.
Software License Agreement for CKEditor 4.22.* and below
========================================================
CKEditor - The text editor for Internet - https://ckeditor.com/ <br>
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
Licensed under the terms of any of the following licenses at your
choice:
@@ -37,7 +45,7 @@ done by developers outside of CKSource with their express permission.
The following libraries are included in CKEditor under the MIT license (see Appendix D):
* CKSource Samples Framework (included in the samples) - Copyright (c) 2014-2022, CKSource Holding sp. z o.o.
* CKSource Samples Framework (included in the samples) - Copyright (c) 2014-2023, CKSource Holding sp. z o.o.
* PicoModal (included in `samples/js/sf.js`) - Copyright (c) 2012 James Frasca.
* CodeMirror (included in the samples) - Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others.
* ES6Promise - Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors.

View File

@@ -1,8 +1,8 @@
CKEditor 4
==========
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
https://ckeditor.com - See LICENSE.md for license information.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
https://ckeditor.com - See https://ckeditor.com/legal/ckeditor-oss-license for license information.
CKEditor 4 is a text editor to be used inside web pages. It's not a replacement
for desktop text editors like Word or OpenOffice, but a component to be used as

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
(function(a){if("undefined"==typeof a)throw Error("jQuery should be loaded before CKEditor jQuery adapter.");if("undefined"==typeof CKEDITOR)throw Error("CKEditor should be loaded before CKEditor jQuery adapter.");CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},

View File

@@ -1,5 +1,5 @@
/**
* @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license/
*/

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
/**
* @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see https://ckeditor.com/legal/ckeditor-oss-license
*/

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More