Skip to content

Commit

Permalink
Merge pull request #639 from kabalin/fixregionselector
Browse files Browse the repository at this point in the history
Fix identical names selection issue.
  • Loading branch information
kabalin authored Nov 28, 2023
2 parents d4aa1e6 + d967c5b commit 226256d
Showing 1 changed file with 15 additions and 20 deletions.
35 changes: 15 additions & 20 deletions public/js/module/region/select.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,13 @@ define([
if (this.selectedInit && this.selectedInit.length) {
this.selectedInit.forEach(function (region) {
this.selectedInitHash[region.cid] = region;
this.selectedInitTkns.push({ value: region.title_local, label: region.title_local });
this.selectedInitTkns.push({ cid: region.cid, value: region.title_local });
}, this);
}

this.regionsTree = ko.observableArray();
this.regionsTypehead = [];
this.regionsHashByCid = {};
this.regionsHashByTitle = {};

this.sortBy = ko.observable(Utils.getLocalStorage('regionSelect.sortBy') || 'alphabet'); // alphabet, sub, photo, pic, comment
this.sortOrder = ko.observable(Utils.getLocalStorage('regionSelect.sortOrder') || 1); // 1, -1
Expand Down Expand Up @@ -193,7 +192,7 @@ define([
const result = [];

tokens.forEach(function (item) {
const region = this.regionsHashByTitle[item.value];
const region = this.regionsHashByCid[item.cid];

if (region && region.exists) {
result.push(fields ? _.pick(region, fields) : region);
Expand All @@ -209,7 +208,7 @@ define([
const results = [];

tokens.forEach(function (item) {
const region = this.regionsHashByTitle[item.value];
const region = this.regionsHashByCid[item.cid];

if (region && region.exists) {
const result = [];
Expand Down Expand Up @@ -239,7 +238,7 @@ define([
const result = [];

tokens.forEach(function (item) {
const region = this.regionsHashByTitle[item.value];
const region = this.regionsHashByCid[item.cid];

if (region && region.exists) {
result.push(region.cid);
Expand All @@ -266,7 +265,7 @@ define([
},
createTokenfield: function () {
const engine = new Bloodhound({
local: this.regionsTypehead, /*[{cid: 2, title: 'США', tokens: ['2', 'USA', 'США']}]*/
local: this.regionsTypehead, /*[{cid: 2, value: 'США', tokens: ['2', 'USA', 'США']}]*/
datumTokenizer: function (d) {
// Join all tokens using space and tokenise using whitespace.
return Bloodhound.tokenizers.whitespace(d.tokens.join(' '));
Expand All @@ -290,13 +289,13 @@ define([
highlight: true,
}, {
name: 'regions',
displayKey: 'title',
displayKey: 'value',
limit: 10,
templates: {
'suggestion': function (context) {
const title = '<p>' + context.title + '</p>';
const title = `<p>${context.value}</p>`;

return title + (context.parentTitle ? "<p style='color: #aaa; font-size 0.9em'>" + context.parentTitle + '</p>' : '');
return title + (context.parentTitle ? `<p style="color: #aaa; font-size 0.9em">${context.parentTitle}</p>` : '');
},
},
source: engine.ttAdapter(),
Expand All @@ -309,7 +308,7 @@ define([
const existingTokens = $(this).tokenfield('getTokens');

$.each(existingTokens, function (index, token) {
if (token.value === e.attrs.value) {
if (token.cid === e.attrs.cid) {
e.preventDefault();
}
});
Expand All @@ -319,8 +318,7 @@ define([
// Событие создания токена. Вызовется как при создании в поле,
// так и при удалении из дерева (потому что при этом пересоздаются неудаляемые токены).
onCreateToken: function (e) {
const title = e.attrs.value;
const region = this.regionsHashByTitle[title];
const region = this.regionsHashByCid[e.attrs.cid];

if (region && region.exists) {
//Если регион уже выбран, значит, мы создаем токен вручную после клика по узлу дерева
Expand All @@ -338,8 +336,7 @@ define([
},
//Событие удаления токена непосредственно из поля
onRemoveToken: function (e) {
const title = e.attrs.value;
const region = this.regionsHashByTitle[title];
const region = this.regionsHashByCid[e.attrs.cid];

if (region && region.exists) {
region.selected(false);
Expand All @@ -349,12 +346,12 @@ define([
//Ручное удаление токена, работает полной заменой токенов, кроме удаляемого.
//Поэтому для удаляемого токена событие onRemoveToken не сработает, но сработает onCreateToken для каждого неудаляемого
removeToken: function (region) {
const title = region.title_local;
const cid = region.cid;
const tkn = this.$dom.find('.regionstkn');
const tokensExists = tkn.tokenfield('getTokens');

_.remove(tokensExists, function (item) {
return item.value === title;
return item.cid === cid;
});
tkn.tokenfield('setTokens', tokensExists);
},
Expand Down Expand Up @@ -386,13 +383,12 @@ define([
return;
}

const title = region.title_local;
const add = !region.selected();
const tkn = this.$dom.find('.regionstkn');

if (add) {
if (this.selectRegion(region)) {
tkn.tokenfield('createToken', { value: title, label: title });
tkn.tokenfield('createToken', { cid: region.cid, value: region.title_local });
}
} else {
region.selected(false);
Expand Down Expand Up @@ -495,11 +491,10 @@ define([
cid = region.cid;
this.regionsTypehead.push({
cid: cid,
title: region.title_local,
value: region.title_local,
parentTitle: region.parent && region.parent.title_local,
tokens: [String(cid), region.title_local, region.title_en],
});
this.regionsHashByTitle[region.title_local] = region;

const proceed = !filterByCids || parentsCidsFilterHash[cid] === true ||
region.level > 0 && parentsCidsFilterHash[region.parents[region.level - 1]] === true;
Expand Down

0 comments on commit 226256d

Please sign in to comment.