Skip to content

Commit 15156fd

Browse files
committed
feat: Respect djangocms-text configuration
1 parent 414c4d3 commit 15156fd

File tree

7 files changed

+6350
-4685
lines changed

7 files changed

+6350
-4685
lines changed

package-lock.json

Lines changed: 5436 additions & 4632 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -21,52 +21,52 @@
2121
"css-loader": "^7.1.2",
2222
"css-minimizer-webpack-plugin": "^7.0.0",
2323
"html-webpack-plugin": "^5.6.3",
24-
"mini-css-extract-plugin": "^2.9.1",
24+
"mini-css-extract-plugin": "^2.9.2",
2525
"npm-upgrade": "^3.1.0",
26-
"postcss": "^8.4.47",
26+
"postcss": "^8.4.49",
2727
"postcss-import": "^16.1.0",
2828
"postcss-loader": "^8.1.1",
29-
"postcss-nested": "^6.2.0",
30-
"sass": "^1.80.5",
31-
"sass-loader": "^16.0.2",
32-
"slim-select": "^2.9.2",
29+
"postcss-nested": "^7.0.2",
30+
"sass": "^1.83.0",
31+
"sass-loader": "^16.0.4",
32+
"slim-select": "^2.10.0",
3333
"source-map-loader": "^5.0.0",
3434
"style-loader": "^4.0.0",
35-
"webpack": "^5.95.0",
35+
"webpack": "^5.97.1",
3636
"webpack-cli": "^5.1.4"
3737
},
3838
"dependencies": {
39-
"@ckeditor/ckeditor5-adapter-ckfinder": "^43.1.1",
40-
"@ckeditor/ckeditor5-alignment": "^43.1.1",
41-
"@ckeditor/ckeditor5-autoformat": "^43.1.1",
42-
"@ckeditor/ckeditor5-autosave": "^43.1.1",
43-
"@ckeditor/ckeditor5-basic-styles": "^43.1.1",
44-
"@ckeditor/ckeditor5-block-quote": "^43.1.1",
45-
"@ckeditor/ckeditor5-ckfinder": "^43.1.1",
46-
"@ckeditor/ckeditor5-cloud-services": "^43.1.1",
47-
"@ckeditor/ckeditor5-code-block": "^43.1.1",
48-
"@ckeditor/ckeditor5-dev-utils": "^43.0.0",
49-
"@ckeditor/ckeditor5-easy-image": "^43.1.1",
50-
"@ckeditor/ckeditor5-editor-balloon": "^43.1.1",
51-
"@ckeditor/ckeditor5-editor-classic": "^43.1.1",
52-
"@ckeditor/ckeditor5-editor-inline": "^43.1.1",
53-
"@ckeditor/ckeditor5-essentials": "^43.1.1",
54-
"@ckeditor/ckeditor5-font": "^43.1.1",
55-
"@ckeditor/ckeditor5-heading": "^43.1.1",
56-
"@ckeditor/ckeditor5-highlight": "^43.1.1",
57-
"@ckeditor/ckeditor5-horizontal-line": "^43.1.1",
58-
"@ckeditor/ckeditor5-image": "^43.1.1",
59-
"@ckeditor/ckeditor5-indent": "^43.1.1",
60-
"@ckeditor/ckeditor5-link": "^43.1.1",
61-
"@ckeditor/ckeditor5-list": "^43.1.1",
62-
"@ckeditor/ckeditor5-media-embed": "^43.1.1",
63-
"@ckeditor/ckeditor5-paragraph": "^43.1.1",
64-
"@ckeditor/ckeditor5-paste-from-office": "^43.1.1",
65-
"@ckeditor/ckeditor5-source-editing": "^43.1.1",
66-
"@ckeditor/ckeditor5-table": "^43.1.1",
67-
"@ckeditor/ckeditor5-theme-lark": "^43.1.1",
68-
"@ckeditor/ckeditor5-typing": "^43.1.1",
69-
"@ckeditor/ckeditor5-upload": "^43.1.1",
39+
"@ckeditor/ckeditor5-adapter-ckfinder": "^44.0.0",
40+
"@ckeditor/ckeditor5-alignment": "^44.0.0",
41+
"@ckeditor/ckeditor5-autoformat": "^44.0.0",
42+
"@ckeditor/ckeditor5-autosave": "^44.0.0",
43+
"@ckeditor/ckeditor5-basic-styles": "^44.0.0",
44+
"@ckeditor/ckeditor5-block-quote": "^44.0.0",
45+
"@ckeditor/ckeditor5-ckfinder": "^44.0.0",
46+
"@ckeditor/ckeditor5-cloud-services": "^44.0.0",
47+
"@ckeditor/ckeditor5-code-block": "^44.0.0",
48+
"@ckeditor/ckeditor5-dev-utils": "^43.0.1",
49+
"@ckeditor/ckeditor5-easy-image": "^44.0.0",
50+
"@ckeditor/ckeditor5-editor-balloon": "^44.0.0",
51+
"@ckeditor/ckeditor5-editor-classic": "^44.0.0",
52+
"@ckeditor/ckeditor5-editor-inline": "^44.0.0",
53+
"@ckeditor/ckeditor5-essentials": "^44.0.0",
54+
"@ckeditor/ckeditor5-font": "^44.0.0",
55+
"@ckeditor/ckeditor5-heading": "^44.0.0",
56+
"@ckeditor/ckeditor5-highlight": "^44.0.0",
57+
"@ckeditor/ckeditor5-horizontal-line": "^44.0.0",
58+
"@ckeditor/ckeditor5-image": "^44.0.0",
59+
"@ckeditor/ckeditor5-indent": "^44.0.0",
60+
"@ckeditor/ckeditor5-link": "^44.0.0",
61+
"@ckeditor/ckeditor5-list": "^44.0.0",
62+
"@ckeditor/ckeditor5-media-embed": "^44.0.0",
63+
"@ckeditor/ckeditor5-paragraph": "^44.0.0",
64+
"@ckeditor/ckeditor5-paste-from-office": "^44.0.0",
65+
"@ckeditor/ckeditor5-source-editing": "^44.0.0",
66+
"@ckeditor/ckeditor5-table": "^44.0.0",
67+
"@ckeditor/ckeditor5-theme-lark": "^44.0.0",
68+
"@ckeditor/ckeditor5-typing": "^44.0.0",
69+
"@ckeditor/ckeditor5-upload": "^44.0.0",
7070
"html-loader": "^5.1.0"
7171
}
7272
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/* eslint-env es6 */
2+
/* jshint esversion: 6 */
3+
4+
// index.js
5+
import CMSLinkPlugin from './src/cmsLinkPlugin';
6+
7+
export default CMSLinkPlugin;
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
const $ = jQuery;
2+
3+
/**
4+
* Override jQuery UI _renderItem function to output HTML by default.
5+
*
6+
* This uses function() syntax as required by jQuery UI.
7+
*
8+
* @param {object} ul
9+
* The <ul> element that the newly created <li> element must be appended to.
10+
* @param {object} item
11+
* The list item to append.
12+
*
13+
* @return {object}
14+
* jQuery collection of the ul element.
15+
*/
16+
function renderItem(ul, item) {
17+
const $line = $('<li class="entity-link-suggestions-result-line">');
18+
const $wrapper = $(
19+
'<div class="entity-link-suggestions-result-line-wrapper">',
20+
);
21+
$wrapper.append(
22+
`<span class="entity-link-suggestions-result-line--title">${item.label}</span>`,
23+
);
24+
if (item.hasOwnProperty('description')) {
25+
$wrapper.append(
26+
`<span class="entity-link-suggestions-result-line--description">${item.description}</span>`,
27+
);
28+
}
29+
return $line.append($wrapper).appendTo(ul);
30+
}
31+
32+
/**
33+
* Override jQuery UI _renderMenu function to handle groups.
34+
*
35+
* This uses function() syntax as required by jQuery UI.
36+
*
37+
* @param {object} ul
38+
* An empty <ul> element to use as the widget's menu.
39+
* @param {array} items
40+
* An Array of items that match the user typed term.
41+
*/
42+
function renderMenu(ul, items) {
43+
const groupedItems = {};
44+
items.forEach((item) => {
45+
const group = item.hasOwnProperty('group') ? item.group : '';
46+
if (!groupedItems.hasOwnProperty(group)) {
47+
groupedItems[group] = [];
48+
}
49+
groupedItems[group].push(item);
50+
});
51+
52+
Object.keys(groupedItems).forEach((groupLabel) => {
53+
const groupItems = groupedItems[groupLabel];
54+
if (groupLabel.length) {
55+
ul.append(
56+
`<li class="entity-link-suggestions-result-line--group ui-menu-divider">${groupLabel}</li>`,
57+
);
58+
}
59+
groupItems.forEach((item) => {
60+
this.element.autocomplete('instance')._renderItemData(ul, item);
61+
});
62+
});
63+
}
64+
65+
export default function initializeAutocomplete(element, settings) {
66+
const {
67+
autocompleteUrl,
68+
selectHandler,
69+
closeHandler,
70+
openHandler,
71+
queryParams,
72+
} = settings;
73+
const autocomplete = {
74+
cache: {},
75+
ajax: {
76+
dataType: 'json',
77+
jsonp: false,
78+
},
79+
};
80+
81+
/**
82+
* JQuery UI autocomplete source callback.
83+
*
84+
* @param {object} request
85+
* The request object.
86+
* @param {function} response
87+
* The function to call with the response.
88+
*/
89+
function sourceData(request, response) {
90+
const { cache } = autocomplete;
91+
const { term } = request;
92+
93+
/**
94+
* Transforms the data object into an array and update autocomplete results.
95+
*
96+
* @param {object} data
97+
* The data sent back from the server.
98+
*/
99+
function sourceCallbackHandler(data) {
100+
cache[term] = data.suggestions;
101+
response(data.suggestions);
102+
}
103+
104+
// Get the desired term and construct the autocomplete URL for it.
105+
106+
// Check if the term is already cached.
107+
if (cache.hasOwnProperty(term)) {
108+
response(cache[term]);
109+
} else {
110+
const data = queryParams;
111+
data.q = term;
112+
$.ajax(autocompleteUrl, {
113+
success: sourceCallbackHandler,
114+
data,
115+
...autocomplete.ajax,
116+
});
117+
}
118+
}
119+
120+
const options = {
121+
appendTo: element.closest('.ck-labeled-field-view'),
122+
source: sourceData,
123+
select: selectHandler,
124+
focus: () => false,
125+
search: () => !options.isComposing,
126+
close: closeHandler,
127+
open: openHandler,
128+
minLength: 1,
129+
isComposing: false,
130+
};
131+
const $auto = $(element).autocomplete(options);
132+
133+
// Override a few things.
134+
const instance = $auto.data('ui-autocomplete');
135+
instance
136+
.widget()
137+
.menu(
138+
'option',
139+
'items',
140+
'> :not(.entity-link-suggestions-result-line--group)',
141+
);
142+
instance._renderMenu = renderMenu;
143+
instance._renderItem = renderItem;
144+
145+
$auto
146+
.autocomplete('widget')
147+
.addClass('ck-reset_all-excluded entity-link-suggestions-ui-autocomplete');
148+
149+
$auto.on('click', () => {
150+
$auto.autocomplete('search', $auto[0].value);
151+
});
152+
153+
// Use CompositionEvent to handle IME inputs. It requests remote server on "compositionend" event only.
154+
$auto.on('compositionstart.autocomplete', () => {
155+
options.isComposing = true;
156+
});
157+
$auto.on('compositionend.autocomplete', () => {
158+
options.isComposing = false;
159+
});
160+
161+
return $auto;
162+
}

0 commit comments

Comments
 (0)