2023-02-22 23:02:02 +01:00
|
|
|
import { ReactiveCache } from '/imports/reactiveCache';
|
2021-07-10 10:55:54 +02:00
|
|
|
import { TAPi18n } from '/imports/i18n';
|
|
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
Template.customFieldsSidebar.helpers({
|
2017-08-25 02:59:20 +02:00
|
|
|
customFields() {
|
2023-02-22 23:02:02 +01:00
|
|
|
const ret = ReactiveCache.getCustomFields({
|
2019-06-28 12:52:09 -05:00
|
|
|
boardIds: { $in: [Session.get('currentBoard')] },
|
2017-08-25 02:59:20 +02:00
|
|
|
});
|
2023-02-22 23:02:02 +01:00
|
|
|
return ret;
|
2017-08-25 02:59:20 +02:00
|
|
|
},
|
2026-03-08 11:01:21 +02:00
|
|
|
});
|
2017-08-25 02:59:20 +02:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
Template.customFieldsSidebar.events({
|
|
|
|
|
'click .js-open-create-custom-field': Popup.open('createCustomField'),
|
|
|
|
|
'click .js-edit-custom-field': Popup.open('editCustomField'),
|
|
|
|
|
});
|
2017-08-25 02:59:20 +02:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
const CUSTOM_FIELD_TYPES = [
|
|
|
|
|
'text',
|
|
|
|
|
'number',
|
|
|
|
|
'date',
|
|
|
|
|
'dropdown',
|
|
|
|
|
'currency',
|
|
|
|
|
'checkbox',
|
|
|
|
|
'stringtemplate',
|
|
|
|
|
];
|
2020-05-25 14:59:32 +00:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
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();
|
2020-05-25 22:05:06 +00:00
|
|
|
},
|
2026-03-08 11:01:21 +02:00
|
|
|
);
|
|
|
|
|
return items;
|
|
|
|
|
}
|
2017-09-18 00:46:17 +02:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
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;
|
|
|
|
|
}
|
2020-05-25 14:59:32 +00:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
Template.createCustomFieldPopup.onCreated(function () {
|
|
|
|
|
const data = Template.currentData();
|
|
|
|
|
this.type = new ReactiveVar(
|
|
|
|
|
data.type ? data.type : CUSTOM_FIELD_TYPES[0],
|
|
|
|
|
);
|
2020-05-25 14:59:32 +00:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
this.currencyCode = new ReactiveVar(
|
|
|
|
|
data.settings && data.settings.currencyCode
|
|
|
|
|
? data.settings.currencyCode
|
|
|
|
|
: CURRENCY_LIST[0].code,
|
|
|
|
|
);
|
2021-04-07 16:11:19 +02:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
this.dropdownItems = new ReactiveVar(
|
|
|
|
|
data.settings && data.settings.dropdownItems
|
|
|
|
|
? data.settings.dropdownItems
|
|
|
|
|
: [],
|
|
|
|
|
);
|
2021-04-09 11:28:32 +02:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
this.stringtemplateFormat = new ReactiveVar(
|
|
|
|
|
data.settings && data.settings.stringtemplateFormat
|
|
|
|
|
? data.settings.stringtemplateFormat
|
|
|
|
|
: '',
|
|
|
|
|
);
|
2017-09-18 00:46:17 +02:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
this.stringtemplateSeparator = new ReactiveVar(
|
|
|
|
|
data.settings && data.settings.stringtemplateSeparator
|
|
|
|
|
? data.settings.stringtemplateSeparator
|
|
|
|
|
: '',
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Template.createCustomFieldPopup.helpers({
|
2017-08-27 22:31:24 +02:00
|
|
|
types() {
|
2026-03-08 11:01:21 +02:00
|
|
|
const currentType = Template.currentData().type;
|
|
|
|
|
return CUSTOM_FIELD_TYPES.map(type => {
|
2019-06-28 12:52:09 -05:00
|
|
|
return {
|
2018-05-18 11:13:01 +02:00
|
|
|
value: type,
|
|
|
|
|
name: TAPi18n.__(`custom-field-${type}`),
|
|
|
|
|
selected: type === currentType,
|
2019-06-28 12:52:09 -05:00
|
|
|
};
|
|
|
|
|
});
|
2017-09-18 00:46:17 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
isTypeNotSelected(type) {
|
2026-03-08 11:01:21 +02:00
|
|
|
return Template.instance().type.get() !== type;
|
2017-09-18 00:46:17 +02:00
|
|
|
},
|
|
|
|
|
|
2020-05-25 22:05:06 +00:00
|
|
|
getCurrencyCodes() {
|
2026-03-08 11:01:21 +02:00
|
|
|
const currentCode = Template.instance().currencyCode.get();
|
2020-05-25 14:59:32 +00:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
return CURRENCY_LIST.map(({ name, code }) => {
|
2020-05-25 14:59:32 +00:00
|
|
|
return {
|
2020-05-25 22:05:06 +00:00
|
|
|
name: `${code} - ${name}`,
|
|
|
|
|
value: code,
|
|
|
|
|
selected: code === currentCode,
|
2020-05-25 14:59:32 +00:00
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
2017-09-18 00:46:17 +02:00
|
|
|
getDropdownItems() {
|
2026-03-08 11:01:21 +02:00
|
|
|
return getDropdownItems(Template.instance());
|
2017-08-27 22:31:24 +02:00
|
|
|
},
|
2017-08-25 02:59:20 +02:00
|
|
|
|
2021-04-07 16:11:19 +02:00
|
|
|
getStringtemplateFormat() {
|
2026-03-08 11:01:21 +02:00
|
|
|
return Template.instance().stringtemplateFormat.get();
|
2021-04-07 16:11:19 +02:00
|
|
|
},
|
|
|
|
|
|
2021-04-09 11:28:32 +02:00
|
|
|
getStringtemplateSeparator() {
|
2026-03-08 11:01:21 +02:00
|
|
|
return Template.instance().stringtemplateSeparator.get();
|
2021-04-09 11:28:32 +02:00
|
|
|
},
|
2026-03-08 11:01:21 +02:00
|
|
|
});
|
2021-04-09 11:28:32 +02:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
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 = '';
|
2017-08-25 02:59:20 +02:00
|
|
|
}
|
|
|
|
|
},
|
2026-03-08 11:01:21 +02:00
|
|
|
'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();
|
2017-08-25 02:59:20 +02:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
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,
|
|
|
|
|
};
|
2019-06-28 12:52:09 -05:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
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 });
|
|
|
|
|
}
|
2019-06-28 12:52:09 -05:00
|
|
|
|
2026-03-08 11:01:21 +02:00
|
|
|
Popup.back();
|
2017-08-25 02:59:20 +02:00
|
|
|
},
|
2026-03-08 11:01:21 +02:00
|
|
|
'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();
|
|
|
|
|
},
|
|
|
|
|
),
|
2017-08-27 22:31:24 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/*Template.deleteCustomFieldPopup.events({
|
|
|
|
|
'submit'(evt) {
|
|
|
|
|
const customFieldId = this._id;
|
|
|
|
|
CustomFields.remove(customFieldId);
|
2021-10-21 10:35:16 +02:00
|
|
|
Popup.back();
|
2017-08-27 22:31:24 +02:00
|
|
|
}
|
2018-05-17 21:17:40 +02:00
|
|
|
});*/
|