From 1e3b71825b028a2f6b210081cd319fe575aa2943 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 15 Mar 2022 08:55:28 +0100 Subject: [PATCH 001/326] Corrected wrong PyPI project urls. --- setup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 7f7233f..eea51fc 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,6 @@ sponsor_url = "https://github.com/sponsors/fabiocaccamo/" twitter_url = "https://twitter.com/fabiocaccamo" package_name = "django-admin-interface" package_url = "{}/{}".format(github_url, package_name) -package_issues_url = "{}/issues".format(github_url) package_path = os.path.abspath(os.path.dirname(__file__)) long_description_file_path = os.path.join(package_path, "README.md") long_description_content_type = "text/markdown" @@ -39,8 +38,8 @@ setup( url=package_url, download_url="{}/archive/{}.tar.gz".format(package_url, __version__), project_urls={ - "Documentation": package_url, - "Issues": package_issues_url, + "Documentation": "{}#readme".format(package_url), + "Issues": "{}/issues".format(package_url), "Funding": sponsor_url, "Twitter": twitter_url, }, From 94c436b137dd1c09f44d124ebd14ee561b2b44b3 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 10 May 2022 10:43:40 +0200 Subject: [PATCH 002/326] Reformatted Theme model choices. --- admin_interface/models.py | 55 ++++++++------------------------------- 1 file changed, 11 insertions(+), 44 deletions(-) diff --git a/admin_interface/models.py b/admin_interface/models.py index 49ad035..b16f589 100644 --- a/admin_interface/models.py +++ b/admin_interface/models.py @@ -144,14 +144,8 @@ class Theme(models.Model): default=True, verbose_name=_("active") ) language_chooser_display_choices = ( - ( - "code", - _("code"), - ), - ( - "name", - _("name"), - ), + ("code", _("code")), + ("name", _("name")), ) language_chooser_display = models.CharField( max_length=10, @@ -303,42 +297,15 @@ class Theme(models.Model): verbose_name=_("background color"), ) related_modal_background_opacity_choices = ( - ( - "0.1", - "10%", - ), - ( - "0.2", - "20%", - ), - ( - "0.3", - "30%", - ), - ( - "0.4", - "40%", - ), - ( - "0.5", - "50%", - ), - ( - "0.6", - "60%", - ), - ( - "0.7", - "70%", - ), - ( - "0.8", - "80%", - ), - ( - "0.9", - "90%", - ), + ("0.1", "10%"), + ("0.2", "20%"), + ("0.3", "30%"), + ("0.4", "40%"), + ("0.5", "50%"), + ("0.6", "60%"), + ("0.7", "70%"), + ("0.8", "80%"), + ("0.9", "90%"), ) related_modal_background_opacity = models.CharField( max_length=5, From 04632078d110541a2f6ae67c855db855c36cfeea Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 10 May 2022 10:44:05 +0200 Subject: [PATCH 003/326] [css] Fixed dashboard alignment when recent-actions are not visible. --- .../static/admin_interface/css/recent-actions.css | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/admin_interface/static/admin_interface/css/recent-actions.css b/admin_interface/static/admin_interface/css/recent-actions.css index b6095e5..6e25164 100644 --- a/admin_interface/static/admin_interface/css/recent-actions.css +++ b/admin_interface/static/admin_interface/css/recent-actions.css @@ -1,13 +1,10 @@ .admin-interface.dashboard #content { + width: auto; max-width: 600px; - margin-right: auto; - margin-left: auto; + margin-right: 0; + margin-left: 0; } .admin-interface.dashboard #content #recent-actions-module { display: none; } - -.admin-interface.dashboard #content { - width: auto; -} \ No newline at end of file From 4212a695f0559303b446e29cb1c331497eb63284 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Sat, 14 May 2022 15:55:05 +0200 Subject: [PATCH 004/326] Updated create-release workflow. --- .github/workflows/create-release.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fc4df59..4dbc6f2 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -18,12 +18,7 @@ jobs: uses: ffurrer2/extract-release-notes@v1 - name: Create release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: ncipollo/release-action@v1 with: - tag_name: ${{ github.ref }} - release_name: ${{ github.ref }} - draft: false - prerelease: false body: ${{ steps.extract-release-notes.outputs.release_notes }} + token: ${{ secrets.WORKFLOWS_CREATE_RELEASE_TOKEN }} From 502b1af775f85f12985d3a3c3424a7679fbbf59b Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Sat, 14 May 2022 15:55:16 +0200 Subject: [PATCH 005/326] Updated CHANGELOG and version. --- CHANGELOG.md | 3 +++ admin_interface/version.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a226380..f412752 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.19.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.19.1) - 2022-05-14 +- [css] Fixed dashboard alignment when recent-actions are not visible. + ## [0.19.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.19.0) - 2022-03-08 - Converted dynamic inline CSS to external static CSS using CSS variables. #157 #93 (thanks to [@Mustafa-Abu-Ghazy](https://github.com/Mustafa-Abu-Ghazy)) diff --git a/admin_interface/version.py b/admin_interface/version.py index fa5390f..cd3814f 100644 --- a/admin_interface/version.py +++ b/admin_interface/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -__version__ = "0.19.0" +__version__ = "0.19.1" From ce552f9f0c63f806aee724aa6f13cf71a00deeed Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 16 Jun 2022 00:41:11 +0200 Subject: [PATCH 006/326] Updated README. [ci skip] --- README.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 24f5d00..47ea1dd 100644 --- a/README.md +++ b/README.md @@ -187,18 +187,17 @@ urlpatterns += i18n_patterns(path("admin/", admin.site.urls)) ## Testing ```bash -# create python virtual environment -virtualenv testing_django_admin_interface +# clone repository +git clone https://github.com/fabiocaccamo/django-admin-interface.git && cd django-admin-interface -# activate virtualenv -cd testing_django_admin_interface && . bin/activate +# create virtualenv and activate it +python -m venv venv && . venv/bin/activate -# clone repo -git clone https://github.com/fabiocaccamo/django-admin-interface.git src && cd src +# upgrade pip +python -m pip install --upgrade pip -# install dependencies -pip install -r requirements.txt -pip install -r requirements-test.txt +# install requirements +pip install -r requirements.txt -r requirements-test.txt # run tests tox @@ -215,6 +214,13 @@ Released under [MIT License](LICENSE.txt). --- +## Supporting + +- :star: Star this project on [GitHub](https://github.com/fabiocaccamo/django-admin-interface) +- :octocat: Follow me on [GitHub](https://github.com/fabiocaccamo) +- :blue_heart: Follow me on [Twitter](https://twitter.com/fabiocaccamo) +- :moneybag: Sponsor me on [Github](https://github.com/sponsors/fabiocaccamo) + ## See also - [`django-colorfield`](https://github.com/fabiocaccamo/django-colorfield) - simple color field for models with a nice color-picker in the admin. 🎨 From de09ffd7b1b13ea7f6484b62ac4f7c1b6b8c7da5 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Wed, 22 Jun 2022 14:43:31 +0200 Subject: [PATCH 007/326] Update FUNDING.yml --- .github/FUNDING.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 50ac1cd..9735e26 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1 @@ github: [fabiocaccamo] -custom: ['https://www.paypal.me/fabiocaccamo'] From 3156882cba8fa27cc16aad052ebb1493ec6e3cd5 Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Sun, 31 Jul 2022 16:15:07 +1000 Subject: [PATCH 008/326] docs: Fix a few typos (#166) --- .../admin_interface/magnific-popup/jquery.magnific-popup.js | 2 +- admin_interface/static/ckeditor/ckeditor/skins/light/skin.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin_interface/static/admin_interface/magnific-popup/jquery.magnific-popup.js b/admin_interface/static/admin_interface/magnific-popup/jquery.magnific-popup.js index 08aefc2..f06f96d 100755 --- a/admin_interface/static/admin_interface/magnific-popup/jquery.magnific-popup.js +++ b/admin_interface/static/admin_interface/magnific-popup/jquery.magnific-popup.js @@ -1507,7 +1507,7 @@ } }, - // Get element postion relative to viewport + // Get element position relative to viewport _getOffset: function(isLarge) { var el; if(isLarge) { diff --git a/admin_interface/static/ckeditor/ckeditor/skins/light/skin.js b/admin_interface/static/ckeditor/ckeditor/skins/light/skin.js index 8373225..0bc63f4 100644 --- a/admin_interface/static/ckeditor/ckeditor/skins/light/skin.js +++ b/admin_interface/static/ckeditor/ckeditor/skins/light/skin.js @@ -49,7 +49,7 @@ CKEDITOR.skin.name = 'husky'; // the complete list: // http://docs.ckeditor.com/#!/api/CKEDITOR.env // -// Internet explorer is an expection and the browser version is also accepted +// Internet explorer is an exception and the browser version is also accepted // (ie7, ie8, ie9, ie10), as well as a special name for IE in Quirks mode (iequirks). // // The available browser specific files must be set separately for editor.css From 003b0f9892c7546a8a763ca7d3ab93202880ddd0 Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 3 Aug 2022 14:07:08 -0400 Subject: [PATCH 009/326] Update admin_interface_tags.py (#168) --- admin_interface/templatetags/admin_interface_tags.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/admin_interface/templatetags/admin_interface_tags.py b/admin_interface/templatetags/admin_interface_tags.py index e3ce5a6..525a288 100644 --- a/admin_interface/templatetags/admin_interface_tags.py +++ b/admin_interface/templatetags/admin_interface_tags.py @@ -80,9 +80,9 @@ def get_admin_interface_version(): def hash_string(text): - hash_object = hashlib.md5(text.encode()) - md5_hash = hash_object.hexdigest() - return md5_hash + hash_object = hashlib.sha224(text.encode()) + sha224_hash = hash_object.hexdigest() + return sha224_hash @simple_tag(takes_context=False) From 11bde80a36ebf2d6e4131c46c341e8cc6effd3c3 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 4 Aug 2022 14:41:46 +0200 Subject: [PATCH 010/326] Update `CHANGELOG` and version. --- CHANGELOG.md | 3 +++ admin_interface/version.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f412752..d867e17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.19.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.19.2) - 2022-08-04 +- Fix `hashlib` compatibility with `FIPS` enabled systems. #167 (by [@jonlev1n](https://github.com/jonlev1n) in #168) + ## [0.19.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.19.1) - 2022-05-14 - [css] Fixed dashboard alignment when recent-actions are not visible. diff --git a/admin_interface/version.py b/admin_interface/version.py index cd3814f..f860ce6 100644 --- a/admin_interface/version.py +++ b/admin_interface/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -__version__ = "0.19.1" +__version__ = "0.19.2" From b90ed72ef648984d1dc665c64963788730579980 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 25 Aug 2022 11:58:20 +0200 Subject: [PATCH 011/326] Update `README` css variables section. --- README.md | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 47ea1dd..e235fc9 100644 --- a/README.md +++ b/README.md @@ -100,31 +100,48 @@ You can add a theme you've created through the admin to this repository by [send 4. Edit the section above to document your theme. ### Add theme support to third-party libraries -You can add **theme support to existing third-party libraries** using the following **css variables**: +You can add **theme support to existing third-party libraries** using the following **CSS variables**: -- `--admin-interface-title-color` -- `--admin-interface-logo-color` -- `--admin-interface-env-color` -- `--admin-interface-header-background-color:` +#### Header + +- `--admin-interface-header-background-color` - `--admin-interface-header-text-color` - `--admin-interface-header-link-color` - `--admin-interface-header-link_hover-color` +- `--admin-interface-title-color` +- `--admin-interface-env-color` + +#### Logo + +- `--admin-interface-logo-color` +- `--admin-interface-logo-default-background-image` +- `--admin-interface-logo-max-width` +- `--admin-interface-logo-max-height` + +#### Modules / Links - `--admin-interface-module-background-color` - `--admin-interface-module-background-selected-color` +- `--admin-interface-module-border-radius` - `--admin-interface-module-text-color` - `--admin-interface-module-link-color` - `--admin-interface-module-link-selected-color` - `--admin-interface-module-link-hover-color` - `--admin-interface-generic-link-color` - `--admin-interface-generic-link-hover-color` + +#### Buttons - `--admin-interface-save-button-background-color` - `--admin-interface-save-button-background-hover-color` - `--admin-interface-save-button-text-color` - `--admin-interface-delete-button-background-color` - `--admin-interface-delete-button-background-hover-color` - `--admin-interface-delete-button-text-color` + +#### Related Modal - `--admin-interface-related-modal-background-color` - `--admin-interface-related-modal-background-opacity` +- `--admin-interface-related-modal-border-radius` +- `--admin-interface-related-modal-close-button-display` --- From 53e9b3f9f7d8e4f8578f2a9c9ab97e8a368ea3a8 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 25 Aug 2022 11:58:54 +0200 Subject: [PATCH 012/326] Fix CSS variable name typo. --- .../static/admin_interface/css/admin-interface.css | 4 ++-- admin_interface/templates/admin/base_site.html | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/admin_interface/static/admin_interface/css/admin-interface.css b/admin_interface/static/admin_interface/css/admin-interface.css index 7480c08..94f5990 100644 --- a/admin_interface/static/admin_interface/css/admin-interface.css +++ b/admin_interface/static/admin_interface/css/admin-interface.css @@ -127,8 +127,8 @@ .admin-interface #branding h1 img.logo, .admin-interface.login #header #branding h1 img.logo { - max-width: var(--admin-interface-log-max-width); - max-height: var(--admin-interface-log-max-height); + max-width: var(--admin-interface-logo-max-width); + max-height: var(--admin-interface-logo-max-height); } .admin-interface #header #user-tools a { diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index 70515cc..ec134cc 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -44,15 +44,15 @@ {% endif %} {% if theme.logo_max_width > 0 %} - --admin-interface-log-max-width: min({{ theme.logo_max_width }}px, 100%); + --admin-interface-logo-max-width: min({{ theme.logo_max_width }}px, 100%); {% else %} - --admin-interface-log-max-width: 100%; + --admin-interface-logo-max-width: 100%; {% endif %} {% if theme.logo_max_height > 0 %} - --admin-interface-log-max-height: {{ theme.logo_max_height }}px; + --admin-interface-logo-max-height: {{ theme.logo_max_height }}px; {% else %} - --admin-interface-log-max-height: unset; + --admin-interface-logo-max-height: unset; {% endif %} {% if theme.related_modal_rounded_corners %} From 6eebeb62c12cfac712ef2fb8f00b38e1a432cc39 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 25 Aug 2022 12:00:44 +0200 Subject: [PATCH 013/326] Removed testing comments. --- .../static/admin_interface/related-modal/related-modal.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/admin_interface/static/admin_interface/related-modal/related-modal.js b/admin_interface/static/admin_interface/related-modal/related-modal.js index 49c4fd9..6b02945 100644 --- a/admin_interface/static/admin_interface/related-modal/related-modal.js +++ b/admin_interface/static/admin_interface/related-modal/related-modal.js @@ -136,15 +136,12 @@ if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined') window.presentRelatedObjectModalOnClickOn = presentRelatedObjectModalOnClickOn; // django 1.7 compatibility - // $('a.add-another').removeAttr('onclick').click({ lookup:false }, presentRelatedObjectModal); presentRelatedObjectModalOnClickOn('a.add-another'); // django 1.8 and above - // $('a.related-widget-wrapper-link').click({ lookup:false }, presentRelatedObjectModal); presentRelatedObjectModalOnClickOn('a.related-widget-wrapper-link'); // raw_id_fields support - // $('a.related-lookup').unbind('click').click({ lookup:true }, presentRelatedObjectModal); presentRelatedObjectModalOnClickOn('a.related-lookup', true); // django-dynamic-raw-id support - #61 From 769fab5e84294dec13da501242b5de3df3b2bbfd Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 25 Aug 2022 12:03:39 +0200 Subject: [PATCH 014/326] Add `django-streamfield` compatibility. --- README.md | 1 + .../admin_interface/css/streamfield.css | 200 ++++++++++++++++++ .../related-modal/related-modal.js | 14 +- .../streamfield/js/admin_popup_response.js | 22 ++ .../templates/admin/base_site.html | 2 + 5 files changed, 237 insertions(+), 2 deletions(-) create mode 100644 admin_interface/static/admin_interface/css/streamfield.css create mode 100644 admin_interface/static/streamfield/js/admin_popup_response.js diff --git a/README.md b/README.md index e235fc9..5c00ab4 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ django-admin-interface is a modern **responsive flat admin interface customizabl - `django-json-widget` - `django-modeltranslation` - `django-tabbed-admin` + - `django-streamfield` - `sorl-thumbnail` --- diff --git a/admin_interface/static/admin_interface/css/streamfield.css b/admin_interface/static/admin_interface/css/streamfield.css new file mode 100644 index 0000000..71ce2db --- /dev/null +++ b/admin_interface/static/admin_interface/css/streamfield.css @@ -0,0 +1,200 @@ +/* +django-streamfield support +https://github.com/raagin/django-streamfield/ +*/ + +.admin-interface .form-row.field-stream { + margin: 0; + padding: 0; + border-bottom: none; +} + +.admin-interface .form-row.field-stream label[for=id_stream] { + display: none; +} + +.admin-interface .streamfield_app { + clear: both; + width: 100%; +} + +.admin-interface .streamfield_app .stream-help-text { + margin-bottom: 15px; + display: flex; + flex-direction: column; + clear: both; +} + +.admin-interface .streamfield_app .stream-help-text .stream-help-text__title { + align-self: flex-end; + user-select: none; + padding: 8px; + padding-right: 0; + color: var(--admin-interface-generic-link-color); +} + +.admin-interface .streamfield_app .stream-help-text .stream-help-text__title:hover { + color: var(--admin-interface-generic-link-hover-color); +} + +.admin-interface .streamfield_app .stream-help-text .stream-help-text__content { + background: var(--admin-interface-module-background-selected-color); + border-radius: var(--admin-interface-module-border-radius); + border: 1px solid rgba(0,0,0,0.1); + padding: 15px; +} + +.admin-interface .streamfield_app .stream-help-text .stream-help-text__content > ul { + margin: 0; + padding: 0; +} + +.admin-interface .streamfield_app .collapse-handler { + user-select: none; + padding: 8px; + padding-right: 0; + margin: 0 0 5px 0; + color: var(--admin-interface-generic-link-color); + text-decoration: none; +} + +.admin-interface .streamfield_app .collapse-handler:hover { + color: var(--admin-interface-generic-link-hover-color); + text-decoration: none; +} + +.admin-interface .streamfield_app .stream-model-block { + position: relative; + box-shadow: none; + border: 1px solid rgba(0,0,0,0.1); + border-radius: var(--admin-interface-module-border-radius); + overflow: hidden; +} + +.admin-interface .streamfield_app .stream-model-block, +.admin-interface .streamfield_app .streamfield-models.collapsed .stream-model-block { + margin-bottom: 10px; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin: 0; + padding: 10px 10px 10px 20px; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title span { + font-size: 18px; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle { + position: static; + right: 0; + top: 0; + color: var(--admin-interface-generic-link-color); +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle:hover { + color: var(--admin-interface-generic-link-hover-color); +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle { + display: flex; + justify-content: center; + align-items: center; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move, +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-delete { + display: flex; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + font-weight: normal; + background: none; + flex-shrink: 0; + color: inherit; + font-size: 16px; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move { + cursor: move; /* fallback if grab cursor is unsupported */ + cursor: grab; + cursor: -moz-grab; + cursor: -webkit-grab; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move:before { + content: "↕"; + + display: block; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-delete:before { + content: "×"; + display: block; + font-size: 18px; +} + +.admin-interface .streamfield_app .block-fields > div { + margin-bottom: 15px; +} + +.admin-interface .streamfield_app .stream-model-block .stream-model-block__content { + background-color: #f8f8f8; + padding: 20px; +} + +.admin-interface .streamfield_app .stream-model-block .stream-model-block__content.no-subblocks.abstract-block { + display: none; +} + +.admin-interface .streamfield_app .stream-insert-new-block { + margin-bottom: 20px; +} + +.admin-interface .streamfield_app .stream-insert-new-block .add-new-block-button { + color: var(--admin-interface-generic-link-color); + text-decoration: none; +} + +.admin-interface .streamfield_app .stream-insert-new-block .add-new-block-button:hover { + color: var(--admin-interface-generic-link-hover-color); + text-decoration: none; +} + +.admin-interface .streamfield_app .stream-insert-new-block ul { + display: block; + width: 100%; + margin: 10px 0 0 0; + padding: 0; + user-select: none; +} + +.admin-interface .streamfield_app .stream-insert-new-block ul li { + display: inline-block; + font-size: 12px; + margin: 0; + padding: 0; +} + +.admin-interface .streamfield_app .stream-btn { + font-weight: normal; + text-decoration: none; + background-color: var(--admin-interface-generic-link-color); + padding: 6px 12px; + border-radius: 4px; +} + +.admin-interface .streamfield_app .stream-btn:hover { + text-decoration: none; + background-color: var(--admin-interface-generic-link-hover-color); +} + +.admin-interface .streamfield_app .stream-insert-new-block ul li .stream-btn { + margin-top: 5px; + margin-left: 5px; +} diff --git a/admin_interface/static/admin_interface/related-modal/related-modal.js b/admin_interface/static/admin_interface/related-modal/related-modal.js index 6b02945..b3b9d32 100644 --- a/admin_interface/static/admin_interface/related-modal/related-modal.js +++ b/admin_interface/static/admin_interface/related-modal/related-modal.js @@ -148,8 +148,18 @@ if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined') // https://github.com/lincolnloop/django-dynamic-raw-id presentRelatedObjectModalOnClickOn('a.dynamic_raw_id-related-lookup', true); - // show_change_link=True support - presentRelatedObjectModalOnClickOn('a.inlinechangelink'); + // django-streamfield support + // https://github.com/raagin/django-streamfield/ + presentRelatedObjectModalOnClickOn('.streamfield_app a.stream-btn[href*="_popup=1"]'); + // Vanilla js for catching the click during capture phase for anticipating Vue.js listener. + document.addEventListener('click', function(event) { + // console.log('click intercepted before Vue.'); + if (event.target.matches('.streamfield_app a.stream-btn[href*="_popup=1"]')) { + event.stopImmediatePropagation(); + event.preventDefault(); + $(event.target).trigger('click'); + } + }, { capture: true }); }); })(django.jQuery); diff --git a/admin_interface/static/streamfield/js/admin_popup_response.js b/admin_interface/static/streamfield/js/admin_popup_response.js new file mode 100644 index 0000000..bd41559 --- /dev/null +++ b/admin_interface/static/streamfield/js/admin_popup_response.js @@ -0,0 +1,22 @@ +(function() { + + 'use strict'; + + var windowRef = window; + var openerRef = windowRef.parent; + + var initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); + switch (initData.action) { + case 'change': + openerRef.streamapps[initData.app_id].updateBlock(initData.block_id, initData.instance_id); + openerRef.dismissRelatedObjectModal(); + break; + case 'delete': + break; + default: + openerRef.streamapps[initData.app_id].updateBlock(initData.block_id, initData.instance_id); + openerRef.dismissRelatedObjectModal(); + break; + } + +})(); \ No newline at end of file diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index ec134cc..7614ba6 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -91,6 +91,8 @@ {% endif %} + Date: Thu, 25 Aug 2022 12:17:01 +0200 Subject: [PATCH 015/326] Update `CHANGELOG` and version. --- CHANGELOG.md | 3 +++ admin_interface/version.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d867e17..98df847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.20.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.20.0) - 2022-08-25 +- Add `django-streamfield` compatibility. + ## [0.19.2](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.19.2) - 2022-08-04 - Fix `hashlib` compatibility with `FIPS` enabled systems. #167 (by [@jonlev1n](https://github.com/jonlev1n) in #168) diff --git a/admin_interface/version.py b/admin_interface/version.py index f860ce6..26b43de 100644 --- a/admin_interface/version.py +++ b/admin_interface/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -__version__ = "0.19.2" +__version__ = "0.20.0" From 833acf49a1d7242875876c80b192ebf38c56508d Mon Sep 17 00:00:00 2001 From: "Yury V. Zaytsev" Date: Tue, 20 Sep 2022 11:17:25 +0200 Subject: [PATCH 016/326] Fix `README.md` typo on French language name. (#171) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c00ab4..4fe39df 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,7 @@ You must configure multilanguage `settings` and `urls` correctly: LANGUAGES = ( ("en", _("English")), ("it", _("Italiano")), - ("fr", _("Française")), + ("fr", _("Français")), # more than one language is expected here ) LANGUAGE_CODE = "en" From 5fb85d02a2890e3d7d1632b8be3ec2a15691469c Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Wed, 28 Sep 2022 12:46:11 +0200 Subject: [PATCH 017/326] [css] Fix paginator missing `border-top` on mobile. --- admin_interface/static/admin_interface/css/form-controls.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin_interface/static/admin_interface/css/form-controls.css b/admin_interface/static/admin_interface/css/form-controls.css index 500b52a..2104130 100644 --- a/admin_interface/static/admin_interface/css/form-controls.css +++ b/admin_interface/static/admin_interface/css/form-controls.css @@ -16,7 +16,7 @@ white-space: nowrap; text-overflow: ellipsis; border-radius: 0; - border-top: 1px solid #EEEEEE; + border-top: 1px solid #EEEEEE !important; border-bottom: none; margin: 0; } From 990db6fdc89cdbccce952571d7028683545f8980 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Wed, 28 Sep 2022 15:36:46 +0200 Subject: [PATCH 018/326] [css] Fix sticky list filter scrolling. #175 --- .../admin_interface/css/admin-interface.css | 17 ++++++++++++++--- .../css/list-filter-dropdown.css | 8 ++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/admin_interface/static/admin_interface/css/admin-interface.css b/admin_interface/static/admin_interface/css/admin-interface.css index 94f5990..2ad4ec6 100644 --- a/admin_interface/static/admin_interface/css/admin-interface.css +++ b/admin_interface/static/admin_interface/css/admin-interface.css @@ -347,9 +347,17 @@ @media (min-width: 768px) { .admin-interface.list-filter-sticky .module.filtered #changelist-filter { position: sticky; - top: 40px; + top: 30px; float: right; z-index: 30; + display: flex; + flex-direction: column; + overflow-y: auto; + height: 100%; + max-height: calc(100vh - 60px); + } + .admin-interface.list-filter-sticky.sticky-pagination .module.filtered #changelist-filter { + max-height: calc(100vh - 125px); } /* feature not available for django < 3.1.2 */ @@ -357,12 +365,15 @@ position: absolute; top: 0px; z-index: 30; + max-height: calc(100vh - 105px); + } + .admin-interface.list-filter-sticky.sticky-pagination .module.filtered #toolbar + #changelist-filter { + max-height: calc(100vh - 170px); } } .admin-interface .module.filtered #changelist-filter { - border-bottom-left-radius: var(--admin-interface-module-border-radius); - border-bottom-right-radius: var(--admin-interface-module-border-radius); + border-radius: var(--admin-interface-module-border-radius); } .admin-interface .module.filtered #changelist-filter #changelist-filter-clear a:focus, diff --git a/admin_interface/static/admin_interface/css/list-filter-dropdown.css b/admin_interface/static/admin_interface/css/list-filter-dropdown.css index d1fc14c..2d20a7d 100644 --- a/admin_interface/static/admin_interface/css/list-filter-dropdown.css +++ b/admin_interface/static/admin_interface/css/list-filter-dropdown.css @@ -3,8 +3,12 @@ list-filter-dropdown */ .admin-interface .list-filter-dropdown { - margin-top:10px; - margin-bottom:20px; + margin-top: 0; + margin-bottom: 20px; +} + +.admin-interface .list-filter-dropdown h3 { + margin-top: 0; } .admin-interface .list-filter-dropdown select { From 585575dce75df3ce12b9cb59baca94f543a11cac Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Wed, 28 Sep 2022 16:34:26 +0200 Subject: [PATCH 019/326] [js] Fix modal window not closing on save with `django >= 4.0`. #169 --- admin_interface/static/admin/js/popup_response.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/admin_interface/static/admin/js/popup_response.js b/admin_interface/static/admin/js/popup_response.js index 6dab531..f669389 100644 --- a/admin_interface/static/admin/js/popup_response.js +++ b/admin_interface/static/admin/js/popup_response.js @@ -3,6 +3,7 @@ 'use strict'; var windowRef = window; + var windowRefProxy; var windowName, widgetName; var openerRef = windowRef.opener; if (!openerRef) { @@ -14,12 +15,14 @@ // django < 3.1 compatibility widgetName = openerRef.id_to_windowname(widgetName); } - windowRef = { + windowRefProxy = { name: widgetName, + location: windowRef.location, close: function() { openerRef.dismissRelatedObjectModal(); } }; + windowRef = windowRefProxy; } // default django popup_response.js From 8562c2dbfbf37cf30910359bcf38eea830519e24 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Wed, 28 Sep 2022 16:55:00 +0200 Subject: [PATCH 020/326] [css] Move `language-chooser` style to its own CSS file. --- .../admin_interface/css/language-chooser.css | 29 +++++++++++++++++++ .../templates/admin/base_site.html | 1 + 2 files changed, 30 insertions(+) create mode 100644 admin_interface/static/admin_interface/css/language-chooser.css diff --git a/admin_interface/static/admin_interface/css/language-chooser.css b/admin_interface/static/admin_interface/css/language-chooser.css new file mode 100644 index 0000000..d9ca1dd --- /dev/null +++ b/admin_interface/static/admin_interface/css/language-chooser.css @@ -0,0 +1,29 @@ +.admin-interface .language-chooser { + display: inline-block; + position: absolute; + top: 15px; + right: 15px; + z-index: 10; +} + +@media (min-width: 768px) { + .admin-interface .language-chooser { + right: 30px; + } +} + +@media (min-width: 1024px) { + .admin-interface .language-chooser { + position: static; + float: right; + margin-left: 20px; + } +} + +.admin-interface .language-chooser-hidden-form { + display: none; +} + +.admin-interface .language-chooser-select-form { + display: inline-block; +} \ No newline at end of file diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index 7614ba6..96695fb 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -83,6 +83,7 @@ + {% if not theme.recent_actions_visible %} From 668c8c806b5671ac16d489d7c76fff392debdce5 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Wed, 28 Sep 2022 16:58:44 +0200 Subject: [PATCH 021/326] [html] Add missing version cache-buster to some stylesheets. --- admin_interface/templates/admin/base_site.html | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index 96695fb..86d5399 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -82,13 +82,15 @@ href="{% static 'admin_interface/css/admin-interface.css' %}?v={{ version_md5_cache }}"> - - + + {% if not theme.recent_actions_visible %} - + {% endif %} @@ -106,7 +108,8 @@ href="{% static 'admin_interface/css/tinymce.css' %}?v={{ version_md5_cache }}"/> - + {% if current_lang == 'fa' %} From 8d3d7c9648c58c7c5d0cc219bae2ef6fa43abd8b Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Wed, 28 Sep 2022 18:00:05 +0200 Subject: [PATCH 022/326] [css] Fix variable name typo. --- admin_interface/static/admin_interface/css/admin-interface.css | 2 +- admin_interface/templates/admin/base_site.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin_interface/static/admin_interface/css/admin-interface.css b/admin_interface/static/admin_interface/css/admin-interface.css index 2ad4ec6..618a34b 100644 --- a/admin_interface/static/admin_interface/css/admin-interface.css +++ b/admin_interface/static/admin_interface/css/admin-interface.css @@ -137,7 +137,7 @@ .admin-interface #header #user-tools a:hover, .admin-interface #header #user-tools a:active { - color: var(--admin-interface-header-link_hover-color); + color: var(--admin-interface-header-link-hover-color); border-bottom-color: rgba(255, 255, 255, 0.5); } diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index 86d5399..da7e7f8 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -19,7 +19,7 @@ --admin-interface-header-background-color: {{ theme.css_header_background_color }}; --admin-interface-header-text-color: {{ theme.css_header_text_color }}; --admin-interface-header-link-color: {{ theme.css_header_link_color }}; - --admin-interface-header-link_hover-color: {{ theme.css_header_link_hover_color }}; + --admin-interface-header-link-hover-color: {{ theme.css_header_link_hover_color }}; --admin-interface-module-background-color: {{ theme.css_module_background_color }}; --admin-interface-module-background-selected-color: {{ theme.css_module_background_selected_color }}; --admin-interface-module-text-color: {{ theme.css_module_text_color }}; From 40b8963d74e6b5879a90cadd82e2942ebbb084fb Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Wed, 28 Sep 2022 18:55:50 +0200 Subject: [PATCH 023/326] Add language chooser control option (default select, minimal select). #136 --- admin_interface/admin.py | 1 + .../0025_theme_language_chooser_control.py | 24 ++++++++ admin_interface/models.py | 10 ++++ .../admin_interface/css/language-chooser.css | 58 +++++++++++++++++-- .../templates/admin/base_site.html | 8 ++- .../admin_interface/language_chooser.html | 2 +- 6 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 admin_interface/migrations/0025_theme_language_chooser_control.py diff --git a/admin_interface/admin.py b/admin_interface/admin.py index 5238bad..f39c3bc 100644 --- a/admin_interface/admin.py +++ b/admin_interface/admin.py @@ -45,6 +45,7 @@ class ThemeAdmin(admin.ModelAdmin): "classes": ("wide",), "fields": ( "language_chooser_active", + "language_chooser_control", "language_chooser_display", ), }, diff --git a/admin_interface/migrations/0025_theme_language_chooser_control.py b/admin_interface/migrations/0025_theme_language_chooser_control.py new file mode 100644 index 0000000..e25e5cb --- /dev/null +++ b/admin_interface/migrations/0025_theme_language_chooser_control.py @@ -0,0 +1,24 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("admin_interface", "0024_remove_theme_css"), + ] + + operations = [ + migrations.AddField( + model_name="theme", + name="language_chooser_control", + field=models.CharField( + choices=[ + ("default-select", "Default Select"), + ("minimal-select", "Minimal Select"), + ], + default="select", + max_length=20, + verbose_name="control", + ), + ), + ] diff --git a/admin_interface/models.py b/admin_interface/models.py index b16f589..63b8b3d 100644 --- a/admin_interface/models.py +++ b/admin_interface/models.py @@ -143,6 +143,16 @@ class Theme(models.Model): language_chooser_active = models.BooleanField( default=True, verbose_name=_("active") ) + language_chooser_control_choices = ( + ("default-select", _("Default Select")), + ("minimal-select", _("Minimal Select")), + ) + language_chooser_control = models.CharField( + max_length=20, + choices=language_chooser_control_choices, + default="default-select", + verbose_name=_("control"), + ) language_chooser_display_choices = ( ("code", _("code")), ("name", _("name")), diff --git a/admin_interface/static/admin_interface/css/language-chooser.css b/admin_interface/static/admin_interface/css/language-chooser.css index d9ca1dd..c5a870c 100644 --- a/admin_interface/static/admin_interface/css/language-chooser.css +++ b/admin_interface/static/admin_interface/css/language-chooser.css @@ -15,15 +15,65 @@ @media (min-width: 1024px) { .admin-interface .language-chooser { position: static; - float: right; margin-left: 20px; } } -.admin-interface .language-chooser-hidden-form { +.admin-interface .language-chooser .language-chooser-hidden-form { display: none; } -.admin-interface .language-chooser-select-form { +.admin-interface .language-chooser .language-chooser-select-form { display: inline-block; -} \ No newline at end of file + position: relative; + z-index: 0; +} + +.admin-interface .language-chooser select { + width: auto; + min-width: auto; +} + +.admin-interface .language-chooser.minimal .language-chooser-select-form::after { + content: ""; + position: absolute; + right: 2px; + top: 50%; + border: solid var(--admin-interface-header-text-color); + border-width: 0px 0px 1px 1px; + display: inline-block; + padding: 2px; + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + pointer-events: none; + margin-top: -4px; +} + +.admin-interface .language-chooser.minimal .language-chooser-select-form:hover select { + border-bottom: 1px solid transparent; + color: var(--admin-interface-header-link-hover-color); +} + +.admin-interface .language-chooser.minimal select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; + border: none; + border-bottom: 1px solid rgba(255, 255, 255, 0.25); + border-radius: 0; + color: var(--admin-interface-header-link-color); + cursor: pointer; + font-weight: inherit; + font-size: inherit; + letter-spacing: inherit; + height: auto; + margin: 0; + padding: 0 12px 0 0; +} + +@-moz-document url-prefix() { + .admin-interface .language-chooser.minimal select { + text-indent: -1px !important; + } +} diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index da7e7f8..c676834 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -165,9 +165,15 @@ flat-theme admin-interface {% block welcome-msg %} {% get_admin_interface_theme as theme %} +{% if theme.env_visible_in_header %}{{ theme.env_name }}
{% endif %}{{ block.super }}
+{{ block.super }} +{% endblock %} + +{% block userlinks %} +{{ block.super }} +{% get_admin_interface_theme as theme %} {% if theme.language_chooser_active %} {% get_admin_interface_languages as languages %} {% include "admin_interface/language_chooser.html" %} {% endif %} -{% if theme.env_visible_in_header %}{{ theme.env_name }}
{% endif %}{{ block.super }}
{% endblock %} diff --git a/admin_interface/templates/admin_interface/language_chooser.html b/admin_interface/templates/admin_interface/language_chooser.html index 15ea3e5..1b69cfe 100644 --- a/admin_interface/templates/admin_interface/language_chooser.html +++ b/admin_interface/templates/admin_interface/language_chooser.html @@ -1,7 +1,7 @@ {% load admin_interface_tags %} {% if languages %} -
+
{% for language in languages %}
{% csrf_token %} From 5ac75f5cf37b86a2b512c4fb9d64c122ccbfe557 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 29 Sep 2022 09:34:12 +0200 Subject: [PATCH 024/326] Fix `language_choose_control` migration default value. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Éric <635179+merwok@users.noreply.github.com> --- .../migrations/0025_theme_language_chooser_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin_interface/migrations/0025_theme_language_chooser_control.py b/admin_interface/migrations/0025_theme_language_chooser_control.py index e25e5cb..a01953c 100644 --- a/admin_interface/migrations/0025_theme_language_chooser_control.py +++ b/admin_interface/migrations/0025_theme_language_chooser_control.py @@ -16,7 +16,7 @@ class Migration(migrations.Migration): ("default-select", "Default Select"), ("minimal-select", "Minimal Select"), ], - default="select", + default="default-select", max_length=20, verbose_name="control", ), From 04df53ee4b0298155bbde5c2e2af2e4980b93ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric?= Date: Thu, 29 Sep 2022 03:37:26 -0400 Subject: [PATCH 025/326] Add support for collapsible fieldsets that start expanded. #177 * support collapsible fieldsets that start expanded * address review comments --- README.md | 22 +++++++-- admin_interface/static/admin/js/collapse.js | 49 +++++++++++++++++++++ 2 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 admin_interface/static/admin/js/collapse.js diff --git a/README.md b/README.md index 4fe39df..89623c9 100644 --- a/README.md +++ b/README.md @@ -28,10 +28,12 @@ django-admin-interface is a modern **responsive flat admin interface customizabl - Environment name/marker - Language chooser - List filter dropdown -- `NEW` **Foldable apps** *(accordions in the navigation bar)* -- `NEW` **List filter sticky** -- `NEW` **Form controls sticky** *(pagination and save/delete buttons)* -- Compatibility / Style optimizations for: +- Foldable apps *(accordions in the navigation bar)* +- [Collapsible fieldsets](https://docs.djangoproject.com/en/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets) + can have their initial state expanded instead of collapsed +- List filter sticky +- Form controls sticky *(pagination and save/delete buttons)* +- Compatibility / style optimizations for: - `django-ckeditor` - `django-dynamic-raw-id` - `django-json-widget` @@ -65,6 +67,18 @@ SILENCED_SYSTEM_CHECKS = ["security.W019"] - Run `python manage.py collectstatic` - Restart your application server +#### Optional features + +To make a fieldset start expanded with a `Hide` button to collapse: +```python + fieldsets = [ + ("Section title", { + "classes": ("collapse", "expanded"), + "fields": (...), + }), + ] +``` + #### Upgrade - Run `pip install django-admin-interface --upgrade` - Run `python manage.py migrate` *(add* `--fake-initial` *if you are upgrading from 0.1.0 version)* diff --git a/admin_interface/static/admin/js/collapse.js b/admin_interface/static/admin/js/collapse.js new file mode 100644 index 0000000..efe0b1b --- /dev/null +++ b/admin_interface/static/admin/js/collapse.js @@ -0,0 +1,49 @@ +/*global gettext*/ +/* copied from django 4.0.7 */ +'use strict'; +{ + window.addEventListener('load', function() { + // Add anchor tag for Show/Hide link + const fieldsets = document.querySelectorAll('fieldset.collapse'); + for (const [i, elem] of fieldsets.entries()) { + // Don't hide if fields in this fieldset have errors + if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) { + const h2 = elem.querySelector('h2'); + const link = document.createElement('a'); + link.id = 'fieldsetcollapser' + i; + link.className = 'collapse-toggle'; + link.href = '#'; + // changed: can opt into starting visible + if (elem.classList.contains('expanded')) { + link.textContent = gettext('Hide'); + } else { + link.textContent = gettext('Show'); + elem.classList.add('collapsed'); + } + h2.appendChild(document.createTextNode(' (')); + h2.appendChild(link); + h2.appendChild(document.createTextNode(')')); + } + } + // Add toggle to hide/show anchor tag + const toggleFunc = function(ev) { + if (ev.target.matches('.collapse-toggle')) { + ev.preventDefault(); + ev.stopPropagation(); + const fieldset = ev.target.closest('fieldset'); + if (fieldset.classList.contains('collapsed')) { + // Show + ev.target.textContent = gettext('Hide'); + fieldset.classList.remove('collapsed'); + } else { + // Hide + ev.target.textContent = gettext('Show'); + fieldset.classList.add('collapsed'); + } + } + }; + document.querySelectorAll('fieldset.module').forEach(function(el) { + el.addEventListener('click', toggleFunc); + }); + }); +} From 56f876d25ef965bf34b777741a1712bb39e9ad22 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Fri, 30 Sep 2022 09:29:55 +0200 Subject: [PATCH 026/326] Update README.md (remove broken visitors badge). [ci skip] --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 89623c9..883d4b9 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ [![](https://img.shields.io/pypi/v/django-admin-interface.svg?color=blue&logo=pypi&logoColor=white)](https://pypi.org/project/django-admin-interface/) [![](https://pepy.tech/badge/django-admin-interface/month)](https://pepy.tech/project/django-admin-interface) [![](https://img.shields.io/github/stars/fabiocaccamo/django-admin-interface?logo=github)](https://github.com/fabiocaccamo/django-admin-interface/) -[![](https://badges.pufler.dev/visits/fabiocaccamo/django-admin-interface?label=visitors&color=blue)](https://badges.pufler.dev) [![](https://img.shields.io/pypi/l/django-admin-interface.svg?color=blue)](https://github.com/fabiocaccamo/django-admin-interface/blob/master/LICENSE.txt) [![](https://img.shields.io/github/workflow/status/fabiocaccamo/django-admin-interface/Test%20package?label=build&logo=github)](https://github.com/fabiocaccamo/django-admin-interface) From f25d340738fad84d87b19ee995fb665ae0974d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric?= Date: Thu, 6 Oct 2022 03:47:19 -0400 Subject: [PATCH 027/326] Add option to make active list filters more visible. #178 * add option to make active list filters more visible * fix margins and border radius for selected filters --- .../0026_theme_list_filter_highlight.py | 18 +++++++++++++ admin_interface/models.py | 3 +++ .../admin_interface/css/admin-interface.css | 25 ++++++++++++++++++- .../css/list-filter-dropdown.css | 6 ++++- .../templates/admin/base_site.html | 1 + admin_interface/templates/admin/filter.html | 7 +++--- .../admin_interface/dropdown_filter.html | 2 +- 7 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 admin_interface/migrations/0026_theme_list_filter_highlight.py diff --git a/admin_interface/migrations/0026_theme_list_filter_highlight.py b/admin_interface/migrations/0026_theme_list_filter_highlight.py new file mode 100644 index 0000000..d64375c --- /dev/null +++ b/admin_interface/migrations/0026_theme_list_filter_highlight.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.7 on 2022-09-28 17:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('admin_interface', '0025_theme_language_chooser_control'), + ] + + operations = [ + migrations.AddField( + model_name='theme', + name='list_filter_highlight', + field=models.BooleanField(default=True, verbose_name='highlight active'), + ), + ] diff --git a/admin_interface/models.py b/admin_interface/models.py index 63b8b3d..8bda743 100644 --- a/admin_interface/models.py +++ b/admin_interface/models.py @@ -331,6 +331,9 @@ class Theme(models.Model): default=True, verbose_name=_("close button visible") ) + list_filter_highlight = models.BooleanField( + default=True, verbose_name=_("highlight active") + ) list_filter_dropdown = models.BooleanField( default=True, verbose_name=_("use dropdown") ) diff --git a/admin_interface/static/admin_interface/css/admin-interface.css b/admin_interface/static/admin_interface/css/admin-interface.css index 618a34b..1de719d 100644 --- a/admin_interface/static/admin_interface/css/admin-interface.css +++ b/admin_interface/static/admin_interface/css/admin-interface.css @@ -388,12 +388,35 @@ text-decoration: none; } +.admin-interface.list-filter-highlight .module.filtered #changelist-filter h3.active { + font-weight: bold; +} + +.admin-interface.list-filter-highlight .module.filtered #changelist-filter ul.active li.selected { + color: var(--admin-interface-module-text-color); + background: var(--admin-interface-module-background-color); + margin-left: -10px; + padding-left: 5px; + margin-right: -10px; + border-left: 5px solid var(--admin-interface-module-background-color); + border-right: 5px solid var(--admin-interface-module-background-color); + border-radius: var(--admin-interface-module-border-radius); +} + +.admin-interface.list-filter-highlight .module.filtered #changelist-filter ul.active li.selected a, +.admin-interface.list-filter-highlight .module.filtered #changelist-filter ul.active li.selected a:link, +.admin-interface.list-filter-highlight .module.filtered #changelist-filter ul.active li.selected a:visited, +.admin-interface.list-filter-highlight .module.filtered #changelist-filter ul.active li.selected a:focus, +.admin-interface.list-filter-highlight .module.filtered #changelist-filter ul.active li.selected a:hover { + background: inherit; + color: inherit; +} + .admin-interface .module.filtered #changelist-filter li.selected a, .admin-interface .module.filtered #changelist-filter li.selected a:link, .admin-interface .module.filtered #changelist-filter li.selected a:visited, .admin-interface .module.filtered #changelist-filter li.selected a:focus, .admin-interface .module.filtered #changelist-filter li.selected a:hover { - /* color: #666; */ color: var(--admin-interface-generic-link-hover-color); } diff --git a/admin_interface/static/admin_interface/css/list-filter-dropdown.css b/admin_interface/static/admin_interface/css/list-filter-dropdown.css index 2d20a7d..818142c 100644 --- a/admin_interface/static/admin_interface/css/list-filter-dropdown.css +++ b/admin_interface/static/admin_interface/css/list-filter-dropdown.css @@ -15,4 +15,8 @@ list-filter-dropdown background-color: #FFFFFF; width: calc(100% - 30px); margin-right: 15px; -} \ No newline at end of file +} + +.admin-interface.list-filter-highlight .list-filter-dropdown h3.active + div select { + font-weight: bold; +} diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index c676834..d360f7a 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -142,6 +142,7 @@ flat-theme admin-interface {% if theme.foldable_apps %} foldable-apps {% endif %} {% if theme.form_submit_sticky %} sticky-submit {% endif %} {% if theme.form_pagination_sticky %} sticky-pagination {% endif %} +{% if theme.list_filter_highlight %} list-filter-highlight {% endif %} {% if theme.list_filter_sticky %} list-filter-sticky {% endif %} {% endblock %} diff --git a/admin_interface/templates/admin/filter.html b/admin_interface/templates/admin/filter.html index 1b8e5b4..1ec7a39 100644 --- a/admin_interface/templates/admin/filter.html +++ b/admin_interface/templates/admin/filter.html @@ -8,10 +8,10 @@ {% else %} - {# Use the default list filter template -> https://github.com/django/django/blob/master/django/contrib/admin/templates/admin/filter.html #} + {# Use a changed default list filter template -> https://github.com/django/django/blob/master/django/contrib/admin/templates/admin/filter.html #} -

