diff --git a/package-lock.json b/package-lock.json index b371e658092c..499463ff02b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "addons-linter": "7.8.0", "clean-css": "5.3.3", "clean-css-cli": "5.6.3", + "highcharts": "^12.1.2", "jqmodal": "1.4.2", "jquery": "3.7.1", "jquery-pjax": "2.0.1", @@ -20,7 +21,7 @@ "less": "4.2.2", "netmask": "2.0.2", "source-map": "0.7.4", - "timeago": "1.6.7", + "timeago.js": "^4.0.2", "underscore": "1.13.7" }, "devDependencies": { @@ -2805,6 +2806,11 @@ "node": ">=8" } }, + "node_modules/highcharts": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-12.1.2.tgz", + "integrity": "sha512-paZ72q1um0zZT1sS+O/3JfXVSOLPmZ0zlo8SgRc0rEplPFPQUPc4VpkgQS8IUTueeOBgIWwVpAWyC9tBYbQ0kg==" + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -4452,13 +4458,10 @@ "real-require": "^0.2.0" } }, - "node_modules/timeago": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/timeago/-/timeago-1.6.7.tgz", - "integrity": "sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ==", - "dependencies": { - "jquery": ">=1.5.0 <4.0" - } + "node_modules/timeago.js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/timeago.js/-/timeago.js-4.0.2.tgz", + "integrity": "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==" }, "node_modules/tinybench": { "version": "2.9.0", @@ -7842,6 +7845,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "highcharts": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-12.1.2.tgz", + "integrity": "sha512-paZ72q1um0zZT1sS+O/3JfXVSOLPmZ0zlo8SgRc0rEplPFPQUPc4VpkgQS8IUTueeOBgIWwVpAWyC9tBYbQ0kg==" + }, "html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -9066,13 +9074,10 @@ "real-require": "^0.2.0" } }, - "timeago": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/timeago/-/timeago-1.6.7.tgz", - "integrity": "sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ==", - "requires": { - "jquery": ">=1.5.0 <4.0" - } + "timeago.js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/timeago.js/-/timeago.js-4.0.2.tgz", + "integrity": "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==" }, "tinybench": { "version": "2.9.0", diff --git a/package.json b/package.json index d92cc3b4c00f..5316302f39ac 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "addons-linter": "7.8.0", "clean-css": "5.3.3", "clean-css-cli": "5.6.3", + "highcharts": "^12.1.2", "jqmodal": "1.4.2", "jquery": "3.7.1", "jquery-pjax": "2.0.1", @@ -26,7 +27,7 @@ "less": "4.2.2", "netmask": "2.0.2", "source-map": "0.7.4", - "timeago": "1.6.7", + "timeago.js": "^4.0.2", "underscore": "1.13.7" }, "devDependencies": { diff --git a/src/olympia/abuse/admin.py b/src/olympia/abuse/admin.py index ceb648000faf..87ed64ad7a21 100644 --- a/src/olympia/abuse/admin.py +++ b/src/olympia/abuse/admin.py @@ -92,12 +92,7 @@ def queryset(self, request, queryset): class AbuseReportAdmin(AMOModelAdmin): class Media(AMOModelAdmin.Media): - css = { - 'all': ( - 'css/admin/amoadmin.css', - 'css/admin/abuse_reports.css', - ) - } + css = {'all': ('css/admin-abuse-report.css',)} date_hierarchy = 'modified' list_display = ( diff --git a/src/olympia/addons/admin.py b/src/olympia/addons/admin.py index 7429598e5104..f8b7ad1dd662 100644 --- a/src/olympia/addons/admin.py +++ b/src/olympia/addons/admin.py @@ -176,18 +176,8 @@ def get_queryset(self, request): class AddonAdmin(AMOModelAdmin): class Media(AMOModelAdmin.Media): - css = { - 'all': ( - 'css/admin/amoadmin.css', - 'css/admin/l10n.css', - 'css/admin/pagination.css', - 'css/admin/addons.css', - ) - } - js = AMOModelAdmin.Media.js + ( - 'admin/js/jquery.init.js', - 'js/admin/l10n.js', - ) + css = {'all': ('css/admin-addon.css',)} + js = AMOModelAdmin.Media.js + ('js/admin-addon.js',) list_display = ( '__str__', diff --git a/src/olympia/amo/admin.py b/src/olympia/amo/admin.py index 1fc71257ee60..4c59f44fac37 100644 --- a/src/olympia/amo/admin.py +++ b/src/olympia/amo/admin.py @@ -180,12 +180,8 @@ def get_query_string(self, new_params=None, remove=None): class AMOModelAdmin(admin.ModelAdmin): class Media: - js = ( - 'js/admin/ip_address_search.js', - 'js/exports.js', - 'netmask/lib/netmask.js', - ) - css = {'all': ('css/admin/amoadmin.css',)} + js = ('js/admin.js',) + css = {'all': ('css/admin.css',)} # Classes that want to implement search by ip can override these if needed. search_by_ip_actions = () # Deactivated by default. diff --git a/src/olympia/blocklist/templates/admin/blocklist/blocklistsubmission_add_form.html b/src/olympia/blocklist/templates/admin/blocklist/blocklistsubmission_add_form.html index b60b5b9f9209..ac4e864779b3 100644 --- a/src/olympia/blocklist/templates/admin/blocklist/blocklistsubmission_add_form.html +++ b/src/olympia/blocklist/templates/admin/blocklist/blocklistsubmission_add_form.html @@ -2,8 +2,8 @@ {% load admin_urls static admin_modify %} {% block extrahead %}{{ block.super }} - - + +{{ vite_asset('js/blocklist_blocklistsubmission.js') }} {{ media }} {% endblock %} diff --git a/src/olympia/blocklist/templates/admin/blocklist/blocklistsubmission_change_form.html b/src/olympia/blocklist/templates/admin/blocklist/blocklistsubmission_change_form.html index fbd8a582aa0e..59fbed2910c3 100644 --- a/src/olympia/blocklist/templates/admin/blocklist/blocklistsubmission_change_form.html +++ b/src/olympia/blocklist/templates/admin/blocklist/blocklistsubmission_change_form.html @@ -2,7 +2,7 @@ {% load admin_urls static %} {% block admin_change_form_document_ready %} {{ block.super }} - +{{ vite_asset('js/blocklist_blocklistsubmission.js') }} {% endblock %} {% block submit_buttons_bottom %} diff --git a/src/olympia/blocklist/templates/admin/blocklist/multi_guid_input.html b/src/olympia/blocklist/templates/admin/blocklist/multi_guid_input.html index 79f6940cee3b..15d8b5228c0a 100644 --- a/src/olympia/blocklist/templates/admin/blocklist/multi_guid_input.html +++ b/src/olympia/blocklist/templates/admin/blocklist/multi_guid_input.html @@ -2,7 +2,7 @@ {% load admin_urls static admin_modify %} {% block extrahead %}{{ block.super }} - + {{ media }} {% endblock %} diff --git a/src/olympia/devhub/templates/devhub/base.html b/src/olympia/devhub/templates/devhub/base.html index 2d8f701942a8..a92f7a10f041 100644 --- a/src/olympia/devhub/templates/devhub/base.html +++ b/src/olympia/devhub/templates/devhub/base.html @@ -21,7 +21,7 @@ {% block title %}{{ dev_page_title() }}{% endblock %} {% block extrahead %} - {{ css('zamboni/devhub') }} + {{ vite_asset('css/devhub.less') }} {% endblock %} {% block site_header_title %} @@ -29,7 +29,7 @@ {% endblock %} {% block js %} - {{ js('zamboni/devhub') }} + {{ vite_asset('js/devhub.js') }} {% endblock %} {% block footer_extras %} diff --git a/src/olympia/devhub/templates/devhub/index.html b/src/olympia/devhub/templates/devhub/index.html index 1402492474c1..5a2c9b571b14 100644 --- a/src/olympia/devhub/templates/devhub/index.html +++ b/src/olympia/devhub/templates/devhub/index.html @@ -23,9 +23,9 @@ href="{{ url('amo.opensearch') }}" /> {% block site_css %} - {{ css('common/fonts') }} - {{ css('devhub/new-landing/css') }} - {{ css('common/footer') }} + {{ vite_asset('css/fonts.less') }} + {{ vite_asset('css/devhub-new-landing.less') }} + {{ vite_asset('css/footer.less') }} {% endblock %} {% block extrahead %}{% endblock %} @@ -35,13 +35,9 @@ {% endif %} {% if settings.DEV_MODE %} - {% if settings.LESS_LIVE_REFRESH %} - - {% endif %} - {{ js('debug') }} + {{ vite_hmr_client() }} {% endif %} - {{ js('jquery_base') }} {{ vite_asset('js/preload.js') }} {% set user_authenticated = request.user.is_authenticated %} @@ -81,7 +77,7 @@ {% block site_js %} - {{ js('devhub/new-landing/js') }} + {{ vite_asset('js/devhub-new-landing.js') }} {% endblock %} diff --git a/src/olympia/reviewers/templates/reviewers/base.html b/src/olympia/reviewers/templates/reviewers/base.html index ec5652a3c28b..9f611ed8849f 100644 --- a/src/olympia/reviewers/templates/reviewers/base.html +++ b/src/olympia/reviewers/templates/reviewers/base.html @@ -17,12 +17,12 @@

