Skip to content

Move away from jQuery and jQuery UI #12980

Closed

Description

@rullzer

jQuery is deprecated for over 10 versions of Nextcloud, its time to remove jQuery and especially jQuery UI.
We use Vue for the UI nowadays.

To do

As of Nextcloud 33

Original request:

Details

From #11718 (comment)

@nextcloud/javascript if you want to standardize more and have cleanup legacy code. Baby steps is probably best.

$.widget

  • ./core/js/jquery.ocdialog.js
    2: $.widget('oc.ocdialog', {

  • ./apps/files/js/jquery.fileupload.js
    87: $.widget('blueimp.fileupload', {

  • ./core/vendor/core.js
    13:[Omitted long line with 24 matches]

  • ./apps/user_ldap/vendor/ui-multiselect/src/jquery.multiselect.js
    25:$.widget("ech.multiselect", {

$.datepicker

$.ui.

  • ./apps/files/js/jquery.fileupload.js
    21: 'jquery.ui.widget'
    27: require('./vendor/jquery.ui.widget')

  • ./core/js/jquery/ui-fixes.js
    5:jQuery.ui.autocomplete.prototype._resizeMenu = function () {

  • ./apps/user_ldap/vendor/ui-multiselect/src/jquery.multiselect.js
    562: if( $.ui.position && !$.isEmptyObject(o.position) ){

$.autocomplete

  • ./core/js/sharedialogview.js

$.progressbar

  • ./apps/files/js/file-upload.js
    1084: $('#uploadprogressbar').progressbar({value: 0});
    1150: $('#uploadprogressbar').progressbar('value', progress);

$.datepicker

  • ./core/js/sharedialoglinkshareview.js
  • ./core/js/sharedialogshareelistview.js

$.tooltip

./apps/updatenotification/js/updatenotification.js
1:[Omitted long line with 1 matches]

./apps/files_sharing/js/files_drop.js
68: $('[data-toggle="tooltip"]').tooltip();
76: $('[data-toggle="tooltip"]').tooltip();

./apps/files_sharing/js/sharedfilelist.js
124: .tooltip({placement: 'top'})

./apps/files/js/file-upload.js
992: $('#upload').tooltip('hide');
1091: $('#uploadprogressbar').tooltip({placement: 'bottom'});

./apps/files/js/app.js
130: $('#quota.has-tooltip').tooltip({

./apps/files/js/mainfileinfodetailview.js
73: $el.tooltip('hide')
75: .tooltip('fixTitle')
76: .tooltip({placement: 'bottom', trigger: 'manual'})
77: .tooltip('show');
79: $el.tooltip('hide');
81: .tooltip('fixTitle');
191: this.$el.find('[title]').tooltip({placement: 'bottom'});

./apps/files/js/newfilemenu.js
135: $input.tooltip({placement: 'right', trigger: 'manual', 'container': '.newFileMenu'});
136: $input.tooltip('fixTitle');
137: $input.tooltip('show');
146: $input.tooltip('hide');

./apps/files/js/files.js
317: $('#upload').tooltip({placement:'right'});

./apps/files/js/fileactions.js
433: $actionEl.tooltip({placement:'top'});

./apps/comments/js/commentstabview.js
115: this.$el.find('.has-tooltip').tooltip();
341: $el.find('.has-tooltip').tooltip();
481: $formRow.find('.has-tooltip').tooltip();
508: $field.tooltip('hide');
511: $field.tooltip({trigger: 'manual'});
512: $field.tooltip('show');

./apps/files/js/filelist.js
1369: nameSpan.tooltip({placement: 'top'});
1422: .tooltip({placement: 'top'})
2335: input.tooltip('hide');
2356: input.tooltip('hide');
2416: input.tooltip({placement: 'right', trigger: 'manual'});
2417: input.tooltip('fixTitle');
2418: input.tooltip('show');
2427: input.tooltip('hide');
2431: input.tooltip({placement: 'right', trigger: 'manual'});
2432: input.tooltip('fixTitle');
2433: input.tooltip('show');
3299: $newButton.tooltip({'placement': 'bottom'});
3310: this._newButton.tooltip('hide');

./apps/comments/js/filesplugin.js
105: context.$file.find('.action-comment').tooltip('hide');

./apps/updatenotification/js/updatenotification.js.map
1:[Omitted long line with 1 matches]

./core/js/contactsmenu.js
168: this.$('.top-action').tooltip({placement: 'left'});
170: this.$('.second-action').tooltip({placement: 'left'});

./core/js/backgroundjobs.js
26: $('.section .icon-info').tooltip({

./core/js/js.js
2413: this.tooltip(argument);

./apps/files_versions/js/versionstabview.js
145: $el.find('.has-tooltip').tooltip();
194: this.$el.find('.has-tooltip').tooltip();

./apps/files_external/js/settings.js
1265: $statusSpan.tooltip();
1267: $statusSpan.tooltip('destroy');

./apps/federatedfilesharing/js/settings-personal.js
24: $('#personal-settings-container .verify img').tooltip({placement: 'bottom', trigger: 'hover'});
26:[Omitted long line with 1 matches]
32: $input.tooltip('hide')
34: .tooltip('fixTitle')
35: .tooltip({placement: 'bottom', trigger: 'manual'})
36: .tooltip('show');
38: $input.tooltip('hide')
40: .tooltip('fixTitle');
54: $input.tooltip('hide')
56: .tooltip('fixTitle')
57: .tooltip({placement: 'bottom', trigger: 'manual'})
58: .tooltip('show');
60: $input.tooltip('hide')
62: .tooltip('fixTitle');
67: $('#fileSharingSettings .hasTooltip').tooltip({placement: 'right'});

./apps/theming/js/settings-admin.js
107: $('#theming [data-toggle="tooltip"]').tooltip();
165: $('#theming-name').tooltip({placement: 'top', trigger: 'manual'});
166: $('#theming-name').tooltip('fixTitle');
167: $('#theming-name').tooltip('show');
175: $('#theming-name').tooltip('hide');

./apps/user_ldap/js/wizard/view.js
357: $('#ldapSettings :input').tooltip({placement: "right", container: "body", trigger: "hover"});

./settings/js/certificates.js
16: $('#sslCertificate tr > td').tooltip({placement: 'bottom', container: 'body'});

./apps/updatenotification/src/components/root.vue
359: this._$el.find('.icon-info').tooltip({placement: 'right'});

./settings/js/authtoken_view.js
62: $html.find('.has-tooltip').tooltip({container: 'body'});
234:[Omitted long line with 1 matches]
240: $input.tooltip('hide')
242: .tooltip('fixTitle')
243: .tooltip({placement: 'bottom', trigger: 'manual'})
244: .tooltip('show');
246: $input.tooltip('hide')
248: .tooltip('fixTitle');
262: $input.tooltip('hide')
264: .tooltip('fixTitle')
265: .tooltip({placement: 'bottom', trigger: 'manual'})
266: .tooltip('show');
268: $input.tooltip('hide')
270: .tooltip('fixTitle');
381: $row.find('.icon-delete').tooltip('hide');

./settings/js/admin.js
18: $('#backgroundjobs span.crondate').tooltip({placement: 'top'});

./core/js/systemtags/systemtagsinputfield.js
121: $renameForm.find('[title]').tooltip({
162: $(ev.target).tooltip('hide');
359: this.$el.find('[title]').tooltip({placement: 'bottom'});

./core/vendor/strengthify/jquery.strengthify.js
157: ).tooltip({
160: }).tooltip(
162: ).tooltip(
167: $wrapper.tooltip(

$.position

./core/js/jquery.ocdialog.js
2: $.widget('oc.ocdialog', {

./apps/files/js/jquery.fileupload.js
87: $.widget('blueimp.fileupload', {

./core/vendor/core.js
13:[Omitted long line with 24 matches]

./apps/user_ldap/vendor/ui-multiselect/src/jquery.multiselect.js
25:$.widget("ech.multiselect", {
[christoph@christoph-workstation nextcloud]$ rg '.position(' . --ignore-vcs --max-columns 100
./core/js/multiselect.js
196: var pos=button.position();
269: list.css('top', list.position().top-li.outerHeight());
306: var pos=button.position();

./core/search/js/searchprovider.js
190: $searchResults.position() &&
191: $searchResults.position().top + summaryAndStatusHeight >

./core/vendor/core.js
4:[Omitted long line with 2 matches]
13:[Omitted long line with 10 matches]

./apps/user_ldap/vendor/ui-multiselect/src/jquery.multiselect.js
567: .position( o.position )

./apps/comments/js/vendor/Caret.js/dist/jquery.caret.min.js
2:[Omitted long line with 1 matches]

./core/vendor/jquery/dist/jquery.min.js
4:[Omitted long line with 2 matches]

./core/vendor/jquery/dist/jquery.js
8942: curPosition = curElem.position();
9096: jQuery( elem ).position()[ prop ] + "px" 👍

Activity

  1. added and removed
    1. to developAccepted and waiting to be taken care of
    on Sep 27, 2024
  2. moved this from To triage to Confirmed in 🧑‍🤝‍🧑 Community triageon Apr 16, 2025
  3. changed the issue type fromtoon Apr 16, 2025
  4. changed the issue type fromtoon Aug 11, 2025
  5. changed the title [-]Move away from jquery-ui[/-] [+]Move away from jQuery and jQuery UI[/+] on Jan 12, 2026
  6. moved this from Confirmed to In progress in 🧑‍🤝‍🧑 Community triageon Jan 13, 2026
  7. added this to the Nextcloud 34 milestone on Jan 16, 2026
  8. self-assigned this
    on Jan 16, 2026
  9. rullzer commented on Feb 18, 2026

    @rullzer
    MemberAuthor
    Image I was so young and full of hope back then.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions