--- +++ @@ -5,3 +5,3 @@ import { - el, mount, card, button, toggleSwitch, field, fieldValue, modal, + sectionTabs, el, mount, card, button, toggleSwitch, field, fieldValue, modal, toast, confirmDialog, busy, loadingBlock, errorBlock, emptyBlock, @@ -83,3 +83,3 @@ { key: 'categories', label: 'cat_tab_categories', icon: '🗂️' }, - { key: 'selling', label: 'cat_tab_selling', icon: '🚦' }, + { key: 'selling', label: 'cat_tab_selling', icon: 'repeat' }, ]; @@ -92,10 +92,3 @@ const host = el('div', { class: 'page' }); - const tabbar = el('div', { class: 'subtabs' }); - TABS.forEach(function (tb) { - tabbar.appendChild(el('button', { - class: 'subtab' + (tb.key === active ? ' active' : ''), - onClick: function () { drawShell(view, tb.key); }, - }, [el('span', { text: tb.icon }), ' ', t(tb.label)])); - }); - const content = el('div', { class: 'subcontent' }, [loadingBlock()]); + const { tabbar, content } = sectionTabs(TABS, active, key => drawShell(view, key)); mount(host, [tabbar, content]); @@ -219,4 +212,6 @@ actions: [button({ - label: t('cat_apply'), onClick: function (ev) { - const btn = ev.currentTarget; busy(btn, true); + label: t('cat_apply'), onClick: async function (ev) { + const btn = ev.currentTarget; + if (!await confirmDialog('تخفیف ' + fieldValue(fDisc) + '٪ برای همه پلن‌های فعال اعمال شود؟')) return; + busy(btn, true); api('/plans/discount-all', { method: 'POST', body: { discount: parseFloat(fieldValue(fDisc) || '0') } }) @@ -437,4 +432,6 @@ button({ - label: t('cat_apply'), small: true, kind: 'ghost', onClick: function (ev) { - const btn = ev.currentTarget; busy(btn, true); + label: t('cat_apply'), small: true, kind: 'ghost', onClick: async function (ev) { + const btn = ev.currentTarget; + if (!await confirmDialog('تخفیف ' + fieldValue(fDisc) + '٪ برای پلن‌های «' + c.friendly_name + '» اعمال شود؟')) return; + busy(btn, true); api('/categories/' + c.id + '/discount', { method: 'POST', body: { discount: parseFloat(fieldValue(fDisc) || '0') } }) @@ -485,13 +482,15 @@ }), + el('div', { class: 'group-label danger-section-label', text: 'حذف دسته‌بندی' }), + button({ + label: t('delete'), kind: 'danger', onClick: function () { + confirmDialog(t('cat_cat_delete_q')).then(function (ok) { + if (!ok) return; + api('/categories/' + c.id, { method: 'DELETE' }) + .then(function () { toast(t('deleted_ok'), 'success'); m.close(); loadCategories(host); }) + .catch(function (e) { toast(errText(e) || t('error_generic'), 'error'); }); + }); + }, + }), ], - actions: [button({ - label: t('delete'), kind: 'danger', onClick: function () { - confirmDialog(t('cat_cat_delete_q')).then(function (ok) { - if (!ok) return; - api('/categories/' + c.id, { method: 'DELETE' }) - .then(function () { toast(t('deleted_ok'), 'success'); m.close(); loadCategories(host); }) - .catch(function (e) { toast(errText(e) || t('error_generic'), 'error'); }); - }); - }, - })], + actions: [button({ label: t('close'), kind: 'ghost', onClick: function () { m.close(); } })], }); @@ -516,6 +515,8 @@ children: [ - labeledToggle(t('cat_general_selling'), g.selling_enabled, function (v) { + labeledToggle(t('cat_general_selling'), g.selling_enabled, async function (v) { + if (!v && !await confirmDialog('فروش اشتراک برای همه کاربران متوقف شود؟')) throw {cancelled:true}; return api('/general', { method: 'PUT', body: { selling_enabled: v } }); }), - labeledToggle(t('cat_general_renew'), g.renew_enabled, function (v) { + labeledToggle(t('cat_general_renew'), g.renew_enabled, async function (v) { + if (!v && !await confirmDialog('تمدید اشتراک برای همه کاربران متوقف شود؟')) throw {cancelled:true}; return api('/general', { method: 'PUT', body: { renew_enabled: v } }); @@ -570,5 +571,5 @@ const sw = toggleSwitch({ - checked: checked, onChange: function (v) { + label: label, checked: checked, onChange: function (v) { return onChange(v).then(function () { toast(t('saved_ok'), 'success'); }) - .catch(function (e) { toast(errText(e) || t('error_generic'), 'error'); throw e; }); + .catch(function (e) { if (!e.cancelled) toast(errText(e) || t('error_generic'), 'error'); throw e; }); },