{% block header_search %}{% endblock %} {% block extrahead %} - {{ css('zamboni/devhub') }} - {{ css('zamboni/reviewers') }} + {{ vite_asset('css/devhub.less') }} + {{ vite_asset('css/reviewers.less') }} {% endblock %} {% block js %} - {{ js('zamboni/reviewers') }} + {{ vite_asset('js/reviewers.js') }} {% endblock %} {% block outer_content %} diff --git a/src/olympia/scanners/admin.py b/src/olympia/scanners/admin.py index a55cd220254f..4ccf0912f962 100644 --- a/src/olympia/scanners/admin.py +++ b/src/olympia/scanners/admin.py @@ -249,12 +249,7 @@ class AbstractScannerResultAdminMixin: ordering = ('-pk',) class Media(AMOModelAdmin.Media): - css = { - 'all': ( - 'css/admin/amoadmin.css', - 'css/admin/scannerresult.css', - ) - } + css = {'all': ('css/admin-scanner-results.css',)} def get_queryset(self, request): # We already set list_select_related() so we don't need to repeat that. @@ -759,7 +754,7 @@ class ScannerQueryResultAdmin(AbstractScannerResultAdminMixin, AMOModelAdmin): ordering = ('version__addon_id', 'version__channel', 'version__created') class Media(AbstractScannerResultAdminMixin.Media): - js = ('js/admin/scannerqueryresult.js',) + js = ('js/admin-scanner-query-result.js',) def addon_name(self, obj): # Custom, simpler implementation to go with add-on grouping: the diff --git a/src/olympia/scanners/templates/admin/scanners/scannerqueryrule/change_form.html b/src/olympia/scanners/templates/admin/scanners/scannerqueryrule/change_form.html index 0da659e32205..ceb294e9736e 100644 --- a/src/olympia/scanners/templates/admin/scanners/scannerqueryrule/change_form.html +++ b/src/olympia/scanners/templates/admin/scanners/scannerqueryrule/change_form.html @@ -5,6 +5,5 @@ {% block admin_change_form_document_ready %} {{ block.super }} - - + {{ vite_asset('js/scannerrule_change_form.js') }} {% endblock %} diff --git a/src/olympia/scanners/templates/admin/scanners/scannerrule/change_form.html b/src/olympia/scanners/templates/admin/scanners/scannerrule/change_form.html index 69c073d8e0fd..d063e162ab3c 100644 --- a/src/olympia/scanners/templates/admin/scanners/scannerrule/change_form.html +++ b/src/olympia/scanners/templates/admin/scanners/scannerrule/change_form.html @@ -3,6 +3,5 @@ {% block admin_change_form_document_ready %} {{ block.super }} - - + {{ vite_asset('js/scannerrule_change_form.js') }} {% endblock %} diff --git a/src/olympia/stats/templates/stats/stats.html b/src/olympia/stats/templates/stats/stats.html index 83c7500dac1d..b17737d3e3b1 100644 --- a/src/olympia/stats/templates/stats/stats.html +++ b/src/olympia/stats/templates/stats/stats.html @@ -7,9 +7,8 @@ {% block bodyclass %}statistics{% endblock %} {% block extrahead %} - {{ css('zamboni/stats') }} - + {{ vite_asset('css/stats.less') }} + {{ vite_asset('css/jquery-ui.less') }} {% endblock %} {% block title %} @@ -185,5 +184,6 @@