{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}

-
    +

    {% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}

    + {% endif %} - diff --git a/admin_interface/templates/admin_interface/dropdown_filter.html b/admin_interface/templates/admin_interface/dropdown_filter.html index 2ec6ce4..6a37d5c 100644 --- a/admin_interface/templates/admin_interface/dropdown_filter.html +++ b/admin_interface/templates/admin_interface/dropdown_filter.html @@ -1,7 +1,7 @@ {% load i18n %}
    -

    {% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}

    +

    {% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}

    - - {% endfor %} -
    - {% csrf_token %} - +
    diff --git a/admin_interface/templatetags/admin_interface_tags.py b/admin_interface/templatetags/admin_interface_tags.py index 1eceb36..b6f0b83 100644 --- a/admin_interface/templatetags/admin_interface_tags.py +++ b/admin_interface/templatetags/admin_interface_tags.py @@ -1,6 +1,7 @@ import datetime import hashlib import re +import warnings from django import template from django.conf import settings @@ -16,45 +17,43 @@ from admin_interface.models import Theme register = template.Library() -@register.simple_tag(takes_context=True) -def get_admin_interface_languages(context): +@register.inclusion_tag("admin_interface/language_chooser.html", takes_context=True) +def admin_interface_language_chooser(context): if not settings.USE_I18N: # i18n disabled return None if len(settings.LANGUAGES) < 2: # less than 2 languages return None + if "django.middleware.locale.LocaleMiddleware" not in settings.MIDDLEWARE: + warnings.warn( + "Language chooser requires 'django.middleware.locale.LocaleMiddleware' " + "in your MIDDLEWARE to work.", + stacklevel=1, + ) + return None try: - set_language_url = reverse("set_language") + context["set_language_url"] = reverse("set_language") except NoReverseMatch: - # ImproperlyConfigured - must include i18n urls: - # urlpatterns += [url(r'^i18n/', include('django.conf.urls.i18n')),] + warnings.warn( + "Language chooser requires Django's `set_language` view: " + "`urlpatterns += [url(r'^i18n/', include('django.conf.urls.i18n'))]`.", + stacklevel=1, + ) return None request = context.get("request", None) if not request: return None + context["LANGUAGES"] = settings.LANGUAGES + full_path = request.get_full_path() admin_nolang_url = re.sub(r"^\/([\w]{2})([\-\_]{1}[\w]{2,4})?\/", "/", full_path) - if admin_nolang_url == full_path: - # ImproperlyConfigured - must include admin urls using i18n_patterns: - # from django.conf.urls.i18n import i18n_patterns - # urlpatterns += i18n_patterns(url(r'^admin/', admin.site.urls)) - return None - langs_data = [] + default_lang_code = settings.LANGUAGE_CODE current_lang_code = translation.get_language() or default_lang_code - for language in settings.LANGUAGES: - lang_code = language[0].lower() - lang_name = language[1].title() - lang_data = { - "code": lang_code, - "name": lang_name, - "default": lang_code == default_lang_code, - "active": lang_code == current_lang_code, - "activation_url": f"{set_language_url}?next=/{lang_code}{admin_nolang_url}", - } - langs_data.append(lang_data) - return langs_data + context["LANGUAGE_CODE"] = current_lang_code + context["next"] = admin_nolang_url + return context @register.simple_tag() diff --git a/tests/settings.py b/tests/settings.py index 14b3c7b..812a821 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -26,6 +26,7 @@ MIDDLEWARE = [ "django.contrib.messages.middleware.MessageMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", + "django.middleware.locale.LocaleMiddleware", ] TEMPLATES = [ diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index 8de4b88..991d7d6 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -22,118 +22,70 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): def __render_template(self, string, context=None): return Template(string).render(Context(context or {})) - def test_get_admin_interface_languages(self): + def test_admin_interface_language_chooser(self): context = Context({"request": self.request_factory.get("/en/admin/")}) - languages = templatetags.get_admin_interface_languages(context) + context = templatetags.admin_interface_language_chooser(context) + languages = context["LANGUAGES"] expected_languages = [ - { - "code": "de", - "name": "Deutsch", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/de/admin/", - }, - { - "code": "en", - "name": "English", - "default": True, - "active": True, - "activation_url": "/i18n/setlang/?next=/en/admin/", - }, - { - "code": "es", - "name": "Español", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/es/admin/", - }, - { - "code": "fa", - "name": "Farsi", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/fa/admin/", - }, - { - "code": "fr", - "name": "Français", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/fr/admin/", - }, - { - "code": "it", - "name": "Italiano", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/it/admin/", - }, - { - "code": "pl", - "name": "Polski", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/pl/admin/", - }, - { - "code": "pt-BR", - "name": "Português", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/pt-br/admin/", - }, - { - "code": "ru", - "name": "Русский", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/ru/admin/", - }, - { - "code": "tr", - "name": "Türk", - "default": False, - "active": False, - "activation_url": "/i18n/setlang/?next=/tr/admin/", - }, + ("de", "Deutsch"), + ("en", "English"), + ("es", "Español"), + ("fa", "Farsi"), + ("fr", "Français"), + ("it", "Italiano"), + ("pl", "Polski"), + ("pt-BR", "Português"), + ("ru", "Русский"), + ("tr", "Türk"), ] self.assertEqual(len(languages), len(expected_languages)) self.assertEqual(languages[0], expected_languages[0]) self.assertEqual(languages[1], expected_languages[1]) + self.assertEqual(context["next"], "/admin/") @override_settings( USE_I18N=False, ) - def test_get_admin_interface_languages_with_i18n_disabled(self): + def test_admin_interface_language_chooser_with_i18n_disabled(self): context = Context({"request": self.request_factory.get("/en/admin/")}) - languages = templatetags.get_admin_interface_languages(context) - self.assertEqual(languages, None) + tag_context = templatetags.admin_interface_language_chooser(context) + self.assertEqual(tag_context, None) @override_settings( ROOT_URLCONF="tests.urls_without_i18n_patterns", ) - def test_get_admin_interface_languages_without_i18n_url_patterns(self): + def test_admin_interface_language_chooser_without_i18n_url_patterns(self): context = Context({"request": self.request_factory.get("/en/admin/")}) - languages = templatetags.get_admin_interface_languages(context) - self.assertEqual(languages, None) + with self.assertWarnsMessage(UserWarning, "django.conf.urls.i18n"): + tag_context = templatetags.admin_interface_language_chooser(context) + self.assertEqual(tag_context, None) + + @override_settings( + MIDDLEWARE=[], + ) + def test_admin_interface_language_chooser_without_locale_middleware(self): + context = Context({"request": self.request_factory.get("/en/admin/")}) + with self.assertWarnsMessage(UserWarning, "LocaleMiddleware"): + tag_context = templatetags.admin_interface_language_chooser(context) + self.assertEqual(tag_context, None) @override_settings( LANGUAGES=(("en", "English"),), ) - def test_get_admin_interface_languages_without_multiple_languages(self): + def test_admin_interface_language_chooser_without_multiple_languages(self): context = Context({"request": self.request_factory.get("/en/admin/")}) - languages = templatetags.get_admin_interface_languages(context) - self.assertEqual(languages, None) + tag_context = templatetags.admin_interface_language_chooser(context) + self.assertEqual(tag_context, None) - def test_get_admin_interface_languages_without_request(self): + def test_admin_interface_language_chooser_without_request(self): context = Context({}) - languages = templatetags.get_admin_interface_languages(context) - self.assertEqual(languages, None) + tag_context = templatetags.admin_interface_language_chooser(context) + self.assertEqual(tag_context, None) - def test_get_admin_interface_languages_without_language_prefix_in_url(self): + def test_admin_interface_language_chooser_without_language_prefix_in_url(self): context = Context({"request": self.request_factory.get("/admin/")}) - languages = templatetags.get_admin_interface_languages(context) - self.assertEqual(languages, None) + tag_context = templatetags.admin_interface_language_chooser(context) + self.assertEqual(tag_context["next"], "/admin/") def test_get_theme(self): Theme.objects.all().delete() From a52f670c857b612ee35af0dc82ca3acc6d14a2ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 12:19:18 +0100 Subject: [PATCH 258/326] Update pre-commit hooks. (#335) Co-authored-by: fabiocaccamo --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7a1a9d8..8530c66 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: args: ["--target-version", "3.0"] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.3 + rev: v0.1.6 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] @@ -27,7 +27,7 @@ repos: args: ["--profile", "black"] - repo: https://github.com/psf/black - rev: 23.10.1 + rev: 23.11.0 hooks: - id: black From e1d79b9df0383f3a5da6cd68adfcde2591e36ee2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 12:19:35 +0100 Subject: [PATCH 259/326] [pre-commit.ci] pre-commit autoupdate (#332) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.1.3 → v0.1.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.3...v0.1.6) - [github.com/psf/black: 23.10.1 → 23.11.0](https://github.com/psf/black/compare/23.10.1...23.11.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> From f32203fd9ab55c2539f7bde261d730c311a76ff5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 12:19:51 +0100 Subject: [PATCH 260/326] Update pre-commit requirement from ==3.4.* to ==3.5.* (#331) Updates the requirements on [pre-commit](https://github.com/pre-commit/pre-commit) to permit the latest version. - [Release notes](https://github.com/pre-commit/pre-commit/releases) - [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/pre-commit/pre-commit/compare/v3.4.0...v3.5.0) --- updated-dependencies: - dependency-name: pre-commit dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-test.txt b/requirements-test.txt index 80cba38..d24aef7 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,4 +1,4 @@ coverage == 7.3.* -pre-commit == 3.4.* +pre-commit == 3.5.* psycopg2-binary == 2.9.* tox == 4.11.* From 6462083e95bacb0c3b2743f88f84aae5e6ad9f30 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 5 Dec 2023 21:50:19 +0100 Subject: [PATCH 261/326] Add `Django 5.0` to tests. --- .github/workflows/test-package.yml | 6 +++--- pyproject.toml | 1 + tox.ini | 7 ++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml index 75960d3..06012af 100644 --- a/.github/workflows/test-package.yml +++ b/.github/workflows/test-package.yml @@ -21,9 +21,9 @@ jobs: matrix: | python-version {3.8}, django-version {3.0, 3.1, 3.2, 4.0, 4.1, 4.2}, database {sqlite, postgres} python-version {3.9}, django-version {3.0, 3.1, 3.2, 4.0, 4.1, 4.2}, database {sqlite, postgres} - python-version {3.10}, django-version {3.2, 4.0, 4.1, 4.2}, database {sqlite, postgres} - python-version {3.11}, django-version {4.1, 4.2}, database {sqlite, postgres} - python-version {3.12}, django-version {4.2}, database {sqlite, postgres} + python-version {3.10}, django-version {3.2, 4.0, 4.1, 4.2, 5.0}, database {sqlite, postgres} + python-version {3.11}, django-version {4.1, 4.2, 5.0}, database {sqlite, postgres} + python-version {3.12}, django-version {4.2, 5.0}, database {sqlite, postgres} outputs: matrix: ${{ steps.create_matrix.outputs.matrix }} diff --git a/pyproject.toml b/pyproject.toml index 21aa54d..71ce74c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ classifiers = [ "Framework :: Django :: 4.0", "Framework :: Django :: 4.1", "Framework :: Django :: 4.2", + "Framework :: Django :: 5.0", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", diff --git a/tox.ini b/tox.ini index c8109da..a9c656f 100644 --- a/tox.ini +++ b/tox.ini @@ -2,9 +2,9 @@ envlist = py38-{dj30,dj31,dj32,dj40,dj41,dj42}-{sqlite,postgres}, py39-{dj30,dj31,dj32,dj40,dj41,dj42}-{sqlite,postgres}, - py310-{dj32,dj40,dj41,dj42}-{sqlite,postgres}, - py311-{dj41,dj42}-{sqlite,postgres}, - py312-{dj42}-{sqlite,postgres}, + py310-{dj32,dj40,dj41,dj42,dj50}-{sqlite,postgres}, + py311-{dj41,dj42,dj50}-{sqlite,postgres}, + py312-{dj42,dj50}-{sqlite,postgres}, [gh-actions] python = @@ -29,6 +29,7 @@ deps = dj40: Django == 4.0.* dj41: Django == 4.1.* dj42: Django == 4.2.* + dj50: Django == 5.0.* -r requirements.txt -r requirements-test.txt From 67bb404a84ee7334dd0fbf4f98279d9f47d94669 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 5 Dec 2023 22:05:58 +0100 Subject: [PATCH 262/326] Update pyproject.toml --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 71ce74c..3e59462 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,6 @@ dependencies = [ "python-slugify >= 7.0.0, < 9.0.0", ] dynamic = ["version"] -license = "MIT" maintainers = [ { name = "Fabio Caccamo", email = "fabio.caccamo@gmail.com" }, ] From f9df5baa191a3cce17f251f2a4635a6b75775bad Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 5 Dec 2023 22:06:01 +0100 Subject: [PATCH 263/326] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c480914..fda7f8f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ [![](https://img.shields.io/codecov/c/gh/fabiocaccamo/django-admin-interface?logo=codecov)](https://codecov.io/gh/fabiocaccamo/django-admin-interface) [![](https://img.shields.io/codacy/grade/21cb657283c04e70b56fb935277a1ad1?logo=codacy)](https://www.codacy.com/app/fabiocaccamo/django-admin-interface) [![](https://img.shields.io/codeclimate/maintainability/fabiocaccamo/django-admin-interface?logo=code-climate)](https://codeclimate.com/github/fabiocaccamo/django-admin-interface/) -[![](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![](https://img.shields.io/badge/code%20style-black-000000.svg?logo=python&logoColor=black)](https://github.com/psf/black) +[![](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) # django-admin-interface django-admin-interface is a modern **responsive flat admin interface customizable by the admin itself**. From 66600faec6d83c4589b5fa1a7bea4936f364d5e2 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 5 Dec 2023 23:25:11 +0100 Subject: [PATCH 264/326] Fix tests. --- tests/test_templatetags.py | 43 +++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index 991d7d6..ac622fc 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -159,21 +159,26 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): self.assertEqual(date_field, "last_login") - def _add_changelist_methods(self, mock, params): - def get_query_string(**kwargs): - return ChangeList.get_query_string(mock, **kwargs) + def _get_changelist_mock(self, params=None): + class ChangelistMock(Mock): + def __init__(self, params=None, *args, **kwargs): + super().__init__(*args, **kwargs) + # django < 5.0 + self.params = params or {} + # django >= 5.0 + self.filter_params = params or {} - def get_filters_params(**kwargs): - return ChangeList.get_filters_params(mock, **kwargs) + def get_query_string(self, **kwargs): + return ChangeList.get_query_string(self, **kwargs) - mock.get_query_string = get_query_string - mock.get_filters_params = get_filters_params - mock.params = params + def get_filters_params(self, **kwargs): + return ChangeList.get_filters_params(self, **kwargs) + + return ChangelistMock(params=params) def test_filter_removal_link(self): - changelist = Mock() params = {"shape": "pointy", "size": "small"} - self._add_changelist_methods(changelist, params) + changelist = self._get_changelist_mock(params) list_filter = Mock() list_filter.title = "Shape filter" choices = [{"display": "Round"}, {"display": "Pointy", "selected": True}] @@ -187,9 +192,8 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): self.assertEqual(ctx["selected_value"], "Pointy") def test_filter_removal_link_no_display(self): - changelist = Mock() params = {"shape": "pointy", "size": "small"} - self._add_changelist_methods(changelist, params) + changelist = self._get_changelist_mock(params) list_filter = Mock() list_filter.title = "Shape filter" choices = [{"other": "Round"}, {"other": "Pointy", "selected": True}] @@ -203,9 +207,8 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): self.assertEqual(ctx["selected_value"], "...") def test_date_hierarchy_removal_link_year(self): - changelist = Mock() params = {"shape": "pointy", "last_login__year": 2022} - self._add_changelist_methods(changelist, params) + changelist = self._get_changelist_mock(params) changelist.model._meta.get_field.return_value.verbose_name = "last login" ctx = templatetags.admin_interface_date_hierarchy_removal_link( @@ -217,11 +220,9 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): self.assertEqual(ctx["date_value"], date(2022, 1, 1)) def test_date_hierarchy_removal_link_year_month(self): - changelist = Mock() - changelist.model._meta.get_field.return_value.verbose_name = "last login" params = {"last_login__year": 2022, "last_login__month": "11"} - self._add_changelist_methods(changelist, params) - + changelist = self._get_changelist_mock(params) + changelist.model._meta.get_field.return_value.verbose_name = "last login" ctx = templatetags.admin_interface_date_hierarchy_removal_link( changelist, "last_login" ) @@ -231,8 +232,6 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): self.assertEqual(ctx["date_value"], date(2022, 11, 1)) def test_date_hierarchy_removal_link_year_month_day(self): - changelist = Mock() - changelist.model._meta.get_field.return_value.verbose_name = "last login" params = { "last_login__year": 2022, "last_login__month": "11", @@ -240,8 +239,8 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): "shape": "round", "size": "small", } - self._add_changelist_methods(changelist, params) - + changelist = self._get_changelist_mock(params) + changelist.model._meta.get_field.return_value.verbose_name = "last login" ctx = templatetags.admin_interface_date_hierarchy_removal_link( changelist, "last_login" ) From 1131e0da6becd0156d2d1b6611dfbfe46f6b4d8b Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 5 Dec 2023 23:26:58 +0100 Subject: [PATCH 265/326] Rename variable. --- tests/test_templatetags.py | 46 +++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index ac622fc..28c6da8 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -185,11 +185,13 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): list_filter.choices.return_value = choices list_filter.expected_parameters.return_value = ("shape",) - ctx = templatetags.admin_interface_filter_removal_link(changelist, list_filter) + context = templatetags.admin_interface_filter_removal_link( + changelist, list_filter + ) - self.assertEqual(ctx["removal_link"], "?size=small") - self.assertEqual(ctx["title"], "Shape filter") - self.assertEqual(ctx["selected_value"], "Pointy") + self.assertEqual(context["removal_link"], "?size=small") + self.assertEqual(context["title"], "Shape filter") + self.assertEqual(context["selected_value"], "Pointy") def test_filter_removal_link_no_display(self): params = {"shape": "pointy", "size": "small"} @@ -200,36 +202,39 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): list_filter.choices.return_value = choices list_filter.expected_parameters.return_value = ("shape",) - ctx = templatetags.admin_interface_filter_removal_link(changelist, list_filter) + context = templatetags.admin_interface_filter_removal_link( + changelist, list_filter + ) - self.assertEqual(ctx["removal_link"], "?size=small") - self.assertEqual(ctx["title"], "Shape filter") - self.assertEqual(ctx["selected_value"], "...") + self.assertEqual(context["removal_link"], "?size=small") + self.assertEqual(context["title"], "Shape filter") + self.assertEqual(context["selected_value"], "...") def test_date_hierarchy_removal_link_year(self): params = {"shape": "pointy", "last_login__year": 2022} changelist = self._get_changelist_mock(params) changelist.model._meta.get_field.return_value.verbose_name = "last login" - ctx = templatetags.admin_interface_date_hierarchy_removal_link( + context = templatetags.admin_interface_date_hierarchy_removal_link( changelist, "last_login" ) - self.assertEqual(ctx["removal_link"], "?shape=pointy") - self.assertEqual(ctx["date_label"], "last login") - self.assertEqual(ctx["date_value"], date(2022, 1, 1)) + self.assertEqual(context["removal_link"], "?shape=pointy") + self.assertEqual(context["date_label"], "last login") + self.assertEqual(context["date_value"], date(2022, 1, 1)) def test_date_hierarchy_removal_link_year_month(self): params = {"last_login__year": 2022, "last_login__month": "11"} changelist = self._get_changelist_mock(params) changelist.model._meta.get_field.return_value.verbose_name = "last login" - ctx = templatetags.admin_interface_date_hierarchy_removal_link( + + context = templatetags.admin_interface_date_hierarchy_removal_link( changelist, "last_login" ) - self.assertEqual(ctx["removal_link"], "?") - self.assertEqual(ctx["date_label"], "last login") - self.assertEqual(ctx["date_value"], date(2022, 11, 1)) + self.assertEqual(context["removal_link"], "?") + self.assertEqual(context["date_label"], "last login") + self.assertEqual(context["date_value"], date(2022, 11, 1)) def test_date_hierarchy_removal_link_year_month_day(self): params = { @@ -241,10 +246,11 @@ class AdminInterfaceTemplateTagsTestCase(TestCase): } changelist = self._get_changelist_mock(params) changelist.model._meta.get_field.return_value.verbose_name = "last login" - ctx = templatetags.admin_interface_date_hierarchy_removal_link( + + context = templatetags.admin_interface_date_hierarchy_removal_link( changelist, "last_login" ) - self.assertEqual(ctx["removal_link"], "?shape=round&size=small") - self.assertEqual(ctx["date_label"], "last login") - self.assertEqual(ctx["date_value"], date(2022, 11, 30)) + self.assertEqual(context["removal_link"], "?shape=round&size=small") + self.assertEqual(context["date_label"], "last login") + self.assertEqual(context["date_value"], date(2022, 11, 30)) From 13965eacf2492be6ee7e75f52056937bbd937f25 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 5 Dec 2023 23:35:47 +0100 Subject: [PATCH 266/326] Update CHANGELOG and version. --- CHANGELOG.md | 12 ++++++++++++ admin_interface/metadata.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f73436..e8ab75f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.27.0](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.27.0) - 2023-12-05 +- Add `Python 3.12` support. +- Add `Django 5.0` support. +- Fix broken language-chooser with `i18n_patterns(..., prefix_default_language=False)`. #327 (by [@julianwachholz](https://github.com/julianwachholz) in #328) +- Simplify language-chooser. #327 (by [@julianwachholz](https://github.com/julianwachholz) in #328) +- Speed-up test workflow. +- Bump requirements. +- Bump `pre-commit` hooks. + +### Contributors +- [@julianwachholz](https://github.com/julianwachholz) + ## [0.26.1](https://github.com/fabiocaccamo/django-admin-interface/releases/tag/0.26.1) - 2023-09-05 - Fix logout and theme buttons style. #246 - Add Russian translation. (by [@rustzzdevel](https://github.com/rustzzdevel) in #295) diff --git a/admin_interface/metadata.py b/admin_interface/metadata.py index 39cb9c7..fa5605e 100644 --- a/admin_interface/metadata.py +++ b/admin_interface/metadata.py @@ -7,4 +7,4 @@ __description__ = ( __email__ = "fabio.caccamo@gmail.com" __license__ = "MIT" __title__ = "django-admin-interface" -__version__ = "0.26.1" +__version__ = "0.27.0" From fb18a8d455ed173ad948ab07cde52ceca8b65c91 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Mon, 11 Dec 2023 23:51:06 +0100 Subject: [PATCH 267/326] Replace `Black` and `isort` with `Ruff-format`. --- .pre-commit-config.yaml | 14 ++------------ pyproject.toml | 3 --- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8530c66..191e1c4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,21 +15,11 @@ repos: args: ["--target-version", "3.0"] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.6 + rev: v0.1.7 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - - - repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort - args: ["--profile", "black"] - - - repo: https://github.com/psf/black - rev: 23.11.0 - hooks: - - id: black + - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 diff --git a/pyproject.toml b/pyproject.toml index 3e59462..1126454 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,9 +84,6 @@ exclude = ''' )/ ''' -[tool.isort] -profile = "black" - [tool.ruff] ignore = [] line-length = 88 From 3000c9024e535ac1ebf69ee944aa321adfbcf354 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 12 Dec 2023 00:04:55 +0100 Subject: [PATCH 268/326] Update test-package.yml --- .github/workflows/test-package.yml | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml index 06012af..0dd2128 100644 --- a/.github/workflows/test-package.yml +++ b/.github/workflows/test-package.yml @@ -89,20 +89,7 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - # cache: 'pip' - - - name: Cache virtualenv - uses: actions/cache@v3 - with: - key: venv-${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements-test.txt') }} - path: ./venv - - - name: Create virtualenv - run: | - python -m venv ./venv - source ./venv/bin/activate - echo "$VIRTUAL_ENV/bin" >> $GITHUB_PATH - echo "VIRTUAL_ENV=$VIRTUAL_ENV" >> $GITHUB_ENV + cache: 'pip' - name: Upgrade pip version run: | From a7e8c4da09544074cc38f92622035cfed2a52d0f Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Mon, 18 Dec 2023 19:01:51 +0100 Subject: [PATCH 269/326] Update `create-release.yml` workflow: publish releases with a Trusted Publisher. --- .github/workflows/create-release.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 74e9ff9..fd6a210 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -8,6 +8,9 @@ on: jobs: build: runs-on: ubuntu-latest + # environment: release + permissions: + id-token: write steps: - name: Checkout @@ -38,5 +41,5 @@ jobs: - name: Publish on PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: - packages_dir: dist/ - password: ${{ secrets.WORKFLOWS_PUBLISH_TO_PYPI_TOKEN }} + packages-dir: dist/ + # password: ${{ secrets.WORKFLOWS_PUBLISH_TO_PYPI_TOKEN }} From 6db363518d9766133633c0e87157c216a5d95141 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Tue, 19 Dec 2023 18:20:27 +0100 Subject: [PATCH 270/326] [css] Fix paginator appearance. --- .../static/admin_interface/css/admin-interface-fix.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/admin_interface/static/admin_interface/css/admin-interface-fix.css b/admin_interface/static/admin_interface/css/admin-interface-fix.css index e4cb7ea..8185934 100644 --- a/admin_interface/static/admin_interface/css/admin-interface-fix.css +++ b/admin_interface/static/admin_interface/css/admin-interface-fix.css @@ -140,7 +140,9 @@ .admin-interface #changelist .paginator { margin-top:-1px; /* merge 2 borders into 1 */ - line-height:42px; + line-height: 1.5em; + padding-top: 15px; + padding-bottom: 15px; } .admin-interface .paginator a, From 75b1292e2988e2cfa7befe29fef3cc3b09f0988c Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 21 Dec 2023 10:50:54 +0100 Subject: [PATCH 271/326] Move third-party compatibility CSS files to a `third-party` folder. --- .../css/third-party/ckeditor.css | 126 +++++++++++ .../css/third-party/import-export.css | 7 + .../css/third-party/json-widget.css | 27 +++ .../css/third-party/modeltranslation.css | 17 ++ .../css/third-party/rangefilter.css | 25 +++ .../css/third-party/sorl-thumbnail.css | 67 ++++++ .../css/third-party/streamfield.css | 200 ++++++++++++++++++ .../css/third-party/tabbed-admin.css | 37 ++++ .../css/third-party/tinymce.css | 3 + .../templates/admin/base_site.html | 25 +-- 10 files changed, 520 insertions(+), 14 deletions(-) create mode 100644 admin_interface/static/admin_interface/css/third-party/ckeditor.css create mode 100644 admin_interface/static/admin_interface/css/third-party/import-export.css create mode 100644 admin_interface/static/admin_interface/css/third-party/json-widget.css create mode 100644 admin_interface/static/admin_interface/css/third-party/modeltranslation.css create mode 100644 admin_interface/static/admin_interface/css/third-party/rangefilter.css create mode 100644 admin_interface/static/admin_interface/css/third-party/sorl-thumbnail.css create mode 100644 admin_interface/static/admin_interface/css/third-party/streamfield.css create mode 100644 admin_interface/static/admin_interface/css/third-party/tabbed-admin.css create mode 100644 admin_interface/static/admin_interface/css/third-party/tinymce.css diff --git a/admin_interface/static/admin_interface/css/third-party/ckeditor.css b/admin_interface/static/admin_interface/css/third-party/ckeditor.css new file mode 100644 index 0000000..952120c --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/ckeditor.css @@ -0,0 +1,126 @@ +/* +ckeditor + light theme +https://github.com/Ikimea/ckeditor-light-theme +*/ + +.admin-interface .cke { + border: none; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.admin-interface .cke_inner, +.admin-interface .cke_wysiwyg_frame { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +.admin-interface .cke_inner { + border: 1px solid #CCCCCC; +} + +.admin-interface .cke_chrome { + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.admin-interface .cke_top { + background: #f8f8f8; + border-top: none; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #EEEEEE; + padding-left: 10px; + padding-right: 10px; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.admin-interface .cke_toolgroup { + background: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.admin-interface .cke_bottom { + background: #f8f8f8; + border-top: 1px solid #EEEEEE; + + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.admin-interface .cke_source { + padding: 13px 15px; + box-sizing: border-box; +} + +.admin-interface a.cke_button, +.admin-interface a.cke_button:active, +.admin-interface a.cke_button:hover, +.admin-interface a.cke_button:focus { + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + background-image: none; + border-radius: 4px; + border: none; +} + +.admin-interface a.cke_button:active, +.admin-interface a.cke_button:hover, +.admin-interface a.cke_button:focus { + background-color: #E8E8E8 !important; +} + +.admin-interface a.cke_button.cke_button_on { + background-color: #CCCCCC !important; +} + +.admin-interface a.cke_button.cke_button_disabled { + background-color: transparent !important; +} + +.admin-interface .cke_resizer { + border-color: transparent #666666 transparent transparent; +} + +@media (max-width: 767px){ + + .admin-interface .django-ckeditor-widget, + .admin-interface .cke { + width: 100% !important; + } + + .admin-interface .cke_top { + padding-left: 10px; + padding-right: 10px; + } + + .admin-interface .cke_toolbar { + height: auto; + } + + .admin-interface .cke_contents { + height: auto; + } + + .admin-interface .tabular .django-ckeditor-widget, + .admin-interface .tabular .cke { + width: 400px !important; + } + + .admin-interface .tabular .cke_contents { + height: 90px !important; + } +} diff --git a/admin_interface/static/admin_interface/css/third-party/import-export.css b/admin_interface/static/admin_interface/css/third-party/import-export.css new file mode 100644 index 0000000..8ea0a09 --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/import-export.css @@ -0,0 +1,7 @@ +/* Fix left/right scrolling broken with django-import-export #165 */ +.admin-interface table.import-preview { + display: block; + width: 100%; + max-width: 100%; + overflow: auto; +} diff --git a/admin_interface/static/admin_interface/css/third-party/json-widget.css b/admin_interface/static/admin_interface/css/third-party/json-widget.css new file mode 100644 index 0000000..e0a999d --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/json-widget.css @@ -0,0 +1,27 @@ +/* +django-json-widget support +https://github.com/jmrivas86/django-json-widget +*/ + +.admin-interface div.jsoneditor { + border: 1px solid var(--admin-interface-module-background-color); + border-radius: var(--admin-interface-jsoneditor-border-radius); + overflow: var(--admin-interface-jsoneditor-overflow); +} + +.admin-interface div.jsoneditor-menu { + background-color: var(--admin-interface-module-background-color); + border-bottom: 1px solid var(--admin-interface-module-background-color); +} + +.admin-interface div.jsoneditor-menu a.jsoneditor-poweredBy { + color: var(--admin-interface-module-link-color); +} + +.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected, +.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected:focus, +.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected:hover { + background-color: var(--admin-interface-module-background-selected-color); + color: #000000; + font-weight: bold; +} diff --git a/admin_interface/static/admin_interface/css/third-party/modeltranslation.css b/admin_interface/static/admin_interface/css/third-party/modeltranslation.css new file mode 100644 index 0000000..9e1890b --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/modeltranslation.css @@ -0,0 +1,17 @@ +/* +django-modeltranslation support +https://github.com/deschler/django-modeltranslation +*/ + +.admin-interface #content h1 select { + text-transform: uppercase; + margin-left: 15px; + min-width: 50px; +} + +.admin-interface .ui-tabs .ui-tabs-panel[id^=tab_id_] { + border: none; + border-top: 1px solid #eeeeee; + padding: 0; + margin-bottom: 0; +} diff --git a/admin_interface/static/admin_interface/css/third-party/rangefilter.css b/admin_interface/static/admin_interface/css/third-party/rangefilter.css new file mode 100644 index 0000000..25b4f0b --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/rangefilter.css @@ -0,0 +1,25 @@ +.admin-interface #changelist-filter .admindatefilter { + border-bottom: 1px solid var(--hairline-color); +} + +.admin-interface #changelist-filter .admindatefilter .button, +.admin-interface #changelist-filter .admindatefilter .submit-row input, +.admin-interface #changelist-filter .admindatefilter a.button, +.admin-interface #changelist-filter .admindatefilter input[type="submit"], +.admin-interface #changelist-filter .admindatefilter input[type="button"], +.admin-interface #changelist-filter .admindatefilter input[type="reset"] { + background: var(--admin-interface-module-background-color); + color: var(--admin-interface-module-link-color); + padding: 6px 10px; + font-size: 12px; + margin-right: 4px; +} + +.admin-interface #changelist-filter .admindatefilter .button:hover, +.admin-interface #changelist-filter .admindatefilter .submit-row input:hover, +.admin-interface #changelist-filter .admindatefilter a.button:hover, +.admin-interface #changelist-filter .admindatefilter input[type="submit"]:hover, +.admin-interface #changelist-filter .admindatefilter input[type="button"]:hover, +.admin-interface #changelist-filter .admindatefilter input[type="reset"]:hover { + color: var(--admin-interface-module-link-hover-color); +} diff --git a/admin_interface/static/admin_interface/css/third-party/sorl-thumbnail.css b/admin_interface/static/admin_interface/css/third-party/sorl-thumbnail.css new file mode 100644 index 0000000..44c6190 --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/sorl-thumbnail.css @@ -0,0 +1,67 @@ +/* +sorl-thumbnail - improved AdminImageMixin widget layout +https://github.com/mariocesar/sorl-thumbnail +*/ + +.admin-interface a.thumbnail + a { + font-weight: normal; +} + +.admin-interface a.thumbnail + a + input[type="checkbox"] { + margin: 10px 0px 10px 18px; +} + +@media (max-width: 767px){ + .admin-interface a.thumbnail + a { + display: block; + margin-top: 3px; + white-space: pre-wrap; + word-break: break-word; + } + .admin-interface a.thumbnail + a + input[type="checkbox"] { + margin: 15px 0; + } +} + +.admin-interface a.thumbnail ~ label { + color: #333; + font-size: 11px; + display: inline; + float: none; + margin-left: 2px; +} + +.admin-interface.change-form div[style="float:left"] { + font-size: 11px; + font-weight: bold; + color: #666; + margin-bottom: 5px; +} + +@media (max-width: 767px){ + .admin-interface.change-form div[style="float:left"] { + font-size: 12px; + width: 100%; + } +} + +.admin-interface .aligned .form-row a.thumbnail ~ input[type="file"] { + margin-top: 0px; +} + +@media (max-width:767px){ + .admin-interface .aligned .form-row a.thumbnail ~ input[type="file"] { + width: auto; + padding: 0px; + display: block; + margin-top: 3px; + } + + .admin-interface div[style="float:left"] { + margin-bottom: 0px; + } + + .admin-interface div[style="float:left"] + div.help { + margin-top: 0px !important; + } +} diff --git a/admin_interface/static/admin_interface/css/third-party/streamfield.css b/admin_interface/static/admin_interface/css/third-party/streamfield.css new file mode 100644 index 0000000..71ce2db --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/streamfield.css @@ -0,0 +1,200 @@ +/* +django-streamfield support +https://github.com/raagin/django-streamfield/ +*/ + +.admin-interface .form-row.field-stream { + margin: 0; + padding: 0; + border-bottom: none; +} + +.admin-interface .form-row.field-stream label[for=id_stream] { + display: none; +} + +.admin-interface .streamfield_app { + clear: both; + width: 100%; +} + +.admin-interface .streamfield_app .stream-help-text { + margin-bottom: 15px; + display: flex; + flex-direction: column; + clear: both; +} + +.admin-interface .streamfield_app .stream-help-text .stream-help-text__title { + align-self: flex-end; + user-select: none; + padding: 8px; + padding-right: 0; + color: var(--admin-interface-generic-link-color); +} + +.admin-interface .streamfield_app .stream-help-text .stream-help-text__title:hover { + color: var(--admin-interface-generic-link-hover-color); +} + +.admin-interface .streamfield_app .stream-help-text .stream-help-text__content { + background: var(--admin-interface-module-background-selected-color); + border-radius: var(--admin-interface-module-border-radius); + border: 1px solid rgba(0,0,0,0.1); + padding: 15px; +} + +.admin-interface .streamfield_app .stream-help-text .stream-help-text__content > ul { + margin: 0; + padding: 0; +} + +.admin-interface .streamfield_app .collapse-handler { + user-select: none; + padding: 8px; + padding-right: 0; + margin: 0 0 5px 0; + color: var(--admin-interface-generic-link-color); + text-decoration: none; +} + +.admin-interface .streamfield_app .collapse-handler:hover { + color: var(--admin-interface-generic-link-hover-color); + text-decoration: none; +} + +.admin-interface .streamfield_app .stream-model-block { + position: relative; + box-shadow: none; + border: 1px solid rgba(0,0,0,0.1); + border-radius: var(--admin-interface-module-border-radius); + overflow: hidden; +} + +.admin-interface .streamfield_app .stream-model-block, +.admin-interface .streamfield_app .streamfield-models.collapsed .stream-model-block { + margin-bottom: 10px; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin: 0; + padding: 10px 10px 10px 20px; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title span { + font-size: 18px; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle { + position: static; + right: 0; + top: 0; + color: var(--admin-interface-generic-link-color); +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle:hover { + color: var(--admin-interface-generic-link-hover-color); +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle { + display: flex; + justify-content: center; + align-items: center; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move, +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-delete { + display: flex; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + font-weight: normal; + background: none; + flex-shrink: 0; + color: inherit; + font-size: 16px; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move { + cursor: move; /* fallback if grab cursor is unsupported */ + cursor: grab; + cursor: -moz-grab; + cursor: -webkit-grab; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move:before { + content: "↕"; + + display: block; +} + +.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-delete:before { + content: "×"; + display: block; + font-size: 18px; +} + +.admin-interface .streamfield_app .block-fields > div { + margin-bottom: 15px; +} + +.admin-interface .streamfield_app .stream-model-block .stream-model-block__content { + background-color: #f8f8f8; + padding: 20px; +} + +.admin-interface .streamfield_app .stream-model-block .stream-model-block__content.no-subblocks.abstract-block { + display: none; +} + +.admin-interface .streamfield_app .stream-insert-new-block { + margin-bottom: 20px; +} + +.admin-interface .streamfield_app .stream-insert-new-block .add-new-block-button { + color: var(--admin-interface-generic-link-color); + text-decoration: none; +} + +.admin-interface .streamfield_app .stream-insert-new-block .add-new-block-button:hover { + color: var(--admin-interface-generic-link-hover-color); + text-decoration: none; +} + +.admin-interface .streamfield_app .stream-insert-new-block ul { + display: block; + width: 100%; + margin: 10px 0 0 0; + padding: 0; + user-select: none; +} + +.admin-interface .streamfield_app .stream-insert-new-block ul li { + display: inline-block; + font-size: 12px; + margin: 0; + padding: 0; +} + +.admin-interface .streamfield_app .stream-btn { + font-weight: normal; + text-decoration: none; + background-color: var(--admin-interface-generic-link-color); + padding: 6px 12px; + border-radius: 4px; +} + +.admin-interface .streamfield_app .stream-btn:hover { + text-decoration: none; + background-color: var(--admin-interface-generic-link-hover-color); +} + +.admin-interface .streamfield_app .stream-insert-new-block ul li .stream-btn { + margin-top: 5px; + margin-left: 5px; +} diff --git a/admin_interface/static/admin_interface/css/third-party/tabbed-admin.css b/admin_interface/static/admin_interface/css/third-party/tabbed-admin.css new file mode 100644 index 0000000..010296c --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/tabbed-admin.css @@ -0,0 +1,37 @@ +/* +django-tabbed-admin support +https://github.com/omji/django-tabbed-admin +*/ + +/* Hide tabs until ready */ +/* +.admin-interface #tabs ul { + display: none; +} + +.admin-interface #tabs ul.ui-tabs-nav { + display: block; +} +*/ + +.admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .module.aligned:last-child { + margin-bottom: 0; +} + +.admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .module.aligned:last-child .form-row:last-child { + border-bottom: none; +} + +@media (max-width: 350px){ + .admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .vTextField, + .admin-interface .inline-related .vTextField { + width: 17em; + } +} + +@media (max-width: 767px){ + /* fix horizontal overflow - responsive.css:563 */ + .admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .aligned .form-row > div:not([class]) { + width: 100% !important; + } +} diff --git a/admin_interface/static/admin_interface/css/third-party/tinymce.css b/admin_interface/static/admin_interface/css/third-party/tinymce.css new file mode 100644 index 0000000..76ed1b4 --- /dev/null +++ b/admin_interface/static/admin_interface/css/third-party/tinymce.css @@ -0,0 +1,3 @@ +.admin-interface textarea.tinymce ~ p.help { + margin-top:5px !important; +} diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index 1efe5f7..3303361 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -97,27 +97,24 @@ {% endif %} - - - - - - - + + + + + + + + + + + {% if current_lang == 'fa' %} {% endif %} From 4759fdf593c7b716a3acca45f597fbf0e4a20411 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 21 Dec 2023 10:53:26 +0100 Subject: [PATCH 272/326] Move `related-modal.css` to related-modal plugin folder. --- .../admin_interface/{css => related-modal}/related-modal.css | 0 admin_interface/templates/admin/base_site.html | 2 -- admin_interface/templates/admin_interface/related-modal.html | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) rename admin_interface/static/admin_interface/{css => related-modal}/related-modal.css (100%) diff --git a/admin_interface/static/admin_interface/css/related-modal.css b/admin_interface/static/admin_interface/related-modal/related-modal.css similarity index 100% rename from admin_interface/static/admin_interface/css/related-modal.css rename to admin_interface/static/admin_interface/related-modal/related-modal.css diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index 3303361..85c5f14 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -95,8 +95,6 @@ {% endif %} - + {% endif %} From ab5ca9626a11c9b43b683799379e65052d0adc38 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 21 Dec 2023 10:54:20 +0100 Subject: [PATCH 273/326] Remove old `flat-theme` body class. --- admin_interface/templates/admin/base_site.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index 85c5f14..2e3ebc2 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -139,7 +139,7 @@ {% block bodyclass %} {% get_admin_interface_theme as theme %} -flat-theme admin-interface +admin-interface {% if theme.name %} {{ theme.name|slugify }}-theme {% endif %} {% if theme.foldable_apps %} foldable-apps {% endif %} {% if theme.form_submit_sticky %} sticky-submit {% endif %} From b1361d2bc152cf9e64ed03cd94e6ad5ded3fe004 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 21 Dec 2023 10:59:00 +0100 Subject: [PATCH 274/326] Split `admin-interface-fix.css` CSS file into multiple files for easier debugging. --- .../css/admin-interface-fix.css | 612 ------------------ .../admin_interface/css/admin-interface.css | 4 + .../admin_interface/css/change-form.css | 9 + .../static/admin_interface/css/changelist.css | 43 ++ .../static/admin_interface/css/fieldsets.css | 14 + .../admin_interface/css/file-upload.css | 51 ++ .../static/admin_interface/css/header.css | 51 ++ .../static/admin_interface/css/inlines.css | 105 +++ .../admin_interface/css/list-filter.css | 28 + .../static/admin_interface/css/login.css | 65 ++ .../static/admin_interface/css/modules.css | 12 + .../admin_interface/css/nav-sidebar.css | 78 +++ .../admin_interface/css/object-tools.css | 10 + .../static/admin_interface/css/paginator.css | 33 + .../static/admin_interface/css/widgets.css | 102 +++ .../templates/admin/base_site.html | 41 +- 16 files changed, 626 insertions(+), 632 deletions(-) delete mode 100644 admin_interface/static/admin_interface/css/admin-interface-fix.css create mode 100644 admin_interface/static/admin_interface/css/change-form.css create mode 100644 admin_interface/static/admin_interface/css/changelist.css create mode 100644 admin_interface/static/admin_interface/css/fieldsets.css create mode 100644 admin_interface/static/admin_interface/css/file-upload.css create mode 100644 admin_interface/static/admin_interface/css/header.css create mode 100644 admin_interface/static/admin_interface/css/inlines.css create mode 100644 admin_interface/static/admin_interface/css/list-filter.css create mode 100644 admin_interface/static/admin_interface/css/login.css create mode 100644 admin_interface/static/admin_interface/css/modules.css create mode 100644 admin_interface/static/admin_interface/css/nav-sidebar.css create mode 100644 admin_interface/static/admin_interface/css/object-tools.css create mode 100644 admin_interface/static/admin_interface/css/paginator.css create mode 100644 admin_interface/static/admin_interface/css/widgets.css diff --git a/admin_interface/static/admin_interface/css/admin-interface-fix.css b/admin_interface/static/admin_interface/css/admin-interface-fix.css deleted file mode 100644 index 8185934..0000000 --- a/admin_interface/static/admin_interface/css/admin-interface-fix.css +++ /dev/null @@ -1,612 +0,0 @@ -.admin-interface { - overflow-x: hidden; -} - -/* fix login */ -.admin-interface.login #container { - width: 100%; - max-width: 360px; - margin: 15px auto; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.admin-interface.login #content { - padding: 15px 30px 30px 30px; -} - -@media (min-width:768px){ - .admin-interface.login #container { - margin: 90px auto; - } -} - -.admin-interface.login #header { - min-height: auto; - padding: 10px 30px; - line-height: 30px; - align-items: center; - justify-content: flex-start; -} - -.admin-interface.login #header #branding h1 { - margin-right:0; -} - -.admin-interface.login #header #branding h1 img.logo { - margin-right: 0; -} - -.admin-interface.login #header #branding h1 img.logo+span { - display: block; -} - -.admin-interface.login #login-form { - display: flex; - flex-direction: column; -} - -.admin-interface.login .submit-row { - float: left; - width: 100%; - margin-top: 20px; - padding-top: 0; - padding-left: 0; - text-align: right; -} - -.admin-interface.login .submit-row label { - display: none; -} - -.admin-interface.login .submit-row input[type="submit"] { - width: 100%; - text-transform: uppercase; -} - -.admin-interface.login #footer { - display: none; -} -/* end login fix*/ - -.admin-interface #header { - height: auto; - min-height: 55px; - box-sizing: border-box; - display: flex; - justify-content: space-between; - align-items: center; -} - -@media (max-width:1024px) { - .admin-interface #header { - align-items: start; - } -} - -.admin-interface #branding h1 img.logo { - margin-top:10px; - margin-bottom:10px; - margin-right:15px; - display:inline-block !important; /* override inline display:none; */ -} - -.admin-interface #branding h1 span { - display: inline-block; -} - -.admin-interface #branding h1 img.logo+span { - white-space:nowrap; -} - -.admin-interface #user-tools { - margin-top: 10px; - margin-bottom: 10px; - white-space: nowrap; - align-self: flex-start; -} - -.admin-interface #user-tools br { - display: none; -} -@media (max-width: 768px) { - .admin-interface #user-tools br { - display: block; - } -} - -.admin-interface fieldset.collapse { - border: 1px solid transparent; -} - -.admin-interface fieldset.collapse.collapsed a.collapse-toggle, -.admin-interface fieldset.collapse a.collapse-toggle, -.admin-interface .inline-group .inline-related fieldset.module a.collapse-toggle, -.admin-interface .inline-group .inline-related fieldset.module.collapsed a.collapse-toggle { - font-weight: normal; - text-transform: lowercase; - font-size: 12px; - text-decoration: underline; - padding: 0 1px; -} - -@media (min-width: 1024px) { - .admin-interface #changelist .actions .button, - .admin-interface #changelist .actions .action-counter { - margin-left: 8px; - } -} - -.admin-interface #changelist .paginator { - margin-top:-1px; /* merge 2 borders into 1 */ - line-height: 1.5em; - padding-top: 15px; - padding-bottom: 15px; -} - -.admin-interface .paginator a, -.admin-interface .paginator a:link, -.admin-interface .paginator a:visited, -.admin-interface .paginator .this-page { - padding:7px 12px; -} - -.admin-interface .paginator a, -.admin-interface .paginator .this-page { - margin-left:0px; -} - -.admin-interface .paginator .this-page, -.admin-interface .paginator a.end { - margin-right:25px; -} - -.admin-interface .paginator .this-page + a:not(.showall) { - margin-left:-25px; -} - -body.admin-interface .paginator a.showall, -body.admin-interface .paginator a.showall:link, -body.admin-interface .paginator a.showall:visited { - margin-left:20px; -} - -/* fix help text icon on newline */ -.admin-interface .inline-group thead th { - white-space:nowrap; -} - -.admin-interface .inline-group thead th img { - vertical-align: -2px; - margin-left: 5px; -} - -.admin-interface .inline-group .inlinechangelink { - background-size: contain; - padding-left: 15px; - margin-left: 10px; -} - -.admin-interface .file-thumbnail > a { - display: inline-block; -} - -.admin-interface .aligned p.file-upload { - display:table; -} - -.admin-interface form .form-row p.file-upload > a { - margin-right:20px; -} - -.admin-interface form .form-row p.file-upload .clearable-file-input { - display:inline-block; -} - -.admin-interface form .form-row p.file-upload .clearable-file-input label { - padding-bottom:0px; - margin-left:2px; -} - -.admin-interface form .form-row p.file-upload > input[type="file"] { - margin-top: 0px; -} - -@media (max-width:767px){ - - .admin-interface form .form-row p.file-upload { - width: 100%; - } - - .admin-interface form .form-row p.file-upload > a { - margin-right:0px; - display: block; - white-space: pre-wrap; - word-break: break-word; - } - - .admin-interface form .form-row p.file-upload .clearable-file-input { - display: block; - margin-top: 10px; - margin-left: 0; - margin-bottom: -10px; - } - - .admin-interface form .form-row p.file-upload > input[type="file"] { - display: block; - width: auto; - padding: 0px; - } - - /* fix inline horizontal scroll caused by checkbox-row */ - .admin-interface form .form-row > div.checkbox-row { - width: 100%; - } -} - - -/* FIX WIDE FIELDSET HELPS / ERROR MESSAGES */ -.admin-interface form .wide p.help, -.admin-interface form .wide div.help { - padding-left: 50px; -} - -.admin-interface form .wide input + p.help, -.admin-interface form .wide input + div.help { - margin-left: 160px; -} - -@media (max-width:767px){ - .admin-interface form .form-row div.help { - display: block; - width: 100%; - } -} - -.admin-interface form .wide ul.errorlist { - margin-left: 200px; -} - -/* LIST FILTER */ -.admin-interface .module.filtered h2 { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.admin-interface .module.filtered #changelist-filter { - min-width: 240px; -} - -@media (max-width: 1024px) { - .admin-interface .module.filtered #changelist-filter { - min-width: 200px; - } -} - -.admin-interface .module.filtered #changelist-filter h2 { - font-size: 11px; - padding: 10px 15px; -} - -.admin-interface .module.filtered #changelist-filter h2 + h3 { - margin-top: 0px; -} - -.admin-interface .module.filtered #changelist-filter h3 { - margin-top: 12px; - margin-bottom: 12px; -} - -.admin-interface #changelist-form .results { - scrollbar-width: thin; -} - -/* begin fix issue #13 - Datetime widget broken in long inlines */ -.admin-interface p.datetime { - white-space:nowrap; -} -/* end fix */ - -/* begin fix lateral padding to align text with field labels */ -.admin-interface .module h2, -.admin-interface.dashboard .module caption, -.admin-interface.dashboard .module th, -.admin-interface .module.filtered h2, -.admin-interface .inline-group h2, -.admin-interface #nav-sidebar .module caption, -.admin-interface #nav-sidebar .module th { - padding-left: 10px; - padding-right: 10px; -} -/* end fix */ - -/* begin fix restrict tabular-inline horizontal-scroll to inline-group instead of whole page */ -.admin-interface .inline-group[data-inline-type="tabular"] { - overflow-x:auto; -} -/* end fix */ - -/* begin fix stacked-inline margin-bottom in responsive small viewport */ -.admin-interface .inline-group[data-inline-type="stacked"] .module { - margin-bottom:0px; -} -/* end fix */ - -/* begin fix tabular inlines horizontal scroll */ -.admin-interface .inline-related.tabular { - overflow-x: scroll; - overflow-y: hidden; -} -.admin-interface .inline-related.tabular fieldset.module { - display: contents; - width: 100%; - white-space: nowrap; - position: relative; -} -.admin-interface .inline-related.tabular fieldset.module h2 { - position: sticky; - left: 0; -} -.admin-interface .inline-related.tabular fieldset.module table { - scrollbar-width: thin; -} -.admin-interface .inline-related.tabular fieldset.module table tbody tr { - position: relative; -} -/* end fix */ - -.admin-interface .inline-related h3 { - padding:6px 10px; -} - -/* begin fix issue #12 - Inlines bad delete buttons alignement */ -.admin-interface .inline-group .tabular thead th:last-child:not([class]):not([style]) { - text-align:right; -} - -.admin-interface .inline-group .tabular tr td { - vertical-align: top; -} - -.admin-interface .inline-group .tabular tr td.delete { - text-align:right; - padding-right:15px; - vertical-align: top; -} - -.admin-interface .inline-group .tabular tr td input[type="checkbox"] { - margin: 7px 0px; -} - -.admin-interface .inline-group .tabular tr td.delete a.inline-deletelink { - margin-top:4px; - overflow:hidden; - text-indent:9999px; -} -/* end fix */ - -/* top-right buttons color on hover -> just a lighten grey */ -.admin-interface .object-tools a { - color:#FFFFFF; -} -.admin-interface .object-tools a:focus, -.admin-interface .object-tools a:hover, -.admin-interface .object-tools li:focus a, -.admin-interface .object-tools li:hover a { - background-color:#AAAAAA; -} - -/* improve responsive selector */ - -/* fix [stacked, not-stacked] equalize horizontal and vertical select padding for selector */ -.admin-interface .selector .selector-available select, -.admin-interface .selector .selector-chosen select { - padding: 7px 10px; - display: block; -} - -/* fix [stacked, not-stacked] select options text overflow */ -.admin-interface .selector .selector-available select option, -.admin-interface .selector .selector-chosen select option { - overflow: hidden; - text-overflow: ellipsis; -} - -/* fix [not-stacked] equalize selectors height by adding the height of the .selector-available filter-bar */ -.admin-interface .selector:not(.stacked) .selector-chosen select { - height: calc(46px + 17.2em) !important; -} - -/* fix nav-sidebar (added in django 3.1.0) */ -.admin-interface #toggle-nav-sidebar { - top: 10px; - left: 0; - z-index: 20; - flex: 0 0 30px; - width: 30px; - height: 45px; - margin-top: 10px; - margin-right: -30px; - background-color: #FFFFFF; - font-size: 16px; - border: 1px solid #eaeaea; - border-left: none; - outline: none; - -webkit-box-shadow: 4px 4px 8px -4px #DBDBDB; - -moz-box-shadow: 4px 4px 8px -4px #DBDBDB; - box-shadow: 4px 4px 8px -4px #DBDBDB; - /*transition: left .3s;*/ -} - -.admin-interface .toggle-nav-sidebar::before { - margin-top: -2px; -} - -.admin-interface .main > #nav-sidebar + .content, -.admin-interface .main.shifted > #nav-sidebar + .content { - max-width: 100%; -} - -/* hide nav-sidebar below 1280px to prevent horizontal overflow issues */ -@media (max-width:1279px) { - .admin-interface #nav-sidebar, - .admin-interface #toggle-nav-sidebar { - display: none; - } -} - -.admin-interface #nav-sidebar { - flex: 0 0 360px; - left: -360px; - margin-left: -360px; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - padding: 40px 40px 40px 40px; - border-top: none; - border-bottom: none; - border-left: none; - scrollbar-width: thin; - /*transition: left .3s, margin-left .3s;*/ -} - -.admin-interface #nav-filter { - background-color: transparent; - border-radius: 4px; - height: 30px; - margin: 0 0 30px 0; - padding: 5px 6px; - outline-width: initial; -} - -@media (min-width:1280px) { - .admin-interface #main.shifted > #toggle-nav-sidebar { - left: 359px; - } - .admin-interface #main.shifted > #nav-sidebar { - left: 0px; - margin-left: 0; - } - .admin-interface #main:not(.shifted) > .content { - max-width: 100%; - } - .admin-interface.change-list:not(.popup) #main.shifted > #nav-sidebar + .content, - .admin-interface.change-form:not(.popup) #main.shifted > #nav-sidebar + .content { - max-width: calc(100% - 360px); - } -} - -/* fixed related widget and select2 */ -/* begin fix issue #10 - Related widget broken in long tabular inline */ -.admin-interface .related-widget-wrapper { - white-space: nowrap; -} -/* end fix */ - -.admin-interface .related-widget-wrapper select + .related-widget-wrapper-link, -.admin-interface .related-widget-wrapper .select2-container + .related-widget-wrapper-link { - margin-left: 12px !important; -} - -@media (min-width: 768px) { - .admin-interface.change-form select { - min-width: 150px; - } -} - -@media (min-width: 1024px) { - .admin-interface.change-form select { - min-width: 200px; - } -} - -.admin-interface.change-form .inline-related.tabular select { - min-width: auto !important; -} - -/* fixed time widget header border radius */ -.admin-interface .clockbox.module h2 { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -/* fix searchbar overriden padding */ -.admin-interface #changelist #changelist-search #searchbar { - padding: 2px 5px 3px 5px; -} - -@media (min-width: 1024px) { - .admin-interface #changelist #changelist-search #searchbar, - .admin-interface #changelist #changelist-search input[type="submit"], - .admin-interface #changelist #changelist-search .quiet { - margin-left: 8px; - } - .admin-interface #changelist #changelist-search label img { - vertical-align: text-top; - margin-right: 0px; - } -} - -@media (max-width: 1024px) { - .admin-interface #changelist #toolbar { - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; - } - /* fixed changelist search size when there are search results and .quiet is visible */ - .admin-interface #changelist-search label img { - margin-top: 2px; - } - .admin-interface #changelist-search .quiet { - margin: 0 0 0 10px; - align-self: center; - flex-basis: content; - } -} - -@media (max-width: 767px) { - /* fixed responsive widgets */ - .admin-interface .aligned.collapsed .form-row { - display: none; - } - - .admin-interface .aligned .form-row > div { - display: flex; - max-width: 100vw; - flex-direction: column; - align-items: flex-start; - } - - .admin-interface .aligned .form-row .help { - margin-left: 0; - } - - .admin-interface .aligned .form-row .checkbox-row label { - margin: 10px 0 0 0; - padding: 0; - } - - .admin-interface .aligned .form-row input[type="file"], - .admin-interface .aligned .form-row input[type="text"], - .admin-interface .aligned .form-row input[type="email"] { - width: 100%; - } - - /* fix textarea horizontal scroll on Firefox */ - .admin-interface .aligned .form-row textarea { - width: 100% !important; - flex: 0 1 auto; - } - - .admin-interface .aligned .form-row .datetime input[type="text"] { - width: 50%; - } - - .admin-interface .aligned .form-row span + .file-upload { - margin-top: 10px; - } - - .admin-interface .aligned .form-row .file-upload input[type="file"] { - margin-top: 5px; - } -} diff --git a/admin_interface/static/admin_interface/css/admin-interface.css b/admin_interface/static/admin_interface/css/admin-interface.css index 31b3a17..268c1af 100644 --- a/admin_interface/static/admin_interface/css/admin-interface.css +++ b/admin_interface/static/admin_interface/css/admin-interface.css @@ -42,6 +42,10 @@ } } +.admin-interface { + overflow-x: hidden; +} + .admin-interface #header { background: var(--admin-interface-header-background-color); color: var(--admin-interface-header-text-color); diff --git a/admin_interface/static/admin_interface/css/change-form.css b/admin_interface/static/admin_interface/css/change-form.css new file mode 100644 index 0000000..1db2535 --- /dev/null +++ b/admin_interface/static/admin_interface/css/change-form.css @@ -0,0 +1,9 @@ +@media (min-width: 768px) { + .admin-interface .submit-row { + flex-direction: row-reverse; + } + .admin-interface .submit-row a.deletelink { + margin-left: 0; + margin-right: auto; + } +} diff --git a/admin_interface/static/admin_interface/css/changelist.css b/admin_interface/static/admin_interface/css/changelist.css new file mode 100644 index 0000000..3c1cbcd --- /dev/null +++ b/admin_interface/static/admin_interface/css/changelist.css @@ -0,0 +1,43 @@ +@media (min-width: 1024px) { + .admin-interface #changelist .actions .button, + .admin-interface #changelist .actions .action-counter { + margin-left: 8px; + } +} + +.admin-interface #changelist-form .results { + scrollbar-width: thin; +} + +/* fix searchbar overriden padding */ +.admin-interface #changelist #changelist-search #searchbar { + padding: 2px 5px 3px 5px; +} + +@media (min-width: 1024px) { + .admin-interface #changelist #changelist-search #searchbar, + .admin-interface #changelist #changelist-search input[type="submit"], + .admin-interface #changelist #changelist-search .quiet { + margin-left: 8px; + } + .admin-interface #changelist #changelist-search label img { + vertical-align: text-top; + margin-right: 0px; + } +} + +@media (max-width: 1024px) { + .admin-interface #changelist #toolbar { + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + } + /* fixed changelist search size when there are search results and .quiet is visible */ + .admin-interface #changelist-search label img { + margin-top: 2px; + } + .admin-interface #changelist-search .quiet { + margin: 0 0 0 10px; + align-self: center; + flex-basis: content; + } +} diff --git a/admin_interface/static/admin_interface/css/fieldsets.css b/admin_interface/static/admin_interface/css/fieldsets.css new file mode 100644 index 0000000..dc7fabe --- /dev/null +++ b/admin_interface/static/admin_interface/css/fieldsets.css @@ -0,0 +1,14 @@ +.admin-interface fieldset.collapse { + border: 1px solid transparent; +} + +.admin-interface fieldset.collapse.collapsed a.collapse-toggle, +.admin-interface fieldset.collapse a.collapse-toggle, +.admin-interface .inline-group .inline-related fieldset.module a.collapse-toggle, +.admin-interface .inline-group .inline-related fieldset.module.collapsed a.collapse-toggle { + font-weight: normal; + text-transform: lowercase; + font-size: 12px; + text-decoration: underline; + padding: 0 1px; +} diff --git a/admin_interface/static/admin_interface/css/file-upload.css b/admin_interface/static/admin_interface/css/file-upload.css new file mode 100644 index 0000000..1df3dc9 --- /dev/null +++ b/admin_interface/static/admin_interface/css/file-upload.css @@ -0,0 +1,51 @@ +.admin-interface .file-thumbnail > a { + display: inline-block; +} + +.admin-interface .aligned p.file-upload { + display: table; +} + +.admin-interface form .form-row p.file-upload > a { + margin-right: 20px; +} + +.admin-interface form .form-row p.file-upload .clearable-file-input { + display: inline-block; +} + +.admin-interface form .form-row p.file-upload .clearable-file-input label { + padding-bottom: 0px; + margin-left: 5px; +} + +.admin-interface form .form-row p.file-upload > input[type="file"] { + margin-top: 0px; +} + +@media (max-width:767px){ + + .admin-interface form .form-row p.file-upload { + width: 100%; + } + + .admin-interface form .form-row p.file-upload > a { + margin-right: 0px; + display: block; + white-space: pre-wrap; + word-break: break-word; + } + + .admin-interface form .form-row p.file-upload .clearable-file-input { + display: block; + margin-top: 10px; + margin-left: 0; + margin-bottom: -10px; + } + + .admin-interface form .form-row p.file-upload > input[type="file"] { + display: block; + width: auto; + padding: 0px; + } +} diff --git a/admin_interface/static/admin_interface/css/header.css b/admin_interface/static/admin_interface/css/header.css new file mode 100644 index 0000000..c4019d9 --- /dev/null +++ b/admin_interface/static/admin_interface/css/header.css @@ -0,0 +1,51 @@ +.admin-interface #header { + height: auto; + min-height: 55px; + box-sizing: border-box; + display: flex; + justify-content: space-between; + align-items: center; +} + +@media (max-width:1024px) { + .admin-interface #header { + align-items: start; + } +} + +.admin-interface #branding h1 img.logo { + margin-top: 10px; + margin-bottom: 10px; + margin-right: 15px; + display: inline-block !important; /* override inline display:none; */ +} + +.admin-interface #branding h1 span { + display: inline-block; +} + +.admin-interface #branding h1 img.logo+span { + white-space: nowrap; +} + +.admin-interface #user-tools { + margin-top: 10px; + margin-bottom: 10px; + white-space: nowrap; + align-self: flex-start; +} + +.admin-interface #user-tools br { + display: none; +} + +@media (max-width: 768px) { + .admin-interface #user-tools br { + display: block; + } +} + +/* hide theme toggle button until dark theme will be supported */ +.admin-interface #user-tools button.theme-toggle { + display: none; +} diff --git a/admin_interface/static/admin_interface/css/inlines.css b/admin_interface/static/admin_interface/css/inlines.css new file mode 100644 index 0000000..1ebc730 --- /dev/null +++ b/admin_interface/static/admin_interface/css/inlines.css @@ -0,0 +1,105 @@ +/* begin fix help text icon on newline */ +.admin-interface .inline-group thead th { + white-space:nowrap; +} + +.admin-interface .inline-group thead th img { + vertical-align: -2px; + margin-left: 5px; +} + +.admin-interface .inline-group .inlinechangelink { + margin-left: 10px; +} + +.admin-interface .inline-group .inline-related.tabular .inlinechangelink { + background-size: contain; +} +/* end fix */ + +/* begin fix restrict tabular-inline horizontal-scroll to inline-group instead of whole page */ +.admin-interface .inline-group[data-inline-type="tabular"] { + overflow-x: auto; +} +/* end fix */ + +/* begin fix stacked-inline margin-bottom in responsive small viewport */ +.admin-interface .inline-group[data-inline-type="stacked"] .module { + margin-bottom: 0px; +} +/* end fix */ + +/* begin fix tabular inlines horizontal scroll */ +.admin-interface .inline-related.tabular { + overflow-x: scroll; + overflow-y: hidden; +} +.admin-interface .inline-related.tabular fieldset.module { + display: contents; + width: 100%; + white-space: nowrap; + position: relative; +} +.admin-interface .inline-related.tabular fieldset.module h2 { + position: sticky; + left: 0; +} +.admin-interface .inline-related.tabular fieldset.module table { + scrollbar-width: thin; +} +.admin-interface .inline-related.tabular fieldset.module table tbody tr { + position: relative; +} +/* end fix */ + +.admin-interface .inline-related h3 { + padding: 6px 10px; +} + +/* begin fix issue #12 - Inlines bad delete buttons alignement */ +.admin-interface .inline-group .tabular thead th:last-child:not([class]):not([style]) { + text-align: right; +} + +.admin-interface .inline-group .tabular tr td { + vertical-align: top; +} + +.admin-interface .inline-group .tabular tr td.delete { + text-align: right; + padding-right: 15px; + vertical-align: top; +} + +.admin-interface .inline-group .tabular tr td input[type="checkbox"] { + margin: 7px 0px; +} + +.admin-interface .inline-group .tabular tr td.delete a.inline-deletelink { + margin-top: 4px; + overflow: hidden; + text-indent: 9999px; +} +/* end fix */ + +/* begin fix remove button at the end od dynamically added inline rows */ +.admin-interface .inline-group .tabular tr td:not(.delete) * + div:has(> a.inline-deletelink) { + display: inline-block; + margin-bottom: -3px; + margin-left: 10px; +} +/* end fix */ + +/* begin fix issue #13 - Datetime widget broken in long inlines */ +.admin-interface .inline-group .inline-related p.datetime { + white-space: nowrap; +} +/* end fix */ + +/* begin fix inline horizontal scroll caused by checkbox-row */ +@media (max-width:767px){ + .admin-interface form .form-row > div.checkbox-row { + width: 100%; + } +} +/* end fix */ diff --git a/admin_interface/static/admin_interface/css/list-filter.css b/admin_interface/static/admin_interface/css/list-filter.css new file mode 100644 index 0000000..113abdb --- /dev/null +++ b/admin_interface/static/admin_interface/css/list-filter.css @@ -0,0 +1,28 @@ +.admin-interface .module.filtered h2 { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.admin-interface .module.filtered #changelist-filter { + min-width: 240px; +} + +@media (max-width: 1024px) { + .admin-interface .module.filtered #changelist-filter { + min-width: 200px; + } +} + +.admin-interface .module.filtered #changelist-filter h2 { + font-size: 11px; + padding: 10px 15px; +} + +.admin-interface .module.filtered #changelist-filter h2 + h3 { + margin-top: 0px; +} + +.admin-interface .module.filtered #changelist-filter h3 { + margin-top: 12px; + margin-bottom: 12px; +} diff --git a/admin_interface/static/admin_interface/css/login.css b/admin_interface/static/admin_interface/css/login.css new file mode 100644 index 0000000..3114373 --- /dev/null +++ b/admin_interface/static/admin_interface/css/login.css @@ -0,0 +1,65 @@ +.admin-interface.login #container { + width: 100%; + max-width: 360px; + margin: 15px auto; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.admin-interface.login #content { + padding: 15px 30px 30px 30px; +} + +@media (min-width:768px){ + .admin-interface.login #container { + margin: 90px auto; + } +} + +.admin-interface.login #header { + min-height: auto; + padding: 10px 30px; + line-height: 30px; + align-items: center; + justify-content: flex-start; +} + +.admin-interface.login #header #branding h1 { + margin-right:0; +} + +.admin-interface.login #header #branding h1 img.logo { + margin-right: 0; +} + +.admin-interface.login #header #branding h1 img.logo+span { + display: block; +} + +.admin-interface.login #login-form { + display: flex; + flex-direction: column; +} + +.admin-interface.login .submit-row { + float: left; + width: 100%; + margin-top: 20px; + padding-top: 0; + padding-left: 0; + text-align: right; +} + +.admin-interface.login .submit-row label { + display: none; +} + +.admin-interface.login .submit-row input[type="submit"] { + width: 100%; + text-transform: uppercase; +} + +.admin-interface.login #footer { + display: none; +} diff --git a/admin_interface/static/admin_interface/css/modules.css b/admin_interface/static/admin_interface/css/modules.css new file mode 100644 index 0000000..6208181 --- /dev/null +++ b/admin_interface/static/admin_interface/css/modules.css @@ -0,0 +1,12 @@ +/* begin fix lateral padding to align text with field labels */ +.admin-interface .module h2, +.admin-interface.dashboard .module caption, +.admin-interface.dashboard .module th, +.admin-interface .module.filtered h2, +.admin-interface .inline-group h2, +.admin-interface #nav-sidebar .module caption, +.admin-interface #nav-sidebar .module th { + padding-left: 10px; + padding-right: 10px; +} +/* end fix */ diff --git a/admin_interface/static/admin_interface/css/nav-sidebar.css b/admin_interface/static/admin_interface/css/nav-sidebar.css new file mode 100644 index 0000000..14356e3 --- /dev/null +++ b/admin_interface/static/admin_interface/css/nav-sidebar.css @@ -0,0 +1,78 @@ +/* fix nav-sidebar (added in django 3.1.0) */ +.admin-interface #toggle-nav-sidebar { + top: 10px; + left: 0; + z-index: 20; + flex: 0 0 30px; + width: 30px; + height: 45px; + margin-top: 10px; + margin-right: -30px; + background-color: #FFFFFF; + font-size: 16px; + border: 1px solid #eaeaea; + border-left: none; + outline: none; + -webkit-box-shadow: 4px 4px 8px -4px #DBDBDB; + -moz-box-shadow: 4px 4px 8px -4px #DBDBDB; + box-shadow: 4px 4px 8px -4px #DBDBDB; + /*transition: left .3s;*/ +} + +.admin-interface .toggle-nav-sidebar::before { + margin-top: -2px; +} + +.admin-interface .main > #nav-sidebar + .content, +.admin-interface .main.shifted > #nav-sidebar + .content { + max-width: 100%; +} + +/* hide nav-sidebar below 1280px to prevent horizontal overflow issues */ +@media (max-width:1279px) { + .admin-interface #nav-sidebar, + .admin-interface #toggle-nav-sidebar { + display: none; + } +} + +.admin-interface #nav-sidebar { + flex: 0 0 360px; + left: -360px; + margin-left: -360px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + padding: 40px 40px 40px 40px; + border-top: none; + border-bottom: none; + border-left: none; + scrollbar-width: thin; + /*transition: left .3s, margin-left .3s;*/ +} + +.admin-interface #nav-filter { + background-color: transparent; + border-radius: 4px; + height: 30px; + margin: 0 0 30px 0; + padding: 5px 6px; + outline-width: initial; +} + +@media (min-width:1280px) { + .admin-interface #main.shifted > #toggle-nav-sidebar { + left: 359px; + } + .admin-interface #main.shifted > #nav-sidebar { + left: 0px; + margin-left: 0; + } + .admin-interface #main:not(.shifted) > .content { + max-width: 100%; + } + .admin-interface.change-list:not(.popup) #main.shifted > #nav-sidebar + .content, + .admin-interface.change-form:not(.popup) #main.shifted > #nav-sidebar + .content { + max-width: calc(100% - 360px); + } +} diff --git a/admin_interface/static/admin_interface/css/object-tools.css b/admin_interface/static/admin_interface/css/object-tools.css new file mode 100644 index 0000000..4e5aa1c --- /dev/null +++ b/admin_interface/static/admin_interface/css/object-tools.css @@ -0,0 +1,10 @@ +/* top-right buttons color on hover -> just a lighten grey */ +.admin-interface .object-tools a { + color: #FFFFFF; +} +.admin-interface .object-tools a:focus, +.admin-interface .object-tools a:hover, +.admin-interface .object-tools li:focus a, +.admin-interface .object-tools li:hover a { + background-color: #AAAAAA; +} diff --git a/admin_interface/static/admin_interface/css/paginator.css b/admin_interface/static/admin_interface/css/paginator.css new file mode 100644 index 0000000..fc69d3e --- /dev/null +++ b/admin_interface/static/admin_interface/css/paginator.css @@ -0,0 +1,33 @@ +.admin-interface #changelist .paginator { + margin-top: -1px; /* merge 2 borders into 1 */ + line-height: 1.5em; + padding-top: 15px; + padding-bottom: 15px; +} + +.admin-interface .paginator a, +.admin-interface .paginator a:link, +.admin-interface .paginator a:visited, +.admin-interface .paginator .this-page { + padding: 7px 12px; +} + +.admin-interface .paginator a, +.admin-interface .paginator .this-page { + margin-left: 0px; +} + +.admin-interface .paginator .this-page, +.admin-interface .paginator a.end { + margin-right: 25px; +} + +.admin-interface .paginator .this-page + a:not(.showall) { + margin-left: -25px; +} + +body.admin-interface .paginator a.showall, +body.admin-interface .paginator a.showall:link, +body.admin-interface .paginator a.showall:visited { + margin-left: 20px; +} diff --git a/admin_interface/static/admin_interface/css/widgets.css b/admin_interface/static/admin_interface/css/widgets.css new file mode 100644 index 0000000..73b76ca --- /dev/null +++ b/admin_interface/static/admin_interface/css/widgets.css @@ -0,0 +1,102 @@ +/* fix generic flex container */ +.admin-interface .flex-container { + width: 100%; +} +.admin-interface .flex-container.checkbox-row { + align-items: center; +} +.admin-interface .flex-container.checkbox-row label.vCheckboxLabel { + margin-top: 0 !important; + padding-left: 5px !important; + padding-bottom: 0; +} +/* end-fix */ + +/* fixed time widget header border radius */ +.admin-interface .clockbox.module h2 { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +/* end-fix */ + +/* fixed related widget and select2 */ +/* begin fix issue #10 - Related widget broken in long tabular inline */ +.admin-interface .related-widget-wrapper { + white-space: nowrap; +} +/* end fix */ + +.admin-interface .related-widget-wrapper select + .related-widget-wrapper-link, +.admin-interface .related-widget-wrapper .select2-container + .related-widget-wrapper-link { + margin-left: 12px !important; +} + + +/* improve responsive selector */ + +/* fix [stacked, not-stacked] equalize horizontal and vertical select padding for selector */ +.admin-interface .selector .selector-available select, +.admin-interface .selector .selector-chosen select { + padding: 7px 10px; + display: block; +} + +/* fix [stacked, not-stacked] select options text overflow */ +.admin-interface .selector .selector-available select option, +.admin-interface .selector .selector-chosen select option { + overflow: hidden; + text-overflow: ellipsis; +} + +/* fix [not-stacked] equalize selectors height by adding the height of the .selector-available filter-bar */ +.admin-interface .selector:not(.stacked) .selector-chosen select { + height: calc(46px + 17.2em) !important; +} + +@media (max-width: 767px) { + /* fixed responsive widgets */ + .admin-interface .aligned.collapsed .form-row { + display: none; + } + + .admin-interface .aligned .form-row > div { + display: flex; + width: 100%; + max-width: 100vw; + flex-direction: column; + align-items: flex-start; + } + + .admin-interface .aligned .form-row .help { + margin-left: 0; + } + + .admin-interface .aligned .form-row .checkbox-row label { + margin: 10px 0 0 0; + padding: 0; + } + + .admin-interface .aligned .form-row input[type="file"], + .admin-interface .aligned .form-row input[type="text"], + .admin-interface .aligned .form-row input[type="email"] { + width: 100%; + } + + /* fix textarea horizontal scroll on Firefox */ + .admin-interface .aligned .form-row textarea { + width: 100% !important; + flex: 0 1 auto; + } + + .admin-interface .aligned .form-row .datetime input[type="text"] { + width: 50%; + } + + .admin-interface .aligned .form-row span + .file-upload { + margin-top: 10px; + } + + .admin-interface .aligned .form-row .file-upload input[type="file"] { + margin-top: 5px; + } +} diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index 2e3ebc2..e4b5b26 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -79,28 +79,29 @@ {% endif %} } - - - - - - + + + + + + + + + + + + + + + + {% if not theme.recent_actions_visible %} - + {% endif %} - - - + + + + From b5980b85e6b5da02012b40c67ed610d2b8770e6b Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 21 Dec 2023 10:59:33 +0100 Subject: [PATCH 275/326] Remove old third-party compatibility CSS files. --- .../static/admin_interface/css/ckeditor.css | 126 ----------- .../admin_interface/css/form-controls.css | 95 --------- .../admin_interface/css/import-export.css | 7 - .../admin_interface/css/json-widget.css | 27 --- .../admin_interface/css/modeltranslation.css | 17 -- .../admin_interface/css/rangefilter.css | 25 --- .../admin_interface/css/sorl-thumbnail.css | 67 ------ .../admin_interface/css/streamfield.css | 200 ------------------ .../admin_interface/css/tabbed-admin.css | 37 ---- .../static/admin_interface/css/tinymce.css | 3 - 10 files changed, 604 deletions(-) delete mode 100644 admin_interface/static/admin_interface/css/ckeditor.css delete mode 100644 admin_interface/static/admin_interface/css/form-controls.css delete mode 100644 admin_interface/static/admin_interface/css/import-export.css delete mode 100644 admin_interface/static/admin_interface/css/json-widget.css delete mode 100644 admin_interface/static/admin_interface/css/modeltranslation.css delete mode 100644 admin_interface/static/admin_interface/css/rangefilter.css delete mode 100644 admin_interface/static/admin_interface/css/sorl-thumbnail.css delete mode 100644 admin_interface/static/admin_interface/css/streamfield.css delete mode 100644 admin_interface/static/admin_interface/css/tabbed-admin.css delete mode 100644 admin_interface/static/admin_interface/css/tinymce.css diff --git a/admin_interface/static/admin_interface/css/ckeditor.css b/admin_interface/static/admin_interface/css/ckeditor.css deleted file mode 100644 index 952120c..0000000 --- a/admin_interface/static/admin_interface/css/ckeditor.css +++ /dev/null @@ -1,126 +0,0 @@ -/* -ckeditor + light theme -https://github.com/Ikimea/ckeditor-light-theme -*/ - -.admin-interface .cke { - border: none; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; -} - -.admin-interface .cke_inner, -.admin-interface .cke_wysiwyg_frame { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; -} - -.admin-interface .cke_inner { - border: 1px solid #CCCCCC; -} - -.admin-interface .cke_chrome { - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.admin-interface .cke_top { - background: #f8f8f8; - border-top: none; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid #EEEEEE; - padding-left: 10px; - padding-right: 10px; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.admin-interface .cke_toolgroup { - background: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.admin-interface .cke_bottom { - background: #f8f8f8; - border-top: 1px solid #EEEEEE; - - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.admin-interface .cke_source { - padding: 13px 15px; - box-sizing: border-box; -} - -.admin-interface a.cke_button, -.admin-interface a.cke_button:active, -.admin-interface a.cke_button:hover, -.admin-interface a.cke_button:focus { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - background-image: none; - border-radius: 4px; - border: none; -} - -.admin-interface a.cke_button:active, -.admin-interface a.cke_button:hover, -.admin-interface a.cke_button:focus { - background-color: #E8E8E8 !important; -} - -.admin-interface a.cke_button.cke_button_on { - background-color: #CCCCCC !important; -} - -.admin-interface a.cke_button.cke_button_disabled { - background-color: transparent !important; -} - -.admin-interface .cke_resizer { - border-color: transparent #666666 transparent transparent; -} - -@media (max-width: 767px){ - - .admin-interface .django-ckeditor-widget, - .admin-interface .cke { - width: 100% !important; - } - - .admin-interface .cke_top { - padding-left: 10px; - padding-right: 10px; - } - - .admin-interface .cke_toolbar { - height: auto; - } - - .admin-interface .cke_contents { - height: auto; - } - - .admin-interface .tabular .django-ckeditor-widget, - .admin-interface .tabular .cke { - width: 400px !important; - } - - .admin-interface .tabular .cke_contents { - height: 90px !important; - } -} diff --git a/admin_interface/static/admin_interface/css/form-controls.css b/admin_interface/static/admin_interface/css/form-controls.css deleted file mode 100644 index 4307367..0000000 --- a/admin_interface/static/admin_interface/css/form-controls.css +++ /dev/null @@ -1,95 +0,0 @@ -/* sticky pagination */ - -.admin-interface.sticky-pagination.change-list #content-main { - padding-bottom: 4.375rem; -} - -.admin-interface.sticky-pagination.change-list .paginator { - width: 100%; - position: fixed; - bottom: 0; - right: 0; - z-index: 40; - box-sizing: border-box; - padding-left: 15px; - padding-right: 15px; - white-space: nowrap; - text-overflow: ellipsis; - border-radius: 0; - border-top: 1px solid #EEEEEE !important; - border-bottom: none; - margin: 0; -} - -.admin-interface.sticky-pagination.change-list.popup .paginator { - padding-left: 20px; - padding-right: 20px; -} - -@media (min-width:768px) { - .admin-interface.sticky-pagination.change-list:not(.popup) .paginator { - padding-left: 30px; - padding-right: 30px; - } -} - -@media (min-width:1024px) { - .admin-interface.sticky-pagination.change-list:not(.popup) .paginator { - padding-left: 40px; - padding-right: 40px; - } -} - -@media (min-width:1280px) { - .admin-interface.sticky-pagination.change-list:not(.popup) #main.shifted > #nav-sidebar + .content .paginator { - width: calc(100% - 360px); - } -} - -/* sticky submit */ - -@media (min-width:768px) { - .admin-interface.sticky-submit.change-form #content-main { - padding-bottom: 4.375rem; - } - - .admin-interface.sticky-submit.change-form .submit-row:last-of-type { - width: 100%; - position: fixed; - bottom: 0; - right: 0; - z-index: 40; - box-sizing: border-box; - padding-left: 15px; - padding-right: 15px; - white-space: nowrap; - text-overflow: ellipsis; - border-radius: 0; - border-top: 1px solid #EEEEEE; - border-bottom: none !important; - margin: 0; - } - - .admin-interface.sticky-submit.change-form.popup .submit-row:last-of-type { - padding-left: 20px; - padding-right: 20px; - } - - .admin-interface.sticky-submit.change-form:not(.popup) .submit-row:last-of-type { - padding-left: 30px; - padding-right: 30px; - } -} - -@media (min-width:1024px) { - .admin-interface.sticky-submit.change-form:not(.popup) .submit-row:last-of-type { - padding-left: 40px; - padding-right: 40px; - } -} - -@media (min-width:1280px) { - .admin-interface.sticky-submit.change-form:not(.popup) #main.shifted > #nav-sidebar + .content .submit-row:last-of-type { - width: calc(100% - 359px); - } -} diff --git a/admin_interface/static/admin_interface/css/import-export.css b/admin_interface/static/admin_interface/css/import-export.css deleted file mode 100644 index 8ea0a09..0000000 --- a/admin_interface/static/admin_interface/css/import-export.css +++ /dev/null @@ -1,7 +0,0 @@ -/* Fix left/right scrolling broken with django-import-export #165 */ -.admin-interface table.import-preview { - display: block; - width: 100%; - max-width: 100%; - overflow: auto; -} diff --git a/admin_interface/static/admin_interface/css/json-widget.css b/admin_interface/static/admin_interface/css/json-widget.css deleted file mode 100644 index e0a999d..0000000 --- a/admin_interface/static/admin_interface/css/json-widget.css +++ /dev/null @@ -1,27 +0,0 @@ -/* -django-json-widget support -https://github.com/jmrivas86/django-json-widget -*/ - -.admin-interface div.jsoneditor { - border: 1px solid var(--admin-interface-module-background-color); - border-radius: var(--admin-interface-jsoneditor-border-radius); - overflow: var(--admin-interface-jsoneditor-overflow); -} - -.admin-interface div.jsoneditor-menu { - background-color: var(--admin-interface-module-background-color); - border-bottom: 1px solid var(--admin-interface-module-background-color); -} - -.admin-interface div.jsoneditor-menu a.jsoneditor-poweredBy { - color: var(--admin-interface-module-link-color); -} - -.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected, -.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected:focus, -.admin-interface div.jsoneditor-contextmenu ul li button.jsoneditor-selected:hover { - background-color: var(--admin-interface-module-background-selected-color); - color: #000000; - font-weight: bold; -} diff --git a/admin_interface/static/admin_interface/css/modeltranslation.css b/admin_interface/static/admin_interface/css/modeltranslation.css deleted file mode 100644 index 9e1890b..0000000 --- a/admin_interface/static/admin_interface/css/modeltranslation.css +++ /dev/null @@ -1,17 +0,0 @@ -/* -django-modeltranslation support -https://github.com/deschler/django-modeltranslation -*/ - -.admin-interface #content h1 select { - text-transform: uppercase; - margin-left: 15px; - min-width: 50px; -} - -.admin-interface .ui-tabs .ui-tabs-panel[id^=tab_id_] { - border: none; - border-top: 1px solid #eeeeee; - padding: 0; - margin-bottom: 0; -} diff --git a/admin_interface/static/admin_interface/css/rangefilter.css b/admin_interface/static/admin_interface/css/rangefilter.css deleted file mode 100644 index 25b4f0b..0000000 --- a/admin_interface/static/admin_interface/css/rangefilter.css +++ /dev/null @@ -1,25 +0,0 @@ -.admin-interface #changelist-filter .admindatefilter { - border-bottom: 1px solid var(--hairline-color); -} - -.admin-interface #changelist-filter .admindatefilter .button, -.admin-interface #changelist-filter .admindatefilter .submit-row input, -.admin-interface #changelist-filter .admindatefilter a.button, -.admin-interface #changelist-filter .admindatefilter input[type="submit"], -.admin-interface #changelist-filter .admindatefilter input[type="button"], -.admin-interface #changelist-filter .admindatefilter input[type="reset"] { - background: var(--admin-interface-module-background-color); - color: var(--admin-interface-module-link-color); - padding: 6px 10px; - font-size: 12px; - margin-right: 4px; -} - -.admin-interface #changelist-filter .admindatefilter .button:hover, -.admin-interface #changelist-filter .admindatefilter .submit-row input:hover, -.admin-interface #changelist-filter .admindatefilter a.button:hover, -.admin-interface #changelist-filter .admindatefilter input[type="submit"]:hover, -.admin-interface #changelist-filter .admindatefilter input[type="button"]:hover, -.admin-interface #changelist-filter .admindatefilter input[type="reset"]:hover { - color: var(--admin-interface-module-link-hover-color); -} diff --git a/admin_interface/static/admin_interface/css/sorl-thumbnail.css b/admin_interface/static/admin_interface/css/sorl-thumbnail.css deleted file mode 100644 index 44c6190..0000000 --- a/admin_interface/static/admin_interface/css/sorl-thumbnail.css +++ /dev/null @@ -1,67 +0,0 @@ -/* -sorl-thumbnail - improved AdminImageMixin widget layout -https://github.com/mariocesar/sorl-thumbnail -*/ - -.admin-interface a.thumbnail + a { - font-weight: normal; -} - -.admin-interface a.thumbnail + a + input[type="checkbox"] { - margin: 10px 0px 10px 18px; -} - -@media (max-width: 767px){ - .admin-interface a.thumbnail + a { - display: block; - margin-top: 3px; - white-space: pre-wrap; - word-break: break-word; - } - .admin-interface a.thumbnail + a + input[type="checkbox"] { - margin: 15px 0; - } -} - -.admin-interface a.thumbnail ~ label { - color: #333; - font-size: 11px; - display: inline; - float: none; - margin-left: 2px; -} - -.admin-interface.change-form div[style="float:left"] { - font-size: 11px; - font-weight: bold; - color: #666; - margin-bottom: 5px; -} - -@media (max-width: 767px){ - .admin-interface.change-form div[style="float:left"] { - font-size: 12px; - width: 100%; - } -} - -.admin-interface .aligned .form-row a.thumbnail ~ input[type="file"] { - margin-top: 0px; -} - -@media (max-width:767px){ - .admin-interface .aligned .form-row a.thumbnail ~ input[type="file"] { - width: auto; - padding: 0px; - display: block; - margin-top: 3px; - } - - .admin-interface div[style="float:left"] { - margin-bottom: 0px; - } - - .admin-interface div[style="float:left"] + div.help { - margin-top: 0px !important; - } -} diff --git a/admin_interface/static/admin_interface/css/streamfield.css b/admin_interface/static/admin_interface/css/streamfield.css deleted file mode 100644 index 71ce2db..0000000 --- a/admin_interface/static/admin_interface/css/streamfield.css +++ /dev/null @@ -1,200 +0,0 @@ -/* -django-streamfield support -https://github.com/raagin/django-streamfield/ -*/ - -.admin-interface .form-row.field-stream { - margin: 0; - padding: 0; - border-bottom: none; -} - -.admin-interface .form-row.field-stream label[for=id_stream] { - display: none; -} - -.admin-interface .streamfield_app { - clear: both; - width: 100%; -} - -.admin-interface .streamfield_app .stream-help-text { - margin-bottom: 15px; - display: flex; - flex-direction: column; - clear: both; -} - -.admin-interface .streamfield_app .stream-help-text .stream-help-text__title { - align-self: flex-end; - user-select: none; - padding: 8px; - padding-right: 0; - color: var(--admin-interface-generic-link-color); -} - -.admin-interface .streamfield_app .stream-help-text .stream-help-text__title:hover { - color: var(--admin-interface-generic-link-hover-color); -} - -.admin-interface .streamfield_app .stream-help-text .stream-help-text__content { - background: var(--admin-interface-module-background-selected-color); - border-radius: var(--admin-interface-module-border-radius); - border: 1px solid rgba(0,0,0,0.1); - padding: 15px; -} - -.admin-interface .streamfield_app .stream-help-text .stream-help-text__content > ul { - margin: 0; - padding: 0; -} - -.admin-interface .streamfield_app .collapse-handler { - user-select: none; - padding: 8px; - padding-right: 0; - margin: 0 0 5px 0; - color: var(--admin-interface-generic-link-color); - text-decoration: none; -} - -.admin-interface .streamfield_app .collapse-handler:hover { - color: var(--admin-interface-generic-link-hover-color); - text-decoration: none; -} - -.admin-interface .streamfield_app .stream-model-block { - position: relative; - box-shadow: none; - border: 1px solid rgba(0,0,0,0.1); - border-radius: var(--admin-interface-module-border-radius); - overflow: hidden; -} - -.admin-interface .streamfield_app .stream-model-block, -.admin-interface .streamfield_app .streamfield-models.collapsed .stream-model-block { - margin-bottom: 10px; -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - margin: 0; - padding: 10px 10px 10px 20px; -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title span { - font-size: 18px; -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle { - position: static; - right: 0; - top: 0; - color: var(--admin-interface-generic-link-color); -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle:hover { - color: var(--admin-interface-generic-link-hover-color); -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle { - display: flex; - justify-content: center; - align-items: center; -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move, -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-delete { - display: flex; - justify-content: center; - align-items: center; - width: 40px; - height: 40px; - font-weight: normal; - background: none; - flex-shrink: 0; - color: inherit; - font-size: 16px; -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move { - cursor: move; /* fallback if grab cursor is unsupported */ - cursor: grab; - cursor: -moz-grab; - cursor: -webkit-grab; -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-move:before { - content: "↕"; - - display: block; -} - -.admin-interface .streamfield_app .stream-model-block .streamblock__block__title .streamblock__block-handle .block-delete:before { - content: "×"; - display: block; - font-size: 18px; -} - -.admin-interface .streamfield_app .block-fields > div { - margin-bottom: 15px; -} - -.admin-interface .streamfield_app .stream-model-block .stream-model-block__content { - background-color: #f8f8f8; - padding: 20px; -} - -.admin-interface .streamfield_app .stream-model-block .stream-model-block__content.no-subblocks.abstract-block { - display: none; -} - -.admin-interface .streamfield_app .stream-insert-new-block { - margin-bottom: 20px; -} - -.admin-interface .streamfield_app .stream-insert-new-block .add-new-block-button { - color: var(--admin-interface-generic-link-color); - text-decoration: none; -} - -.admin-interface .streamfield_app .stream-insert-new-block .add-new-block-button:hover { - color: var(--admin-interface-generic-link-hover-color); - text-decoration: none; -} - -.admin-interface .streamfield_app .stream-insert-new-block ul { - display: block; - width: 100%; - margin: 10px 0 0 0; - padding: 0; - user-select: none; -} - -.admin-interface .streamfield_app .stream-insert-new-block ul li { - display: inline-block; - font-size: 12px; - margin: 0; - padding: 0; -} - -.admin-interface .streamfield_app .stream-btn { - font-weight: normal; - text-decoration: none; - background-color: var(--admin-interface-generic-link-color); - padding: 6px 12px; - border-radius: 4px; -} - -.admin-interface .streamfield_app .stream-btn:hover { - text-decoration: none; - background-color: var(--admin-interface-generic-link-hover-color); -} - -.admin-interface .streamfield_app .stream-insert-new-block ul li .stream-btn { - margin-top: 5px; - margin-left: 5px; -} diff --git a/admin_interface/static/admin_interface/css/tabbed-admin.css b/admin_interface/static/admin_interface/css/tabbed-admin.css deleted file mode 100644 index 010296c..0000000 --- a/admin_interface/static/admin_interface/css/tabbed-admin.css +++ /dev/null @@ -1,37 +0,0 @@ -/* -django-tabbed-admin support -https://github.com/omji/django-tabbed-admin -*/ - -/* Hide tabs until ready */ -/* -.admin-interface #tabs ul { - display: none; -} - -.admin-interface #tabs ul.ui-tabs-nav { - display: block; -} -*/ - -.admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .module.aligned:last-child { - margin-bottom: 0; -} - -.admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .module.aligned:last-child .form-row:last-child { - border-bottom: none; -} - -@media (max-width: 350px){ - .admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .vTextField, - .admin-interface .inline-related .vTextField { - width: 17em; - } -} - -@media (max-width: 767px){ - /* fix horizontal overflow - responsive.css:563 */ - .admin-interface .ui-tabs .ui-tabs-panel[id^=tabs] .aligned .form-row > div:not([class]) { - width: 100% !important; - } -} diff --git a/admin_interface/static/admin_interface/css/tinymce.css b/admin_interface/static/admin_interface/css/tinymce.css deleted file mode 100644 index 76ed1b4..0000000 --- a/admin_interface/static/admin_interface/css/tinymce.css +++ /dev/null @@ -1,3 +0,0 @@ -.admin-interface textarea.tinymce ~ p.help { - margin-top:5px !important; -} From 6dbe8fec0fbc9e9944ec44e38ae3531325f187da Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 21 Dec 2023 11:00:59 +0100 Subject: [PATCH 276/326] Remove `type="text/css"` and `type="text/javascript"` attributes. --- admin_interface/templates/admin/base_site.html | 8 ++++---- admin_interface/templates/admin/change_form.html | 2 +- admin_interface/templates/admin/popup_response.html | 3 +-- .../templates/admin_interface/collapsible-inlines.html | 2 +- admin_interface/templates/admin_interface/favicon.html | 4 ++-- .../templates/admin_interface/foldable-apps.html | 4 ++-- .../templates/admin_interface/related-modal.html | 6 +++--- 7 files changed, 14 insertions(+), 15 deletions(-) diff --git a/admin_interface/templates/admin/base_site.html b/admin_interface/templates/admin/base_site.html index e4b5b26..6d3f48c 100644 --- a/admin_interface/templates/admin/base_site.html +++ b/admin_interface/templates/admin/base_site.html @@ -10,7 +10,7 @@ {% get_admin_interface_theme as theme %} {% get_admin_interface_nocache as version_md5_cache %} {% get_current_language as current_lang %} -