Skip to content

Commit 72fb355

Browse files
author
hikki
committed
v3.6
CascadeDot 增加下拉列表模式 O 搜索逆向 O
1 parent a044828 commit 72fb355

File tree

2 files changed

+112
-30
lines changed

2 files changed

+112
-30
lines changed

resources/assets/component.css

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,30 @@
119119

120120
.dlp-dot-menu{position: relative;}
121121
.dlp-dot-menu-select{
122+
background: #363636;
122123
display: flex!important;
124+
border-radius: 3px;
125+
color: #ffffff;
126+
}
127+
.dlp-dot-menu-select>div:first-child{
128+
width: 100%;
129+
cursor: pointer;
130+
height: 100%;
131+
display: flex;
132+
align-items: center;
133+
color: #9d9d9d;
134+
}
135+
.dlp-dot-menu-select>div:first-child span{
136+
background: #ffffff;
137+
color: #4c4c4c;
138+
display: inline-block;
123139
border-radius: 2px;
124-
color: #363636;
140+
padding: 0 2px!important;
141+
height: 18px;
142+
margin-right: 2px!important;
143+
max-width: 5em;
125144
}
126-
.dlp-dot-menu-select>div:first-child{width: 100%;cursor: pointer}
145+
.dlp-dot-menu-select>div:first-child p{color: whitesmoke}
127146
.dlp-dot-menu-select>div:last-child,.dlp-dot-menu>.menu .option>div:last-child{
128147
width: 14px;
129148
font-size: 14px;
@@ -137,7 +156,7 @@
137156
height: unset;
138157
flex-wrap: wrap;
139158
padding: 0;
140-
border-radius: 2px;
159+
border-radius: 3px;
141160
}
142161
.dlp-dot-menu>.menu-list>.list{width:100%;max-height: 150px;overflow-y: auto;}
143162
.dlp-dot-menu>.menu-list .option{
@@ -155,7 +174,7 @@
155174
justify-content: center;
156175
align-items: center;
157176
}
158-
.dlp-dot-menu>.menu-list .option:hover{background: #dbdbdb}
177+
.dlp-dot-menu>.menu-list .option:hover,.dlp-dot-menu>.menu-list .option-active{background: #dbdbdb}
159178
.dlp-dot-menu .search-box{width: 100%;height: 24px;padding: 2px}
160179
.dlp-dot-menu .search-box>input{
161180
border: 1px solid #bdbdbd;
@@ -293,7 +312,7 @@
293312
.dlp-table .dlp-tbody>.dlp-tr{background:#1e1e1e}
294313
.dlp-table .dlp-tbody>.dlp-tr:nth-child(even){background:#2a2a2a}
295314
.dlp-table .dlp-tbody>.dlp-tr:hover{background:rgb(255 255 255 / 1%)}
296-
.dlp-table .dlp-tfoot>.dlp-tr{height: 40px;}
315+
.dlp-table .dlp-tfoot>.dlp-tr{height: 40px;border-top: 1px solid #060606;}
297316
.dlp-table .operate-column{width:45px;text-align: center;line-height: 9px;}
298317

299318
#dlp-plane>div{

resources/assets/component.js

Lines changed: 88 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ window.ComponentDot = class {
169169
delete: 'delete'
170170
};
171171

172-
constructor(name, selected, select, limit = 0,menu_mode= false) {
172+
constructor(name, selected, select, limit = 0,menu_mode= false,menu_placeholder='') {
173173
if (!Array.isArray(selected)) {
174174
console.error('Dot param selected must be array!');
175175
return;
@@ -178,6 +178,7 @@ window.ComponentDot = class {
178178
console.error('Dot param select must be object such as {key:val,key2:val2,...} !');
179179
return;
180180
}
181+
this.select = select;
181182
this.name = name;
182183
this.limit = limit;
183184
this.DOM = document.getElementById(name);
@@ -190,19 +191,26 @@ window.ComponentDot = class {
190191
this.insert_data = [];
191192
this.delete_data = [];
192193

194+
setTimeout(() => {
195+
let queue = [];
196+
this.CONTENT_DOM.childNodes.forEach((D) => {
197+
let id = parseInt(D.getAttribute('data-id'));
198+
if (selected.indexOf(id) !== -1) {
199+
queue.push(D);
200+
}
201+
});
202+
queue.forEach((D)=>D.click());
203+
});
193204
if(menu_mode === false) {
194205
this.make(selected, select);
195-
for (let element of this.CONTENT_DOM.getElementsByClassName("dlp-label")) {
196-
element.addEventListener('click', this.tagSelect.bind(this, element), false);
197-
}
198206
}else {
207+
this.menu_placeholder = menu_placeholder;
199208
this.menuMake(selected, select);
200209
}
201-
202210
let search = this.DOM.querySelector(`.dot-search`);
203211
search.addEventListener('input', () => {
204212
setTimeout(() => {
205-
this.search(search);
213+
this.search(search,menu_mode);
206214
}, 500);
207215
});
208216
}
@@ -221,16 +229,9 @@ window.ComponentDot = class {
221229
this.selectInputDOM = document.querySelector(`input[name='${this.name}[select]']`);
222230
this.insertInputDOM = document.querySelector(`input[name='${this.name}[insert]']`);
223231
this.deleteInputDOM = document.querySelector(`input[name='${this.name}[delete]']`);
224-
setTimeout(() => {
225-
let queue = [];
226-
this.CONTENT_DOM.childNodes.forEach((D) => {
227-
let id = parseInt(D.getAttribute('data-id'));
228-
if (selected.indexOf(id) !== -1) {
229-
queue.push(D);
230-
}
231-
});
232-
queue.forEach((D)=>D.click());
233-
});
232+
for (let element of this.CONTENT_DOM.getElementsByClassName("dlp-label")) {
233+
element.addEventListener('click', this.tagSelect.bind(this, element), false);
234+
}
234235
}
235236

236237
menuMake(selected, select){
@@ -239,7 +240,7 @@ window.ComponentDot = class {
239240

240241
let menu_select = document.createElement('div');
241242
menu_select.className = 'dlp-input dlp-dot-menu-select';
242-
menu_select.insertAdjacentHTML('afterbegin',`<div class="dlp dlp-text">测试</div><div>▼</div>`);
243+
menu_select.insertAdjacentHTML('afterbegin',`<div class="dlp dlp-text">${this.menu_placeholder}</div><div>▼</div>`);
243244

244245
let menu_list = document.createElement('div');
245246
menu_list.className = 'dlp-input menu-list';
@@ -251,11 +252,38 @@ window.ComponentDot = class {
251252

252253
let list = document.createElement('div');
253254
list.className = 'list dlp-scroll';
255+
256+
let check = _component.check;
257+
check = check.replace(`width="16" height="16"`,`width="12" height="12"`);
258+
this.id_line_hash = [];
259+
let line = 0;
254260
for (let id in select){
255261
if(!select.hasOwnProperty(id))continue;
262+
this.id_line_hash[id] = line;
263+
line++;
256264
let option = document.createElement('div');
257265
option.className = 'option';
266+
option.setAttribute('data-id',id);
258267
option.insertAdjacentHTML('afterbegin',`<div class="dlp dlp-text" data-v="${id}">${select[id]}</div><div></div>`);
268+
option.addEventListener('click', ()=>{
269+
id = parseInt(id);
270+
if(this.select_data.indexOf(id) !== -1){
271+
/*cancel*/
272+
this.tagCal(id, this.MODE.delete);
273+
option.classList.remove('option-active');
274+
if(option.lastChild instanceof HTMLElement) option.lastChild.innerHTML = '';
275+
this.menuSelect(select);
276+
if(this.select_data.length == 0)this.SELECTED_DOM.textContent = this.menu_placeholder;
277+
return;
278+
}
279+
if (this.limit > 0 && this.select_data.length >= this.limit) {
280+
list.childNodes[this.id_line_hash[this.select_data[0].toString()]].click();
281+
}
282+
option.classList.add('option-active');
283+
this.tagCal(id, this.MODE.insert);
284+
(option.lastChild instanceof HTMLElement) && option.lastChild.insertAdjacentHTML('afterbegin',check);
285+
this.menuSelect(select);
286+
}, false);
259287
list.append(option);
260288
}
261289

@@ -269,17 +297,34 @@ window.ComponentDot = class {
269297
});
270298
menu.addEventListener('mouseleave',()=>{
271299
menu_list.style.display = 'none';
300+
let search = this.DOM.querySelector(`.dot-search`);
301+
search.value = '';
302+
for(let node of this.CONTENT_DOM.childNodes){
303+
node.style.display = 'flex';
304+
}
272305
});
273306

274307
this.DOM.append(menu);
275308
this.DOM.insertAdjacentHTML('beforeend', `<input name="${this.name}[select]" value='${JSON.stringify(selected)}' type="hidden"><input name="${this.name}[insert]" value="[]" type="hidden"><input name="${this.name}[delete]" value="[]" type="hidden">`);
276-
this.SELECTED_DOM = document.querySelector(`#${this.name} .dlp-dot-menu-select`);
277-
this.CONTENT_DOM = document.querySelector(`#${this.name} .option`);
309+
this.SELECTED_DOM = document.querySelector(`#${this.name} .dlp-dot-menu-select`).firstElementChild;
310+
this.CONTENT_DOM = document.querySelector(`#${this.name} .list`);
278311
this.selectInputDOM = document.querySelector(`input[name='${this.name}[select]']`);
279312
this.insertInputDOM = document.querySelector(`input[name='${this.name}[insert]']`);
280313
this.deleteInputDOM = document.querySelector(`input[name='${this.name}[delete]']`);
281314
}
282315

316+
menuSelect(select){
317+
if(this.limit == 1){
318+
this.SELECTED_DOM.innerHTML = `<p class="dlp-text">${select[this.select_data[0]]}</p>`;
319+
return;
320+
}
321+
let html = '';
322+
for(let id of this.select_data){
323+
html += `<span class="dlp-text" title="${select[id]}">${select[id]}</span>`;
324+
}
325+
this.SELECTED_DOM.innerHTML = html;
326+
}
327+
283328
tagSelect(element) {
284329
if (this.limit > 0 && this.select_data.length >= this.limit && this.SELECTED_DOM.firstChild instanceof HTMLElement) {
285330
this.SELECTED_DOM.firstChild.click();
@@ -288,7 +333,7 @@ window.ComponentDot = class {
288333
clone.addEventListener('click', this.tagCancel.bind(this, clone), false);
289334
this.SELECTED_DOM.appendChild(clone);
290335
element.remove();
291-
this.tagCal(element, this.MODE.insert);
336+
this.tagCal(parseInt(element.getAttribute('data-id')), this.MODE.insert);
292337
this.SELECTED_DOM.scrollTop = this.SELECTED_DOM.scrollHeight;
293338
}
294339

@@ -297,11 +342,10 @@ window.ComponentDot = class {
297342
clone.addEventListener('click', this.tagSelect.bind(this, clone), false);
298343
this.CONTENT_DOM.appendChild(clone);
299344
element.remove();
300-
this.tagCal(element, this.MODE.delete);
345+
this.tagCal(parseInt(element.getAttribute('data-id')), this.MODE.delete);
301346
}
302347

303-
tagCal(element, operate) {
304-
let id = parseInt(element.getAttribute('data-id'));
348+
tagCal(id, operate) {
305349
let index = this.select_data.indexOf(id);
306350
if (operate === this.MODE.insert) {
307351
if (index === -1) {
@@ -334,7 +378,26 @@ window.ComponentDot = class {
334378
}
335379
}
336380

337-
search(search) {
381+
search(search,menu_mode) {
382+
if(menu_mode){
383+
if (search.value === '') {
384+
for(let node of this.CONTENT_DOM.childNodes){
385+
node.style.display = 'flex';
386+
}
387+
return;
388+
}
389+
for (let id in this.select){
390+
if(!this.select.hasOwnProperty(id))continue;
391+
let text = this.select[id];
392+
let line = this.id_line_hash[id];
393+
if(text.indexOf(search.value) !== -1 || search.value.indexOf(text) !== -1){
394+
this.CONTENT_DOM.childNodes[line].style.display = 'flex';
395+
}else {
396+
this.CONTENT_DOM.childNodes[line].style.display = 'none';
397+
}
398+
}
399+
return;
400+
}
338401
if (search.value === '') {
339402
if (this.SELECT_COVER_DOM instanceof HTMLElement) {
340403
let elements = [];
@@ -363,7 +426,7 @@ window.ComponentDot = class {
363426
if (element.className.indexOf('dlp-label') === -1) {
364427
continue;
365428
}
366-
if (element.innerText.indexOf(search.value) !== -1) {
429+
if (element.innerText.indexOf(search.value) !== -1 || search.value.indexOf(element.innerText) !== -1) {
367430
elements.push(element);
368431
}
369432
}

0 commit comments

Comments
 (0)