{% endblock %} {% block js %} -{{ js('zamboni/stats') }} +{{ vite_asset('js/stats.js') }} {% endblock %} +x diff --git a/src/olympia/templates/base.html b/src/olympia/templates/base.html index 44c3f842a27f..b92fd8743291 100644 --- a/src/olympia/templates/base.html +++ b/src/olympia/templates/base.html @@ -19,31 +19,29 @@ href="{{ url('amo.opensearch') }}" /> {% block site_css %} - {{ css('common/fonts') }} - {{ css('zamboni/css') }} - {{ css('common/footer') }} + {{ vite_asset('css/fonts.less') }} + {{ vite_asset('css/zamboni.less') }} + {{ vite_asset('css/footer.less') }} {% endblock %} {% block extrahead %}{% endblock %} {% block restyle %} - {{ css('restyle/css') }} + {{ vite_asset('css/restyle.less') }} {% endblock %} - + {% if settings.DEV_MODE %} - {% if settings.LESS_LIVE_REFRESH %} - - {% endif %} - {{ js('debug') }} + {{ vite_hmr_client() }} {% endif %} {% if user.is_authenticated %} {% endif %} - {{ js('jquery_base') }} {{ vite_asset('js/preload.js') }} {# js #} {% block site_js %} - - {{ js('common') }} + + {{ vite_asset('js/common.js') }} {% endblock %} {% block js %}{% endblock %} {% block footer %} diff --git a/src/olympia/users/templates/admin/users/denied_name/add_form.html b/src/olympia/users/templates/admin/users/denied_name/add_form.html index 992b39c6a759..9eea4893f64d 100644 --- a/src/olympia/users/templates/admin/users/denied_name/add_form.html +++ b/src/olympia/users/templates/admin/users/denied_name/add_form.html @@ -2,7 +2,8 @@ {% load admin_urls static admin_modify %} {% block extrahead %}{{ block.super }} - + +{{ vite_asset('js/users_deniedname.js') }} {{ media }} {% endblock %} diff --git a/static/css/admin-abuse-report.css b/static/css/admin-abuse-report.css new file mode 100644 index 000000000000..ecb725ce1c1b --- /dev/null +++ b/static/css/admin-abuse-report.css @@ -0,0 +1,2 @@ +@import url('./admin/amoadmin.css'); +@import url('./admin/abuse_reports.css'); diff --git a/static/css/admin-addon.css b/static/css/admin-addon.css new file mode 100644 index 000000000000..daa811a712d1 --- /dev/null +++ b/static/css/admin-addon.css @@ -0,0 +1,4 @@ +@import url('./admin/amoadmin.css'); +@import url('./admin/l10n.css'); +@import url('./admin/pagination.css'); +@import url('./admin/addons.css'); diff --git a/static/css/admin-scanner-results.css b/static/css/admin-scanner-results.css new file mode 100644 index 000000000000..0f0a14980c58 --- /dev/null +++ b/static/css/admin-scanner-results.css @@ -0,0 +1,2 @@ +@import url('./admin/amoadmin.css'); +@import url('./admin/scannerresult.css'); diff --git a/static/css/admin.css b/static/css/admin.css new file mode 100644 index 000000000000..327fe81c6fbc --- /dev/null +++ b/static/css/admin.css @@ -0,0 +1 @@ +@import url('./admin/amoadmin.css'); diff --git a/static/css/devhub-new-landing.less b/static/css/devhub-new-landing.less new file mode 100644 index 000000000000..a594ab61061b --- /dev/null +++ b/static/css/devhub-new-landing.less @@ -0,0 +1 @@ +@import './devhub/new-landing/base.less'; diff --git a/static/css/devhub.less b/static/css/devhub.less new file mode 100644 index 000000000000..a505ab0b1597 --- /dev/null +++ b/static/css/devhub.less @@ -0,0 +1,18 @@ +@import "./impala/tooltips.less"; +@import "./zamboni/developers.css"; +@import "./zamboni/docs.less"; +@import "./impala/developers.less"; +@import "./devhub/listing.less"; +@import "./devhub/popups.less"; +@import "./devhub/compat.less"; +@import "./impala/formset.less"; +@import "./devhub/forms.less"; +@import "./common/invisible-upload.less"; +@import "./devhub/submission.less"; +@import "./devhub/refunds.less"; +@import "./devhub/buttons.less"; +@import "./devhub/in-app-config.less"; +@import "./devhub/static-theme.less"; +@import "@claviska/jquery-minicolors/jquery.minicolors.css"; +@import "./impala/devhub-api.less"; +@import "./devhub/dashboard.less"; diff --git a/static/css/devhub/new-landing/sections/banner.less b/static/css/devhub/new-landing/sections/banner.less index 1fcd531bcab6..6fb35ae2b625 100644 --- a/static/css/devhub/new-landing/sections/banner.less +++ b/static/css/devhub/new-landing/sections/banner.less @@ -28,7 +28,7 @@ } .DevHub-callout-box--banner::before { - background: no-repeat bottom left url(../../../img/developers/new-landing/banner-background.svg); + background: no-repeat bottom left url(../../../../img/developers/new-landing/banner-background.svg); background-size: (@grid-max - (@side-margin *2)) auto; content: ''; position: absolute; diff --git a/static/css/devhub/new-landing/sections/connect.less b/static/css/devhub/new-landing/sections/connect.less index 952c3e17c958..28477ccec009 100644 --- a/static/css/devhub/new-landing/sections/connect.less +++ b/static/css/devhub/new-landing/sections/connect.less @@ -158,14 +158,16 @@ a.Before-Icon::before { } } +// TODO: fix this for some reason images are not being mapped by vite correctly +// additionally it looks like the import paths here were wrong already? a.Before-Icon-twitter::before { - content: url(../../../img/icons/twitter.svg); + content: url(../../../../img/icons/twitter.svg); } a.Before-Icon-matrix::before { - content: url(../../../img/icons/matrix.svg); + content: url(../../../../img/icons/matrix.svg); } a.Before-Icon-mail::before { - content: url(../../../img/icons/mail.svg); + content: url(../../../../img/icons/mail.svg); } diff --git a/static/css/fonts.less b/static/css/fonts.less new file mode 100644 index 000000000000..55da91deb360 --- /dev/null +++ b/static/css/fonts.less @@ -0,0 +1 @@ +@import './common/fonts.less'; diff --git a/static/css/footer.less b/static/css/footer.less new file mode 100644 index 000000000000..1722a986ef28 --- /dev/null +++ b/static/css/footer.less @@ -0,0 +1 @@ +@import './common//footer.less'; diff --git a/static/css/jquery-ui.less b/static/css/jquery-ui.less new file mode 100644 index 000000000000..246192953f77 --- /dev/null +++ b/static/css/jquery-ui.less @@ -0,0 +1 @@ +@import './zamboni/jquery-ui/custom-1.7.2.css'; diff --git a/static/css/nojs.less b/static/css/nojs.less new file mode 100644 index 000000000000..2501af8c6712 --- /dev/null +++ b/static/css/nojs.less @@ -0,0 +1 @@ +@import './legacy//nojs.css'; diff --git a/static/css/restyle.less b/static/css/restyle.less new file mode 100644 index 000000000000..d5416839a585 --- /dev/null +++ b/static/css/restyle.less @@ -0,0 +1 @@ +@import './restyle/restyle.less'; diff --git a/static/css/reviewers.less b/static/css/reviewers.less new file mode 100644 index 000000000000..0ac99365db9e --- /dev/null +++ b/static/css/reviewers.less @@ -0,0 +1,2 @@ +@import "./zamboni/reviewers.less"; +@import "./zamboni/unlisted.less"; diff --git a/static/css/stats.less b/static/css/stats.less new file mode 100644 index 000000000000..17c4852496cc --- /dev/null +++ b/static/css/stats.less @@ -0,0 +1 @@ +@import './zamboni/stats.less'; diff --git a/static/css/zamboni.less b/static/css/zamboni.less new file mode 100644 index 000000000000..ff269cea3c20 --- /dev/null +++ b/static/css/zamboni.less @@ -0,0 +1,11 @@ +@import "./legacy/main.css"; +@import "./legacy/main-mozilla.css"; +@import "./zamboni/zamboni.css"; +@import "./zamboni/tags.css"; +@import "./zamboni/tabs.css"; +@import "./impala/buttons.less"; +@import "./impala/formset.less"; +@import "./impala/suggestions.less"; +@import "./impala/header.less"; +@import "./impala/moz-tab.css"; +@import "./impala/faux-zamboni.less"; diff --git a/static/js/admin-addon.js b/static/js/admin-addon.js new file mode 100644 index 000000000000..cbe027b7ee3b --- /dev/null +++ b/static/js/admin-addon.js @@ -0,0 +1 @@ +import './admin/l10n.js'; diff --git a/static/js/admin-scanner-query-result.js b/static/js/admin-scanner-query-result.js new file mode 100644 index 000000000000..cbf557d5a9c2 --- /dev/null +++ b/static/js/admin-scanner-query-result.js @@ -0,0 +1 @@ +import './admin/scannerqueryresult'; diff --git a/static/js/admin.js b/static/js/admin.js new file mode 100644 index 000000000000..5e5a1aa04162 --- /dev/null +++ b/static/js/admin.js @@ -0,0 +1 @@ +import './admin/ip_address_search.js'; diff --git a/static/js/admin/blocklist_blocklistsubmission.js b/static/js/admin/blocklist_blocklistsubmission.js index 418f68328c7b..ef9776288af9 100644 --- a/static/js/admin/blocklist_blocklistsubmission.js +++ b/static/js/admin/blocklist_blocklistsubmission.js @@ -1,6 +1,4 @@ document.addEventListener('DOMContentLoaded', () => { - 'use strict'; - const checkOrClearAllCheckboxes = (event) => { event.target.parentElement .querySelectorAll(`input[name="changed_version_ids"]`) diff --git a/static/js/admin/ip_address_search.js b/static/js/admin/ip_address_search.js index 2e48930b57d0..d4781bab9d8e 100644 --- a/static/js/admin/ip_address_search.js +++ b/static/js/admin/ip_address_search.js @@ -1,13 +1,11 @@ -document.addEventListener('DOMContentLoaded', () => { - 'use strict'; +import { Netmask } from 'netmask'; +document.addEventListener('DOMContentLoaded', () => { /* Those variables are used in the functions below, and initialized a bit later if we're on a userprofile changelist page */ - var search_bar; - var original_search_terms; - var ip_fields; - - const Netmask = exports.Netmask; + let search_bar; + let original_search_terms; + let ip_fields; function are_set_equal(a, b) { /** Return whether or not two sets contains the same values. */ diff --git a/static/js/admin/l10n.js b/static/js/admin/l10n.js index 370dcb1d756e..60a23a6e8418 100644 --- a/static/js/admin/l10n.js +++ b/static/js/admin/l10n.js @@ -7,7 +7,7 @@ * Uses django.jQuery as it's meant as a companion to the django admin. */ -django.jQuery(document).ready(function ($) { +window.django.jQuery(document).ready(function ($) { if (!$('body.change-form').length) { // This is only for change forms. return; diff --git a/static/js/admin/scannerqueryresult.js b/static/js/admin/scannerqueryresult.js index 7ac8323ecefd..a2a9c5a88c1c 100644 --- a/static/js/admin/scannerqueryresult.js +++ b/static/js/admin/scannerqueryresult.js @@ -1,6 +1,4 @@ document.addEventListener('DOMContentLoaded', () => { - 'use strict'; - const result_list = document.querySelector( 'body.change-list.model-scannerqueryresult #result_list', ); diff --git a/static/js/blocklist_blocklistsubmission.js b/static/js/blocklist_blocklistsubmission.js new file mode 100644 index 000000000000..72f03946d86e --- /dev/null +++ b/static/js/blocklist_blocklistsubmission.js @@ -0,0 +1 @@ +import './admin/blocklist_blocklistsubmission'; diff --git a/static/js/common.js b/static/js/common.js new file mode 100644 index 000000000000..8f41361fb81c --- /dev/null +++ b/static/js/common.js @@ -0,0 +1,7 @@ +import './zamboni/init'; +import './zamboni/helpers'; +import './zamboni/global'; +import './zamboni/l10n'; +import './zamboni/unicode'; +import './zamboni/users'; +import './common/lang_switcher'; diff --git a/static/js/common/lang_switcher.js b/static/js/common/lang_switcher.js index 6ebbeaac833d..33d15e74f399 100644 --- a/static/js/common/lang_switcher.js +++ b/static/js/common/lang_switcher.js @@ -1,3 +1,5 @@ +import $ from 'jquery'; + /* Remove "Go" buttons from
', { + class: 'invisible-upload prominent cta', + id: 'upload-file-widget', + }), + ui_link = $('', { + class: 'button prominent', + href: '#', + text: gettext('Select a file...'), + }), + ui_details = $('
', { + class: 'upload-details', + text: gettext('Your add-on should end with .zip, .xpi or .crx'), + }); - var ui_parent = $('
', { - class: 'invisible-upload prominent cta', - id: 'upload-file-widget', - }), - ui_link = $('', { - class: 'button prominent', - href: '#', - text: gettext('Select a file...'), - }), - ui_details = $('
', { - class: 'upload-details', - text: gettext('Your add-on should end with .zip, .xpi or .crx'), - }); + ui_link.toggleClass('disabled', settings.submissionsDisabled); + $upload_field.prop('disabled', settings.submissionsDisabled); - ui_link.toggleClass('disabled', settings.submissionsDisabled); - $upload_field.prop('disabled', settings.submissionsDisabled); + $upload_field.wrap(ui_parent); + $upload_field.before(ui_link); + $upload_field.parent().after(ui_details); - $upload_field.wrap(ui_parent); - $upload_field.before(ui_link); - $upload_field.parent().after(ui_details); + if (!capabilities.fileAPI) { + $('.invisible-upload').addClass('legacy'); + } - if (!z.capabilities.fileAPI) { - $('.invisible-upload').addClass('legacy'); + /* Get things started */ + + let upload_box, + upload_title, + upload_progress_outside, + upload_progress_inside, + upload_status, + upload_results, + upload_status_percent, + upload_status_progress, + upload_status_cancel, + upload_status_cancel_a; + + $upload_field.fileUploader(settings); + + function updateStatus(percentage, size) { + if (percentage) { + upload_status.show(); + const p = Math.round(percentage); + size = (p / 100) * size; + + // L10n: {0} is the percent of the file that has been uploaded. + upload_status_percent.text(format(gettext('{0}% complete'), [p])); + + // L10n: "{bytes uploaded} of {total filesize}". + upload_status_progress.text( + format(gettext('{0} of {1}'), [ + formatFileSize(size), + formatFileSize(file.size), + ]), + ); } + } - /* Get things started */ - - var upload_box, - upload_title, - upload_progress_outside, - upload_progress_inside, - upload_status, - upload_results, - upload_status_percent, - upload_status_progress, - upload_status_cancel; - - $upload_field.fileUploader(settings); - - function updateStatus(percentage, size) { - if (percentage) { - upload_status.show(); - p = Math.round(percentage); - size = (p / 100) * size; - - // L10n: {0} is the percent of the file that has been uploaded. - upload_status_percent.text(format(gettext('{0}% complete'), [p])); - - // L10n: "{bytes uploaded} of {total filesize}". - upload_status_progress.text( - format(gettext('{0} of {1}'), [ - formatFileSize(size), - formatFileSize(file.size), - ]), - ); - } - } + /* Bind the events */ - /* Bind the events */ + $upload_field.on('upload_start', function (e, _file) { + file = _file; - $upload_field.on('upload_start', function (e, _file) { - file = _file; + /* Remove old upload box */ + if (upload_box) { + upload_box.remove(); + } - /* Remove old upload box */ - if (upload_box) { - upload_box.remove(); - } + /* Remove old errors */ + $upload_field.closest('form').find('.errorlist').remove(); + + /* Set defaults */ + $('#id_is_manual_review').prop('checked', false); + + /* Don't allow submitting */ + // The create theme wizard button is actually a link, + // so it's pointless to set the disabled property on it, + // instead add the special "concealed" class. + $('.addon-create-theme-section .button').addClass('concealed'); + $('.addon-upload-dependant').prop('disabled', true); + $('.addon-upload-failure-dependant').prop({ + disabled: true, + checked: false, + }); - /* Remove old errors */ - $upload_field.closest('form').find('.errorlist').remove(); + /* Create elements */ + upload_title = $('', { id: 'upload-status-text' }); + upload_progress_outside = $('
', { id: 'upload-status-bar' }); + upload_progress_inside = $('
').css('width', 0); + upload_status = $('
', { id: 'uploadstatus' }).hide(); + upload_status_percent = $(''); + upload_status_progress = $(''); + upload_status_cancel_a = $('', { + href: '#', + text: gettext('Cancel'), + }); + upload_status_cancel = $(' · '); + upload_results = $('
', { id: 'upload-status-results' }); + upload_box = $('
', { class: 'upload-status ajax-loading' }).hide(); + + /* Set up structure */ + upload_box.append(upload_title); + upload_progress_outside.append(upload_progress_inside); + upload_box.append(upload_progress_outside); + upload_status.append(upload_status_percent); + upload_status.append(' · '); + upload_status.append(upload_status_progress); + upload_status.append(upload_status_cancel); + upload_status_cancel.append(upload_status_cancel_a); + + upload_box.append(upload_status); + upload_box.append(upload_results); + + /* Add to the dom and clean up upload_field */ + ui_details.after(upload_box); + + /* It's showtime! */ + upload_title.html(format(gettext('Uploading {0}'), [escape_(file.name)])); + upload_box.show(); + + upload_box.addClass('ajax-loading'); + + upload_status_cancel_a.click( + _pd(function () { + $upload_field.trigger('upload_action_abort'); + }), + ); + }); + + $upload_field.on('upload_progress', function (e, file, pct) { + upload_progress_inside.animate( + { width: pct + '%' }, + { + duration: 300, + step: function (i) { + updateStatus(i, file.size); + }, + }, + ); + }); - /* Set defaults */ - $('#id_is_manual_review').prop('checked', false); + $upload_field.on('upload_errors', function (e, file, errors, results) { + let all_errors = $.extend([], errors); // be nice to other handlers + upload_progress_inside.stop().css({ width: '100%' }); - /* Don't allow submitting */ - // The create theme wizard button is actually a link, - // so it's pointless to set the disabled property on it, - // instead add the special "concealed" class. - $('.addon-create-theme-section .button').addClass('concealed'); - $('.addon-upload-dependant').prop('disabled', true); + if ($('input#id_upload').val()) { $('.addon-upload-failure-dependant').prop({ - disabled: true, + disabled: false, checked: false, }); + } - /* Create elements */ - upload_title = $('', { id: 'upload-status-text' }); - upload_progress_outside = $('
', { id: 'upload-status-bar' }); - upload_progress_inside = $('
').css('width', 0); - upload_status = $('
', { id: 'uploadstatus' }).hide(); - upload_status_percent = $(''); - upload_status_progress = $(''); - upload_status_cancel_a = $('', { - href: '#', - text: gettext('Cancel'), - }); - upload_status_cancel = $(' · '); - upload_results = $('
', { id: 'upload-status-results' }); - upload_box = $('
', { class: 'upload-status ajax-loading' }).hide(); - - /* Set up structure */ - upload_box.append(upload_title); - upload_progress_outside.append(upload_progress_inside); - upload_box.append(upload_progress_outside); - upload_status.append(upload_status_percent); - upload_status.append(' · '); - upload_status.append(upload_status_progress); - upload_status.append(upload_status_cancel); - upload_status_cancel.append(upload_status_cancel_a); - - upload_box.append(upload_status); - upload_box.append(upload_results); - - /* Add to the dom and clean up upload_field */ - ui_details.after(upload_box); - - /* It's showtime! */ - upload_title.html( - format(gettext('Uploading {0}'), [escape_(file.name)]), - ); - upload_box.show(); - - upload_box.addClass('ajax-loading'); - - upload_status_cancel_a.click( - _pd(function () { - $upload_field.trigger('upload_action_abort'); - }), - ); - }); + $('.addon-create-theme-section .button').removeClass('concealed'); + $upload_field.val('').prop('disabled', false); + $upload_field.trigger('reenable_uploader'); - $upload_field.on('upload_progress', function (e, file, pct) { - upload_progress_inside.animate( - { width: pct + '%' }, - { - duration: 300, - step: function (i) { - updateStatus(i, file.size); - }, - }, - ); - }); + upload_title.html( + format(gettext('Error with {0}'), [escape_(file.name)]), + ); - $upload_field.on('upload_errors', function (e, file, errors, results) { - var all_errors = $.extend([], errors); // be nice to other handlers - upload_progress_inside.stop().css({ width: '100%' }); + upload_progress_outside.attr('class', 'bar-fail'); + upload_progress_inside.fadeOut(); - if ($('input#id_upload').val()) { - $('.addon-upload-failure-dependant').prop({ - disabled: false, - checked: false, - }); - } + $('') + .text( + gettext( + 'Please make sure to report any linting related issues on GitHub', + ), + ) + .attr('href', 'https://github.com/mozilla/addons-linter/') + .attr('class', 'addons-linter-info') + .attr('target', '_blank') + .attr('rel', 'noopener noreferrer') + .appendTo(upload_results); + + let error_message = format( + ngettext( + 'Your add-on failed validation with {0} error.', + 'Your add-on failed validation with {0} errors.', + all_errors.length, + ), + [all_errors.length], + ); - $('.addon-create-theme-section .button').removeClass('concealed'); - $upload_field.val('').prop('disabled', false); - $upload_field.trigger('reenable_uploader'); + $('').text(error_message).appendTo(upload_results); - upload_title.html( - format(gettext('Error with {0}'), [escape_(file.name)]), - ); + let errors_ul = $('