diff --git a/djblets/static/djblets/js/integrations/views/integrationConfigListView.ts b/djblets/static/djblets/js/integrations/views/integrationConfigListView.ts
index 226cbae5de5f0faf3858e927cac66e6802d3150b..23b1be2c34abef867cd51f74f30c7d5a1ea6e04d 100644
--- a/djblets/static/djblets/js/integrations/views/integrationConfigListView.ts
+++ b/djblets/static/djblets/js/integrations/views/integrationConfigListView.ts
@@ -2,6 +2,10 @@
  * View for managing the integration configurations list.
  */
 
+import {
+    type DialogView,
+    craft,
+} from '@beanbag/ink';
 import {
     type EventsHash,
     type Result,
@@ -155,28 +159,59 @@ class IntegrationConfigItemView extends ConfigFormsTableItemView {
      * This will display a confirmation dialog, and then send an HTTP DELETE
      * to remove the configuration.
      */
-    _onDeleteClicked() {
-        $('<p>')
-            .text(_`
-                This integration will be permanently removed. This cannot
-                be undone.
-            `)
-            .modalBox({
-                buttons: [
-                    $('<button>')
-                        .text(_`Cancel`),
-                    $('<button class="danger">')
-                        .text(_`Delete Integration`)
-                        .click(() => this.model.destroy({
-                            beforeSend: xhr => {
-                                xhr.setRequestHeader(
-                                    'X-CSRFToken',
-                                    this.model.collection.options.csrfToken);
-                            },
-                        })),
-                ],
-                title: _`Are you sure you want to delete this integration?`,
-            });
+    _onDeleteClicked(): Promise<void> {
+        return new Promise(resolve => {
+            const title = _`Are you sure you want to delete this integration?`;
+            let dlg: DialogView = null;
+
+            const onDelete = async () => {
+                await this._onDeleteConfirmed();
+            };
+
+            const onClose = () => {
+                resolve();
+                dlg.remove();
+            };
+
+            dlg = craft<DialogView>`
+                <Ink.Dialog title="${title}" onClose="${() => onClose()}">
+                 <Ink.Dialog.Body>
+                  ${_`
+                   This integration will be permanently removed. This cannot
+                   be undone.
+                  `}
+                 </Ink.Dialog.Body>
+                 <Ink.Dialog.PrimaryActions>
+                  <Ink.DialogAction type="danger"
+                                    action="callback-and-close"
+                                    callback=${onDelete}>
+                   ${_`Delete Integration`}
+                  </Ink.DialogAction>
+                  <Ink.DialogAction action="close">
+                   ${_`Cancel`}
+                  </Ink.Button>
+                 </Ink.Dialog.PrimaryActions>
+                </Ink.Dialog>
+            `;
+
+            dlg.open();
+        });
+    }
+
+    /**
+     * Delete the underlying model.
+     *
+     * Version Added:
+     *     6.0
+     */
+    async _onDeleteConfirmed() {
+        await this.model.destroy({
+            beforeSend: xhr => {
+                xhr.setRequestHeader(
+                    'X-CSRFToken',
+                    this.model.collection.options.csrfToken);
+            },
+        });
     }
 }
 
diff --git a/djblets/static/djblets/js/integrations/views/tests/integrationConfigListViewTests.ts b/djblets/static/djblets/js/integrations/views/tests/integrationConfigListViewTests.ts
index 33ab297358b4a0d1710156942dfd4a9bd7bc0c8f..3ad8753d579dd00ec54e0c1644dd5146eb5827fc 100644
--- a/djblets/static/djblets/js/integrations/views/tests/integrationConfigListViewTests.ts
+++ b/djblets/static/djblets/js/integrations/views/tests/integrationConfigListViewTests.ts
@@ -203,21 +203,15 @@ suite('djblets/integrations/views/IntegrationConfigListView', function() {
             });
         });
 
-        describe('Actions', function() {
-            it('Delete', function() {
+        describe('Actions', () => {
+            it('Delete', async () => {
                 const config = collection.at(0);
-
                 spyOn(config, 'destroy').and.callThrough();
                 spyOn(config, 'sync');
 
-                spyOn($.fn, 'modalBox').and.callFake(
-                    options => options.buttons[1].click());
+                await view.listView.views[0]._onDeleteConfirmed();
 
-                $row1.find('.config-forms-list-action-delete').click();
-
-                expect($.fn.modalBox).toHaveBeenCalled();
                 expect(config.destroy).toHaveBeenCalled();
-
                 expect(collection.length).toBe(3);
                 expect(view.listView.$('tr').length).toBe(3);
             });
diff --git a/rollup.config.js b/rollup.config.js
index 32c5f6c02417915a01e09970ea1aca1925fe4b47..ac02a4548dfd28e57972d93d50bf4002e92b3416 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -11,6 +11,7 @@ const extensions = [
 
 
 const globalsMap = {
+    '@beanbag/ink': 'Ink',
     '@beanbag/jasmine-suites': 'window',
     '@beanbag/spina': 'Spina',
     backbone: 'Backbone',
