wekan/client/components/sidebar/sidebarCustomFields.js
Harry Adel bae23f9ed8 Migrate sidebar and settings components from BlazeComponent to Template
Convert sidebar, sidebarArchives, sidebarCustomFields, sidebarFilters,
sidebarSearches, and all settings panel components to use native Meteor
Template.onCreated/helpers/events pattern.
2026-03-08 11:04:53 +02:00

271 lines
7.5 KiB
JavaScript

import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
Template.customFieldsSidebar.helpers({
customFields() {
const ret = ReactiveCache.getCustomFields({
boardIds: { $in: [Session.get('currentBoard')] },
});
return ret;
},
});
Template.customFieldsSidebar.events({
'click .js-open-create-custom-field': Popup.open('createCustomField'),
'click .js-edit-custom-field': Popup.open('editCustomField'),
});
const CUSTOM_FIELD_TYPES = [
'text',
'number',
'date',
'dropdown',
'currency',
'checkbox',
'stringtemplate',
];
const CURRENCY_LIST = [
{ name: 'US Dollar', code: 'USD' },
{ name: 'Euro', code: 'EUR' },
{ name: 'Yen', code: 'JPY' },
{ name: 'Pound Sterling', code: 'GBP' },
{ name: 'Australian Dollar', code: 'AUD' },
{ name: 'Canadian Dollar', code: 'CAD' },
{ name: 'Swiss Franc', code: 'CHF' },
{ name: 'Yuan Renminbi', code: 'CNY' },
{ name: 'Hong Kong Dollar', code: 'HKD' },
{ name: 'New Zealand Dollar', code: 'NZD' },
];
function getDropdownItems(tpl) {
const items = tpl.dropdownItems.get();
Array.from(tpl.findAll('.js-field-settings-dropdown input')).forEach(
(el, index) => {
if (!items[index])
items[index] = {
_id: Random.id(6),
};
items[index].name = el.value.trim();
},
);
return items;
}
function getSettings(tpl) {
const settings = {};
switch (tpl.type.get()) {
case 'currency': {
const currencyCode = tpl.currencyCode.get();
settings.currencyCode = currencyCode;
break;
}
case 'dropdown': {
const dropdownItems = getDropdownItems(tpl).filter(
item => !!item.name.trim(),
);
settings.dropdownItems = dropdownItems;
break;
}
case 'stringtemplate': {
const stringtemplateFormat = tpl.stringtemplateFormat.get();
settings.stringtemplateFormat = stringtemplateFormat;
const stringtemplateSeparator = tpl.stringtemplateSeparator.get();
settings.stringtemplateSeparator = stringtemplateSeparator;
break;
}
}
return settings;
}
Template.createCustomFieldPopup.onCreated(function () {
const data = Template.currentData();
this.type = new ReactiveVar(
data.type ? data.type : CUSTOM_FIELD_TYPES[0],
);
this.currencyCode = new ReactiveVar(
data.settings && data.settings.currencyCode
? data.settings.currencyCode
: CURRENCY_LIST[0].code,
);
this.dropdownItems = new ReactiveVar(
data.settings && data.settings.dropdownItems
? data.settings.dropdownItems
: [],
);
this.stringtemplateFormat = new ReactiveVar(
data.settings && data.settings.stringtemplateFormat
? data.settings.stringtemplateFormat
: '',
);
this.stringtemplateSeparator = new ReactiveVar(
data.settings && data.settings.stringtemplateSeparator
? data.settings.stringtemplateSeparator
: '',
);
});
Template.createCustomFieldPopup.helpers({
types() {
const currentType = Template.currentData().type;
return CUSTOM_FIELD_TYPES.map(type => {
return {
value: type,
name: TAPi18n.__(`custom-field-${type}`),
selected: type === currentType,
};
});
},
isTypeNotSelected(type) {
return Template.instance().type.get() !== type;
},
getCurrencyCodes() {
const currentCode = Template.instance().currencyCode.get();
return CURRENCY_LIST.map(({ name, code }) => {
return {
name: `${code} - ${name}`,
value: code,
selected: code === currentCode,
};
});
},
getDropdownItems() {
return getDropdownItems(Template.instance());
},
getStringtemplateFormat() {
return Template.instance().stringtemplateFormat.get();
},
getStringtemplateSeparator() {
return Template.instance().stringtemplateSeparator.get();
},
});
Template.createCustomFieldPopup.events({
'change .js-field-type'(evt, tpl) {
const value = evt.target.value;
tpl.type.set(value);
},
'change .js-field-currency'(evt, tpl) {
const value = evt.target.value;
tpl.currencyCode.set(value);
},
'keydown .js-dropdown-item.last'(evt, tpl) {
if (evt.target.value.trim() && evt.keyCode === 13) {
const items = getDropdownItems(tpl);
tpl.dropdownItems.set(items);
evt.target.value = '';
}
},
'input .js-field-stringtemplate-format'(evt, tpl) {
const value = evt.target.value;
tpl.stringtemplateFormat.set(value);
},
'input .js-field-stringtemplate-separator'(evt, tpl) {
const value = evt.target.value;
tpl.stringtemplateSeparator.set(value);
},
'click .js-field-show-on-card'(evt) {
let $target = $(evt.target);
if (!$target.hasClass('js-field-show-on-card')) {
$target = $target.parent();
}
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .js-field-automatically-on-card'(evt) {
let $target = $(evt.target);
if (!$target.hasClass('js-field-automatically-on-card')) {
$target = $target.parent();
}
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .js-field-always-on-card'(evt) {
let $target = $(evt.target);
if (!$target.hasClass('js-field-always-on-card')) {
$target = $target.parent();
}
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .js-field-showLabel-on-card'(evt) {
let $target = $(evt.target);
if (!$target.hasClass('js-field-showLabel-on-card')) {
$target = $target.parent();
}
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .js-field-show-sum-at-top-of-list'(evt) {
let $target = $(evt.target);
if (!$target.hasClass('js-field-show-sum-at-top-of-list')) {
$target = $target.parent();
}
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .primary'(evt, tpl) {
evt.preventDefault();
const data = {
name: tpl.find('.js-field-name').value.trim(),
type: tpl.type.get(),
settings: getSettings(tpl),
showOnCard: tpl.find('.js-field-show-on-card.is-checked') !== null,
showLabelOnMiniCard:
tpl.find('.js-field-showLabel-on-card.is-checked') !== null,
automaticallyOnCard:
tpl.find('.js-field-automatically-on-card.is-checked') !== null,
alwaysOnCard:
tpl.find('.js-field-always-on-card.is-checked') !== null,
showSumAtTopOfList:
tpl.find('.js-field-show-sum-at-top-of-list.is-checked') !== null,
};
const currentData = Template.currentData();
// insert or update
if (!currentData._id) {
data.boardIds = [Session.get('currentBoard')];
CustomFields.insert(data);
} else {
CustomFields.update(currentData._id, { $set: data });
}
Popup.back();
},
'click .js-delete-custom-field': Popup.afterConfirm(
'deleteCustomField',
function() {
const customField = ReactiveCache.getCustomField(this._id);
if (customField.boardIds.length > 1) {
CustomFields.update(customField._id, {
$pull: {
boardIds: Session.get('currentBoard'),
},
});
} else {
CustomFields.remove(customField._id);
}
Popup.back();
},
),
});
/*Template.deleteCustomFieldPopup.events({
'submit'(evt) {
const customFieldId = this._id;
CustomFields.remove(customFieldId);
Popup.back();
}
});*/