@foxy.io/elements 1.22.0-beta.4 → 1.22.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cdn/foxy-access-recovery-form.js +1 -1
- package/dist/cdn/foxy-address-card.js +2 -2
- package/dist/cdn/foxy-address-form.js +1 -1
- package/dist/cdn/foxy-admin-subscription-card.js +1 -1
- package/dist/cdn/foxy-api-browser.js +1 -1
- package/dist/cdn/foxy-applied-coupon-code-card.js +1 -1
- package/dist/cdn/foxy-applied-coupon-code-form.js +1 -1
- package/dist/cdn/foxy-applied-tax-card.js +1 -1
- package/dist/cdn/foxy-attribute-card.js +1 -1
- package/dist/cdn/foxy-attribute-form.js +1 -1
- package/dist/cdn/foxy-cancellation-form.js +1 -1
- package/dist/cdn/foxy-cart-card.js +1 -1
- package/dist/cdn/foxy-cart-form.js +1 -1
- package/dist/cdn/foxy-collection-page.js +1 -1
- package/dist/cdn/foxy-collection-pages.js +1 -1
- package/dist/cdn/foxy-copy-to-clipboard.js +1 -1
- package/dist/cdn/foxy-coupon-card.js +1 -1
- package/dist/cdn/foxy-coupon-code-form.js +1 -1
- package/dist/cdn/foxy-coupon-codes-form.js +1 -1
- package/dist/cdn/foxy-coupon-detail-card.js +1 -1
- package/dist/cdn/foxy-coupon-form.js +1 -1
- package/dist/cdn/foxy-custom-field-card.js +1 -1
- package/dist/cdn/foxy-custom-field-form.js +1 -1
- package/dist/cdn/foxy-customer-card.js +1 -1
- package/dist/cdn/foxy-customer-form.js +1 -1
- package/dist/cdn/foxy-customer-portal-settings.js +1 -1
- package/dist/cdn/foxy-customer-portal.js +1 -1
- package/dist/cdn/foxy-customer.js +1 -1
- package/dist/cdn/foxy-customers-table.js +1 -1
- package/dist/cdn/foxy-discount-builder.js +1 -1
- package/dist/cdn/foxy-discount-card.js +1 -1
- package/dist/cdn/foxy-discount-detail-card.js +1 -1
- package/dist/cdn/foxy-donation.js +1 -1
- package/dist/cdn/foxy-downloadable-card.js +1 -0
- package/dist/cdn/foxy-downloadable-form.js +505 -0
- package/dist/cdn/foxy-email-template-card.js +1 -1
- package/dist/cdn/foxy-email-template-form.js +1 -1
- package/dist/cdn/foxy-error-entry-card.js +1 -1
- package/dist/cdn/foxy-form-dialog.js +1 -1
- package/dist/cdn/foxy-generate-codes-form.js +1 -1
- package/dist/cdn/foxy-gift-card-card.js +1 -1
- package/dist/cdn/foxy-gift-card-code-form.js +1 -1
- package/dist/cdn/foxy-gift-card-code-log-card.js +1 -1
- package/dist/cdn/foxy-gift-card-codes-form.js +1 -1
- package/dist/cdn/foxy-gift-card-form.js +1 -1
- package/dist/cdn/foxy-i18n-editor.js +2 -2
- package/dist/cdn/foxy-i18n.js +1 -1
- package/dist/cdn/foxy-integration-card.js +1 -1
- package/dist/cdn/foxy-integration-form.js +1 -1
- package/dist/cdn/foxy-item-card.js +1 -1
- package/dist/cdn/foxy-item-category-card.js +1 -1
- package/dist/cdn/foxy-item-category-form.js +1 -1
- package/dist/cdn/foxy-item-form.js +1 -1
- package/dist/cdn/foxy-item-option-card.js +1 -1
- package/dist/cdn/foxy-item-option-form.js +1 -1
- package/dist/cdn/foxy-items-form.js +1 -1
- package/dist/cdn/foxy-pagination.js +1 -1
- package/dist/cdn/foxy-payment-card.js +1 -1
- package/dist/cdn/foxy-payment-method-card.js +1 -1
- package/dist/cdn/foxy-payments-api-fraud-protection-card.js +1 -1
- package/dist/cdn/foxy-payments-api-fraud-protection-form.js +1 -1
- package/dist/cdn/foxy-payments-api-payment-method-card.js +1 -1
- package/dist/cdn/foxy-payments-api-payment-method-form.js +1 -1
- package/dist/cdn/foxy-payments-api-payment-preset-card.js +1 -1
- package/dist/cdn/foxy-payments-api-payment-preset-form.js +1 -1
- package/dist/cdn/foxy-query-builder.js +1 -1
- package/dist/cdn/foxy-report-form.js +2 -2
- package/dist/cdn/foxy-reports-table.js +1 -1
- package/dist/cdn/foxy-shipment-card.js +1 -1
- package/dist/cdn/foxy-shipping-method-card.js +1 -1
- package/dist/cdn/foxy-sign-in-form.js +1 -1
- package/dist/cdn/foxy-spinner.js +2 -2
- package/dist/cdn/foxy-store-card.js +1 -1
- package/dist/cdn/foxy-store-form.js +1 -1
- package/dist/cdn/foxy-store-shipping-method-form.js +1 -1
- package/dist/cdn/foxy-subscription-card.js +1 -1
- package/dist/cdn/foxy-subscription-form.js +1 -1
- package/dist/cdn/foxy-subscription-settings-form.js +1 -1
- package/dist/cdn/foxy-subscriptions-table.js +1 -1
- package/dist/cdn/foxy-table.js +1 -1
- package/dist/cdn/foxy-tax-card.js +1 -1
- package/dist/cdn/foxy-tax-form.js +1 -1
- package/dist/cdn/foxy-template-config-form.js +1 -1
- package/dist/cdn/foxy-template-form.js +1 -1
- package/dist/cdn/foxy-template-set-card.js +1 -1
- package/dist/cdn/foxy-template-set-form.js +1 -1
- package/dist/cdn/foxy-transaction-card.js +1 -1
- package/dist/cdn/foxy-transaction.js +1 -1
- package/dist/cdn/foxy-transactions-table.js +7 -7
- package/dist/cdn/foxy-user-card.js +1 -1
- package/dist/cdn/foxy-user-form.js +1 -1
- package/dist/cdn/foxy-users-table.js +1 -1
- package/dist/cdn/foxy-webhook-card.js +1 -1
- package/dist/cdn/foxy-webhook-form.js +1 -1
- package/dist/cdn/foxy-webhook-log-card.js +1 -1
- package/dist/cdn/foxy-webhook-status-card.js +1 -1
- package/dist/cdn/shared-014f1513.js +1 -0
- package/dist/cdn/{shared-e6d3d6f5.js → shared-01ad847f.js} +1 -1
- package/dist/cdn/{shared-698c9002.js → shared-03858aee.js} +1 -1
- package/dist/cdn/{shared-a306168b.js → shared-055ca9db.js} +1 -1
- package/dist/cdn/{shared-a19ce620.js → shared-06c64816.js} +1 -1
- package/dist/cdn/{shared-685ca959.js → shared-15c94a90.js} +1 -1
- package/dist/cdn/{shared-f628a723.js → shared-178f7222.js} +1 -1
- package/dist/cdn/{shared-aa5785d9.js → shared-1a6fb0f3.js} +1 -1
- package/dist/cdn/{shared-1bd28b9c.js → shared-1a9496d4.js} +1 -1
- package/dist/cdn/{shared-b590adb2.js → shared-1f4b9c6b.js} +1 -1
- package/dist/cdn/{shared-5c5d13bd.js → shared-24a762c1.js} +1 -1
- package/dist/cdn/{shared-f42077ab.js → shared-2c6ea96d.js} +1 -1
- package/dist/cdn/{shared-50c6daa1.js → shared-38ed7905.js} +1 -1
- package/dist/cdn/{shared-87405fc7.js → shared-3b8b5eda.js} +3 -3
- package/dist/cdn/{shared-26390fea.js → shared-3b9b9427.js} +1 -1
- package/dist/cdn/{shared-67790b63.js → shared-4055f94a.js} +1 -1
- package/dist/cdn/{shared-cf49ce0c.js → shared-473aaeff.js} +1 -1
- package/dist/cdn/{shared-fad30ff5.js → shared-499c6db5.js} +1 -1
- package/dist/cdn/{shared-5a09ad7e.js → shared-49b65f1e.js} +1 -1
- package/dist/cdn/{shared-ccfb87fb.js → shared-4ac2a677.js} +1 -1
- package/dist/cdn/{shared-9e18688d.js → shared-533c3914.js} +3 -3
- package/dist/cdn/{shared-83a12835.js → shared-5425e3d3.js} +3 -3
- package/dist/cdn/{shared-468eb208.js → shared-57c6cfd1.js} +2 -2
- package/dist/cdn/{shared-493b8bc1.js → shared-590d8dae.js} +1 -1
- package/dist/cdn/{shared-7163796c.js → shared-5fbda766.js} +1 -1
- package/dist/cdn/{shared-445dda5a.js → shared-668947de.js} +1 -1
- package/dist/cdn/{shared-ffb6c2d3.js → shared-6f4005e5.js} +1 -1
- package/dist/cdn/{shared-308e67f3.js → shared-72817759.js} +1 -1
- package/dist/cdn/{shared-a6deb2a4.js → shared-7e9c240a.js} +1 -1
- package/dist/cdn/{shared-5cf7e764.js → shared-809df8d2.js} +1 -1
- package/dist/cdn/{shared-53af541e.js → shared-82f873bd.js} +1 -1
- package/dist/cdn/{shared-6860c8d1.js → shared-8b0c77a7.js} +1 -1
- package/dist/cdn/{shared-d7b778b7.js → shared-9271a609.js} +1 -1
- package/dist/cdn/{shared-00d2cbe9.js → shared-950875f2.js} +1 -1
- package/dist/cdn/{shared-f8bcab5c.js → shared-963c4a87.js} +1 -1
- package/dist/cdn/{shared-5a445ebd.js → shared-9725c399.js} +1 -1
- package/dist/cdn/{shared-dfe7652e.js → shared-9e04b9c3.js} +1 -1
- package/dist/cdn/{shared-b2d6bbad.js → shared-9e8bff76.js} +1 -1
- package/dist/cdn/shared-b137f17a.js +1 -0
- package/dist/cdn/{shared-5897f089.js → shared-b23ccea9.js} +1 -1
- package/dist/cdn/{shared-2b1c3f7a.js → shared-b2474263.js} +1 -1
- package/dist/cdn/{shared-c5fe5675.js → shared-bc36bc72.js} +1 -1
- package/dist/cdn/{shared-643791c8.js → shared-bcc4cf7f.js} +1 -1
- package/dist/cdn/{shared-2bae351a.js → shared-be591e92.js} +1 -1
- package/dist/cdn/shared-c0816371.js +1 -0
- package/dist/cdn/{shared-5ec39f11.js → shared-c0ec65fa.js} +1 -1
- package/dist/cdn/{shared-2a9718a9.js → shared-c1dd32b6.js} +1 -1
- package/dist/cdn/{shared-01dd0fd6.js → shared-c27aaa05.js} +1 -1
- package/dist/cdn/{shared-3c20c295.js → shared-c2cfc26d.js} +1 -1
- package/dist/cdn/{shared-394981eb.js → shared-c2ec3291.js} +1 -1
- package/dist/cdn/{shared-46c6d1e6.js → shared-c3fa6df1.js} +1 -1
- package/dist/cdn/{shared-10f92654.js → shared-c5106979.js} +1 -1
- package/dist/cdn/shared-cb34d19f.js +1 -0
- package/dist/cdn/{shared-aa678ec4.js → shared-e2f4962c.js} +1 -1
- package/dist/cdn/{shared-14f0cf8e.js → shared-e9c81269.js} +1 -1
- package/dist/cdn/{shared-3a329baf.js → shared-f8e3be56.js} +1 -1
- package/dist/cdn/{shared-8db9452f.js → shared-fcce5337.js} +1 -1
- package/dist/cdn/translations/downloadable-card/en.json +7 -0
- package/dist/cdn/translations/downloadable-form/en.json +65 -0
- package/dist/elements/private/Choice/Choice.d.ts +3 -2
- package/dist/elements/private/Choice/Choice.js +5 -0
- package/dist/elements/private/Choice/Choice.js.map +1 -1
- package/dist/elements/private/Choice/machine.js +33 -0
- package/dist/elements/private/Choice/machine.js.map +1 -1
- package/dist/elements/public/CouponForm/CouponForm.d.ts +1 -5
- package/dist/elements/public/CouponForm/CouponForm.js +27 -289
- package/dist/elements/public/CouponForm/CouponForm.js.map +1 -1
- package/dist/elements/public/CouponForm/index.d.ts +1 -0
- package/dist/elements/public/CouponForm/index.js +1 -0
- package/dist/elements/public/CouponForm/index.js.map +1 -1
- package/dist/elements/public/CouponForm/types.d.ts +0 -24
- package/dist/elements/public/CouponForm/types.js.map +1 -1
- package/dist/elements/public/DiscountBuilder/DiscountBuilder.js +8 -4
- package/dist/elements/public/DiscountBuilder/DiscountBuilder.js.map +1 -1
- package/dist/elements/public/Donation/Donation.js +3 -3
- package/dist/elements/public/Donation/Donation.js.map +1 -1
- package/dist/elements/public/DownloadableCard/DownloadableCard.d.ts +21 -0
- package/dist/elements/public/DownloadableCard/DownloadableCard.js +84 -0
- package/dist/elements/public/DownloadableCard/DownloadableCard.js.map +1 -0
- package/dist/elements/public/DownloadableCard/index.d.ts +6 -0
- package/dist/elements/public/DownloadableCard/index.js +8 -0
- package/dist/elements/public/DownloadableCard/index.js.map +1 -0
- package/dist/elements/public/DownloadableCard/types.d.ts +8 -0
- package/dist/elements/public/DownloadableCard/types.js +2 -0
- package/dist/elements/public/DownloadableCard/types.js.map +1 -0
- package/dist/elements/public/DownloadableForm/DownloadableForm.d.ts +54 -0
- package/dist/elements/public/DownloadableForm/DownloadableForm.js +149 -0
- package/dist/elements/public/DownloadableForm/DownloadableForm.js.map +1 -0
- package/dist/elements/public/DownloadableForm/index.d.ts +8 -0
- package/dist/elements/public/DownloadableForm/index.js +10 -0
- package/dist/elements/public/DownloadableForm/index.js.map +1 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/InternalDownloadableFormUploadControl.d.ts +11 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/InternalDownloadableFormUploadControl.js +124 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/InternalDownloadableFormUploadControl.js.map +1 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/index.d.ts +6 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/index.js +8 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/index.js.map +1 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/style.d.ts +1 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/style.js +42 -0
- package/dist/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/style.js.map +1 -0
- package/dist/elements/public/DownloadableForm/types.d.ts +11 -0
- package/dist/elements/public/DownloadableForm/types.js +2 -0
- package/dist/elements/public/DownloadableForm/types.js.map +1 -0
- package/dist/elements/public/FormDialog/FormDialog.d.ts +4 -0
- package/dist/elements/public/FormDialog/FormDialog.js +18 -7
- package/dist/elements/public/FormDialog/FormDialog.js.map +1 -1
- package/dist/elements/public/I18n/format/discount.js +1 -1
- package/dist/elements/public/I18n/format/discount.js.map +1 -1
- package/dist/elements/public/I18n/format/percent.js +4 -3
- package/dist/elements/public/I18n/format/percent.js.map +1 -1
- package/dist/elements/public/index.d.ts +2 -0
- package/dist/elements/public/index.defined.d.ts +2 -0
- package/dist/elements/public/index.defined.js +2 -0
- package/dist/elements/public/index.defined.js.map +1 -1
- package/dist/elements/public/index.js +2 -0
- package/dist/elements/public/index.js.map +1 -1
- package/dist/mixins/themeable.js +4 -0
- package/dist/mixins/themeable.js.map +1 -1
- package/package.json +1 -1
- package/dist/cdn/shared-095ad002.js +0 -1
- package/dist/cdn/shared-349bbd7e.js +0 -1
- package/dist/cdn/shared-7f47c677.js +0 -1
- package/dist/cdn/shared-9eeb2bec.js +0 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { TranslatableMixin } from "../../../mixins/translatable.js";
|
|
2
|
+
import { BooleanSelector } from '@foxy.io/sdk/core';
|
|
3
|
+
import { InternalForm } from "../../internal/InternalForm/InternalForm.js";
|
|
4
|
+
import { ifDefined } from 'lit-html/directives/if-defined';
|
|
5
|
+
import { html } from 'lit-element';
|
|
6
|
+
const NS = 'downloadable-form';
|
|
7
|
+
const Base = TranslatableMixin(InternalForm, NS);
|
|
8
|
+
/**
|
|
9
|
+
* Basic form for managing `fx:downloadable` resources.
|
|
10
|
+
* This element requires an augmented version of hAPI currently limited
|
|
11
|
+
* only to the new Foxy Admin.
|
|
12
|
+
*
|
|
13
|
+
* @slot item-category-uri:before
|
|
14
|
+
* @slot item-category-uri:after
|
|
15
|
+
*
|
|
16
|
+
* @slot name:before
|
|
17
|
+
* @slot name:after
|
|
18
|
+
*
|
|
19
|
+
* @slot code:before
|
|
20
|
+
* @slot code:after
|
|
21
|
+
*
|
|
22
|
+
* @slot price:before
|
|
23
|
+
* @slot price:after
|
|
24
|
+
*
|
|
25
|
+
* @slot upload:before
|
|
26
|
+
* @slot upload:after
|
|
27
|
+
*
|
|
28
|
+
* @slot timestamps:before
|
|
29
|
+
* @slot timestamps:after
|
|
30
|
+
*
|
|
31
|
+
* @slot create:before
|
|
32
|
+
* @slot create:after
|
|
33
|
+
*
|
|
34
|
+
* @slot delete:before
|
|
35
|
+
* @slot delete:after
|
|
36
|
+
*
|
|
37
|
+
* @element foxy-downloadable-form
|
|
38
|
+
* @since 1.22.0
|
|
39
|
+
*/
|
|
40
|
+
export class DownloadableForm extends Base {
|
|
41
|
+
constructor() {
|
|
42
|
+
super(...arguments);
|
|
43
|
+
/** URL of the `fx:downloadable_item_categories` collection for the store. */
|
|
44
|
+
this.downloadableItemCategories = null;
|
|
45
|
+
this.__downloadableItemCategoryLoaderId = 'downloadableItemCategoryLoader';
|
|
46
|
+
}
|
|
47
|
+
static get properties() {
|
|
48
|
+
return {
|
|
49
|
+
...super.properties,
|
|
50
|
+
downloadableItemCategories: { attribute: 'downloadable-item-categories' },
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
static get v8n() {
|
|
54
|
+
return [
|
|
55
|
+
({ item_category_uri: v }) => !!v || 'item-category-uri:v8n_required',
|
|
56
|
+
({ file_name: v }) => !!v || 'upload:v8n_required',
|
|
57
|
+
({ price: v }) => typeof v === 'number' || 'price:v8n_required',
|
|
58
|
+
({ price: v }) => !v || v >= 0 || 'price:v8n_negative',
|
|
59
|
+
({ name: v }) => !!v || 'name:v8n_required',
|
|
60
|
+
({ name: v }) => !v || v.length <= 100 || 'name:v8n_too_long',
|
|
61
|
+
({ code: v }) => !!v || 'code:v8n_required',
|
|
62
|
+
({ code: v }) => !v || v.length <= 50 || 'code:v8n_too_long',
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
get disabledSelector() {
|
|
66
|
+
const alwaysDisabled = [];
|
|
67
|
+
const loader = this.__downloadableItemCategoryLoader;
|
|
68
|
+
if (!(loader === null || loader === void 0 ? void 0 : loader.in('idle')))
|
|
69
|
+
alwaysDisabled.push('item-category-uri');
|
|
70
|
+
return new BooleanSelector(`${alwaysDisabled.join(' ')}${super.disabledSelector}`);
|
|
71
|
+
}
|
|
72
|
+
renderBody() {
|
|
73
|
+
var _a, _b;
|
|
74
|
+
return html `
|
|
75
|
+
<foxy-nucleon
|
|
76
|
+
class="hidden"
|
|
77
|
+
infer=""
|
|
78
|
+
href=${ifDefined(this.form.item_category_uri || void 0)}
|
|
79
|
+
id=${this.__downloadableItemCategoryLoaderId}
|
|
80
|
+
@update=${() => this.requestUpdate()}
|
|
81
|
+
>
|
|
82
|
+
</foxy-nucleon>
|
|
83
|
+
|
|
84
|
+
<foxy-internal-async-combo-box-control
|
|
85
|
+
item-label-path="name"
|
|
86
|
+
item-value-path="_links.self.href"
|
|
87
|
+
item-id-path="_links.self.href"
|
|
88
|
+
infer="item-category-uri"
|
|
89
|
+
first=${ifDefined((_a = this.downloadableItemCategories) !== null && _a !== void 0 ? _a : void 0)}
|
|
90
|
+
.selectedItem=${(_b = this.__downloadableItemCategoryLoader) === null || _b === void 0 ? void 0 : _b.data}
|
|
91
|
+
.setValue=${(newValue) => {
|
|
92
|
+
var _a;
|
|
93
|
+
this.edit({ item_category_uri: newValue });
|
|
94
|
+
const newID = parseInt((_a = newValue.split('/').pop()) !== null && _a !== void 0 ? _a : '');
|
|
95
|
+
if (!isNaN(newID))
|
|
96
|
+
this.edit({ item_category_id: newID });
|
|
97
|
+
}}
|
|
98
|
+
>
|
|
99
|
+
</foxy-internal-async-combo-box-control>
|
|
100
|
+
|
|
101
|
+
<foxy-internal-text-control infer="name"></foxy-internal-text-control>
|
|
102
|
+
<foxy-internal-text-control infer="code"></foxy-internal-text-control>
|
|
103
|
+
<foxy-internal-number-control infer="price" min="0"></foxy-internal-number-control>
|
|
104
|
+
|
|
105
|
+
<foxy-internal-downloadable-form-upload-control infer="upload">
|
|
106
|
+
</foxy-internal-downloadable-form-upload-control>
|
|
107
|
+
|
|
108
|
+
${super.renderBody()}
|
|
109
|
+
`;
|
|
110
|
+
}
|
|
111
|
+
async _sendPatch(edits) {
|
|
112
|
+
const data = await super._sendPatch(edits);
|
|
113
|
+
const createUploadUrl = data._links['fx:create_upload_url'].href;
|
|
114
|
+
const root = this.renderRoot;
|
|
115
|
+
const control = root.querySelector('[infer="upload"]');
|
|
116
|
+
const upload = control === null || control === void 0 ? void 0 : control.uploadElement;
|
|
117
|
+
if (upload && upload.files.length === 1) {
|
|
118
|
+
const file = upload.files[0];
|
|
119
|
+
const url = await this._fetch(createUploadUrl, {
|
|
120
|
+
method: 'POST',
|
|
121
|
+
body: JSON.stringify({ type: file.type }),
|
|
122
|
+
});
|
|
123
|
+
upload.files[0].uploadTarget = url.upload_url;
|
|
124
|
+
upload.uploadFiles();
|
|
125
|
+
}
|
|
126
|
+
return data;
|
|
127
|
+
}
|
|
128
|
+
async _sendPost(edits) {
|
|
129
|
+
const data = await super._sendPost(edits);
|
|
130
|
+
const createUploadUrl = data._links['fx:create_upload_url'].href;
|
|
131
|
+
const root = this.renderRoot;
|
|
132
|
+
const control = root.querySelector('[infer="upload"]');
|
|
133
|
+
const upload = control === null || control === void 0 ? void 0 : control.uploadElement;
|
|
134
|
+
if (upload && upload.files.length === 1) {
|
|
135
|
+
const file = upload.files[0];
|
|
136
|
+
const url = await this._fetch(createUploadUrl, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
body: JSON.stringify({ type: file.type }),
|
|
139
|
+
});
|
|
140
|
+
upload.files[0].uploadTarget = url.upload_url;
|
|
141
|
+
upload.uploadFiles();
|
|
142
|
+
}
|
|
143
|
+
return data;
|
|
144
|
+
}
|
|
145
|
+
get __downloadableItemCategoryLoader() {
|
|
146
|
+
return this.renderRoot.querySelector(`#${this.__downloadableItemCategoryLoaderId}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=DownloadableForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DownloadableForm.js","sourceRoot":"","sources":["../../../../src/elements/public/DownloadableForm/DownloadableForm.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalDownloadableFormUploadControl } from './internal/InternalDownloadableFormUploadControl';\nimport type { PropertyDeclarations } from 'lit-element';\nimport type { TemplateResult } from 'lit-html';\nimport type { NucleonElement } from '../NucleonElement';\nimport type { NucleonV8N } from '../NucleonElement/types';\nimport type { Resource } from '@foxy.io/sdk/core';\nimport type { Rels } from '@foxy.io/sdk/backend';\nimport type { Data } from './types';\n\nimport { TranslatableMixin } from '../../../mixins/translatable';\nimport { BooleanSelector } from '@foxy.io/sdk/core';\nimport { InternalForm } from '../../internal/InternalForm/InternalForm';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { html } from 'lit-element';\n\nconst NS = 'downloadable-form';\nconst Base = TranslatableMixin(InternalForm, NS);\n\n/**\n * Basic form for managing `fx:downloadable` resources.\n * This element requires an augmented version of hAPI currently limited\n * only to the new Foxy Admin.\n *\n * @slot item-category-uri:before\n * @slot item-category-uri:after\n *\n * @slot name:before\n * @slot name:after\n *\n * @slot code:before\n * @slot code:after\n *\n * @slot price:before\n * @slot price:after\n *\n * @slot upload:before\n * @slot upload:after\n *\n * @slot timestamps:before\n * @slot timestamps:after\n *\n * @slot create:before\n * @slot create:after\n *\n * @slot delete:before\n * @slot delete:after\n *\n * @element foxy-downloadable-form\n * @since 1.22.0\n */\nexport class DownloadableForm extends Base<Data> {\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n downloadableItemCategories: { attribute: 'downloadable-item-categories' },\n };\n }\n\n static get v8n(): NucleonV8N<Data> {\n return [\n ({ item_category_uri: v }) => !!v || 'item-category-uri:v8n_required',\n ({ file_name: v }) => !!v || 'upload:v8n_required',\n ({ price: v }) => typeof v === 'number' || 'price:v8n_required',\n ({ price: v }) => !v || v >= 0 || 'price:v8n_negative',\n ({ name: v }) => !!v || 'name:v8n_required',\n ({ name: v }) => !v || v.length <= 100 || 'name:v8n_too_long',\n ({ code: v }) => !!v || 'code:v8n_required',\n ({ code: v }) => !v || v.length <= 50 || 'code:v8n_too_long',\n ];\n }\n\n /** URL of the `fx:downloadable_item_categories` collection for the store. */\n downloadableItemCategories: string | null = null;\n\n private readonly __downloadableItemCategoryLoaderId = 'downloadableItemCategoryLoader';\n\n get disabledSelector(): BooleanSelector {\n const alwaysDisabled: string[] = [];\n const loader = this.__downloadableItemCategoryLoader;\n if (!loader?.in('idle')) alwaysDisabled.push('item-category-uri');\n return new BooleanSelector(`${alwaysDisabled.join(' ')}${super.disabledSelector}`);\n }\n\n renderBody(): TemplateResult {\n return html`\n <foxy-nucleon\n class=\"hidden\"\n infer=\"\"\n href=${ifDefined(this.form.item_category_uri || void 0)}\n id=${this.__downloadableItemCategoryLoaderId}\n @update=${() => this.requestUpdate()}\n >\n </foxy-nucleon>\n\n <foxy-internal-async-combo-box-control\n item-label-path=\"name\"\n item-value-path=\"_links.self.href\"\n item-id-path=\"_links.self.href\"\n infer=\"item-category-uri\"\n first=${ifDefined(this.downloadableItemCategories ?? void 0)}\n .selectedItem=${this.__downloadableItemCategoryLoader?.data}\n .setValue=${(newValue: string) => {\n this.edit({ item_category_uri: newValue });\n const newID = parseInt(newValue.split('/').pop() ?? '');\n if (!isNaN(newID)) this.edit({ item_category_id: newID });\n }}\n >\n </foxy-internal-async-combo-box-control>\n\n <foxy-internal-text-control infer=\"name\"></foxy-internal-text-control>\n <foxy-internal-text-control infer=\"code\"></foxy-internal-text-control>\n <foxy-internal-number-control infer=\"price\" min=\"0\"></foxy-internal-number-control>\n\n <foxy-internal-downloadable-form-upload-control infer=\"upload\">\n </foxy-internal-downloadable-form-upload-control>\n\n ${super.renderBody()}\n `;\n }\n\n protected async _sendPatch(edits: Partial<Data>): Promise<Data> {\n type UploadUrl = { upload_url: string };\n\n const data = await super._sendPatch(edits);\n const createUploadUrl = data._links['fx:create_upload_url'].href;\n const root = this.renderRoot;\n const control = root.querySelector<InternalDownloadableFormUploadControl>('[infer=\"upload\"]');\n const upload = control?.uploadElement;\n\n if (upload && upload.files.length === 1) {\n const file = upload.files[0];\n const url = await this._fetch<UploadUrl>(createUploadUrl, {\n method: 'POST',\n body: JSON.stringify({ type: file.type }),\n });\n\n upload.files[0].uploadTarget = url.upload_url;\n upload.uploadFiles();\n }\n\n return data;\n }\n\n protected async _sendPost(edits: Partial<Data>): Promise<Data> {\n type UploadUrl = { upload_url: string };\n\n const data = await super._sendPost(edits);\n const createUploadUrl = data._links['fx:create_upload_url'].href;\n const root = this.renderRoot;\n const control = root.querySelector<InternalDownloadableFormUploadControl>('[infer=\"upload\"]');\n const upload = control?.uploadElement;\n\n if (upload && upload.files.length === 1) {\n const file = upload.files[0];\n const url = await this._fetch<UploadUrl>(createUploadUrl, {\n method: 'POST',\n body: JSON.stringify({ type: file.type }),\n });\n\n upload.files[0].uploadTarget = url.upload_url;\n upload.uploadFiles();\n }\n\n return data;\n }\n\n private get __downloadableItemCategoryLoader() {\n type Loader = NucleonElement<Resource<Rels.ItemCategory>>;\n return this.renderRoot.querySelector<Loader>(`#${this.__downloadableItemCategoryLoaderId}`);\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import './internal/InternalDownloadableFormUploadControl/index';
|
|
2
|
+
import '../../internal/InternalAsyncComboBoxControl/index';
|
|
3
|
+
import '../../internal/InternalNumberControl/index';
|
|
4
|
+
import '../../internal/InternalTextControl/index';
|
|
5
|
+
import '../../internal/InternalForm/index';
|
|
6
|
+
import '../NucleonElement/index';
|
|
7
|
+
import { DownloadableForm } from './DownloadableForm';
|
|
8
|
+
export { DownloadableForm };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "./internal/InternalDownloadableFormUploadControl/index.js";
|
|
2
|
+
import "../../internal/InternalAsyncComboBoxControl/index.js";
|
|
3
|
+
import "../../internal/InternalNumberControl/index.js";
|
|
4
|
+
import "../../internal/InternalTextControl/index.js";
|
|
5
|
+
import "../../internal/InternalForm/index.js";
|
|
6
|
+
import "../NucleonElement/index.js";
|
|
7
|
+
import { DownloadableForm } from "./DownloadableForm.js";
|
|
8
|
+
customElements.define('foxy-downloadable-form', DownloadableForm);
|
|
9
|
+
export { DownloadableForm };
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/elements/public/DownloadableForm/index.ts"],"names":[],"mappings":"AAAA,mEAAgE;AAChE,8DAA2D;AAC3D,uDAAoD;AACpD,qDAAkD;AAClD,8CAA2C;AAC3C,oCAAiC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,8BAA2B;AAEtD,cAAc,CAAC,MAAM,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import './internal/InternalDownloadableFormUploadControl/index';\nimport '../../internal/InternalAsyncComboBoxControl/index';\nimport '../../internal/InternalNumberControl/index';\nimport '../../internal/InternalTextControl/index';\nimport '../../internal/InternalForm/index';\nimport '../NucleonElement/index';\n\nimport { DownloadableForm } from './DownloadableForm';\n\ncustomElements.define('foxy-downloadable-form', DownloadableForm);\n\nexport { DownloadableForm };\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UploadElement } from '@vaadin/vaadin-upload';
|
|
2
|
+
import { TemplateResult } from 'lit-html';
|
|
3
|
+
import { InternalControl } from '../../../../internal/InternalControl/InternalControl';
|
|
4
|
+
export declare class InternalDownloadableFormUploadControl extends InternalControl {
|
|
5
|
+
get uploadElement(): UploadElement | null;
|
|
6
|
+
renderControl(): TemplateResult;
|
|
7
|
+
updated(changes: Map<keyof this, unknown>): void;
|
|
8
|
+
private get __uploadI18n();
|
|
9
|
+
private __handleUploadRequest;
|
|
10
|
+
private __handleFilesChanged;
|
|
11
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { html } from 'lit-html';
|
|
2
|
+
import { InternalControl } from "../../../../internal/InternalControl/InternalControl.js";
|
|
3
|
+
import { ifDefined } from 'lit-html/directives/if-defined';
|
|
4
|
+
import { classMap } from "../../../../../utils/class-map.js";
|
|
5
|
+
export class InternalDownloadableFormUploadControl extends InternalControl {
|
|
6
|
+
get uploadElement() {
|
|
7
|
+
return this.renderRoot.querySelector('vaadin-upload');
|
|
8
|
+
}
|
|
9
|
+
renderControl() {
|
|
10
|
+
return html `
|
|
11
|
+
<section
|
|
12
|
+
class=${classMap({
|
|
13
|
+
'grid gap-xs group leading-xs transition-colors': true,
|
|
14
|
+
'hover-text-body': !this.disabled && !this.readonly,
|
|
15
|
+
'text-secondary': !this.disabled,
|
|
16
|
+
'text-disabled': this.disabled,
|
|
17
|
+
})}
|
|
18
|
+
>
|
|
19
|
+
<foxy-i18n infer="" class="font-medium text-s" key="label"></foxy-i18n>
|
|
20
|
+
|
|
21
|
+
<vaadin-upload
|
|
22
|
+
max-file-size="524288000"
|
|
23
|
+
max-files=${ifDefined(this.disabled || this.readonly ? '0' : '2')}
|
|
24
|
+
style="padding: calc((0.625em + (var(--lumo-border-radius) / 4) - 1px) - var(--lumo-space-xs)) calc(0.625em + (var(--lumo-border-radius) / 4) - 1px)"
|
|
25
|
+
class=${classMap({
|
|
26
|
+
'rounded-t-l rounded-b-l border transition-colors': true,
|
|
27
|
+
'border-dashed border-contrast-30': this.readonly,
|
|
28
|
+
'border-solid border-contrast-10': !this.readonly,
|
|
29
|
+
'group-hover-border-contrast-20': !this.disabled && !this.readonly,
|
|
30
|
+
'foxy-downloadable-form-upload': true,
|
|
31
|
+
})}
|
|
32
|
+
method="PUT"
|
|
33
|
+
no-auto
|
|
34
|
+
?disabled=${this.disabled}
|
|
35
|
+
?readonly=${this.readonly}
|
|
36
|
+
.i18n=${this.__uploadI18n}
|
|
37
|
+
@files-changed=${this.__handleFilesChanged}
|
|
38
|
+
@upload-request=${this.__handleUploadRequest}
|
|
39
|
+
>
|
|
40
|
+
</vaadin-upload>
|
|
41
|
+
|
|
42
|
+
<foxy-i18n infer="" class="text-xs" key="helper_text"></foxy-i18n>
|
|
43
|
+
</section>
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
updated(changes) {
|
|
47
|
+
super.updated(changes);
|
|
48
|
+
const nucleon = this.nucleon;
|
|
49
|
+
const upload = this.renderRoot.querySelector('vaadin-upload');
|
|
50
|
+
if (upload && nucleon) {
|
|
51
|
+
if (nucleon.in({ idle: { snapshot: 'clean' } }) && upload.files.length === 0) {
|
|
52
|
+
upload.files = [
|
|
53
|
+
// @ts-expect-error type doesn't match but it's ok because vaadin docs suggest this as a solution
|
|
54
|
+
{
|
|
55
|
+
complete: true,
|
|
56
|
+
progress: 100,
|
|
57
|
+
status: this.t('status_complete'),
|
|
58
|
+
name: nucleon.data.file_name,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
else if (nucleon.in({ idle: { template: 'clean' } })) {
|
|
63
|
+
upload.files = [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
get __uploadI18n() {
|
|
68
|
+
return {
|
|
69
|
+
dropFiles: {
|
|
70
|
+
one: this.t('drop_label'),
|
|
71
|
+
many: this.t('drop_label'),
|
|
72
|
+
},
|
|
73
|
+
addFiles: {
|
|
74
|
+
one: this.t('select_label'),
|
|
75
|
+
many: this.t('select_label'),
|
|
76
|
+
},
|
|
77
|
+
cancel: this.t('cancel'),
|
|
78
|
+
error: {
|
|
79
|
+
tooManyFiles: this.t('error_too_many_files'),
|
|
80
|
+
fileIsTooBig: this.t('error_too_big'),
|
|
81
|
+
incorrectFileType: '',
|
|
82
|
+
},
|
|
83
|
+
uploading: {
|
|
84
|
+
status: {
|
|
85
|
+
connecting: this.t('status_connecting'),
|
|
86
|
+
stalled: this.t('status_stalled'),
|
|
87
|
+
processing: this.t('status_processing'),
|
|
88
|
+
held: this.t('status_held'),
|
|
89
|
+
},
|
|
90
|
+
remainingTime: {
|
|
91
|
+
prefix: this.t('remaining_prefix'),
|
|
92
|
+
unknown: this.t('remaining_unknown'),
|
|
93
|
+
},
|
|
94
|
+
error: {
|
|
95
|
+
serverUnavailable: this.t('error_server_unavailable'),
|
|
96
|
+
unexpectedServerError: this.t('error_unexpected_server_error'),
|
|
97
|
+
forbidden: this.t('error_forbidden'),
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
units: {
|
|
101
|
+
size: ['B', 'KB', 'MB', 'GB'],
|
|
102
|
+
sizeBase: 1024,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
__handleUploadRequest(evt) {
|
|
107
|
+
evt.preventDefault();
|
|
108
|
+
evt.detail.xhr.send(evt.detail.file);
|
|
109
|
+
}
|
|
110
|
+
__handleFilesChanged(evt) {
|
|
111
|
+
var _a, _b, _c;
|
|
112
|
+
const upload = evt.currentTarget;
|
|
113
|
+
const nucleon = this.nucleon;
|
|
114
|
+
const files = upload.files;
|
|
115
|
+
if (files.length > 1)
|
|
116
|
+
upload.files = [upload.files[0]];
|
|
117
|
+
if (((_a = files[0]) === null || _a === void 0 ? void 0 : _a.complete) && !files[0].status)
|
|
118
|
+
files[0].status = this.t('status_complete');
|
|
119
|
+
const newName = (_c = (_b = upload.files[0]) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '';
|
|
120
|
+
if (newName !== (nucleon === null || nucleon === void 0 ? void 0 : nucleon.form.file_name))
|
|
121
|
+
nucleon === null || nucleon === void 0 ? void 0 : nucleon.edit({ file_name: newName });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=InternalDownloadableFormUploadControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InternalDownloadableFormUploadControl.js","sourceRoot":"","sources":["../../../../../../src/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/InternalDownloadableFormUploadControl.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DownloadableForm } from '../../DownloadableForm';\nimport type { UploadElement } from '@vaadin/vaadin-upload';\n\nimport { html, TemplateResult } from 'lit-html';\nimport { InternalControl } from '../../../../internal/InternalControl/InternalControl';\nimport { ifDefined } from 'lit-html/directives/if-defined';\nimport { classMap } from '../../../../../utils/class-map';\n\nexport class InternalDownloadableFormUploadControl extends InternalControl {\n get uploadElement(): UploadElement | null {\n return this.renderRoot.querySelector<UploadElement>('vaadin-upload');\n }\n\n renderControl(): TemplateResult {\n return html`\n <section\n class=${classMap({\n 'grid gap-xs group leading-xs transition-colors': true,\n 'hover-text-body': !this.disabled && !this.readonly,\n 'text-secondary': !this.disabled,\n 'text-disabled': this.disabled,\n })}\n >\n <foxy-i18n infer=\"\" class=\"font-medium text-s\" key=\"label\"></foxy-i18n>\n\n <vaadin-upload\n max-file-size=\"524288000\"\n max-files=${ifDefined(this.disabled || this.readonly ? '0' : '2')}\n style=\"padding: calc((0.625em + (var(--lumo-border-radius) / 4) - 1px) - var(--lumo-space-xs)) calc(0.625em + (var(--lumo-border-radius) / 4) - 1px)\"\n class=${classMap({\n 'rounded-t-l rounded-b-l border transition-colors': true,\n 'border-dashed border-contrast-30': this.readonly,\n 'border-solid border-contrast-10': !this.readonly,\n 'group-hover-border-contrast-20': !this.disabled && !this.readonly,\n 'foxy-downloadable-form-upload': true,\n })}\n method=\"PUT\"\n no-auto\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n .i18n=${this.__uploadI18n}\n @files-changed=${this.__handleFilesChanged}\n @upload-request=${this.__handleUploadRequest}\n >\n </vaadin-upload>\n\n <foxy-i18n infer=\"\" class=\"text-xs\" key=\"helper_text\"></foxy-i18n>\n </section>\n `;\n }\n\n updated(changes: Map<keyof this, unknown>): void {\n super.updated(changes);\n\n const nucleon = this.nucleon as DownloadableForm | null;\n const upload = this.renderRoot.querySelector<UploadElement>('vaadin-upload');\n\n if (upload && nucleon) {\n if (nucleon.in({ idle: { snapshot: 'clean' } }) && upload.files.length === 0) {\n upload.files = [\n // @ts-expect-error type doesn't match but it's ok because vaadin docs suggest this as a solution\n {\n complete: true,\n progress: 100,\n status: this.t('status_complete'),\n name: nucleon.data.file_name,\n },\n ];\n } else if (nucleon.in({ idle: { template: 'clean' } })) {\n upload.files = [];\n }\n }\n }\n\n private get __uploadI18n() {\n return {\n dropFiles: {\n one: this.t('drop_label'),\n many: this.t('drop_label'),\n },\n addFiles: {\n one: this.t('select_label'),\n many: this.t('select_label'),\n },\n cancel: this.t('cancel'),\n error: {\n tooManyFiles: this.t('error_too_many_files'),\n fileIsTooBig: this.t('error_too_big'),\n incorrectFileType: '',\n },\n uploading: {\n status: {\n connecting: this.t('status_connecting'),\n stalled: this.t('status_stalled'),\n processing: this.t('status_processing'),\n held: this.t('status_held'),\n },\n remainingTime: {\n prefix: this.t('remaining_prefix'),\n unknown: this.t('remaining_unknown'),\n },\n error: {\n serverUnavailable: this.t('error_server_unavailable'),\n unexpectedServerError: this.t('error_unexpected_server_error'),\n forbidden: this.t('error_forbidden'),\n },\n },\n units: {\n size: ['B', 'KB', 'MB', 'GB'],\n sizeBase: 1024,\n },\n };\n }\n\n private __handleUploadRequest(evt: CustomEvent<{ xhr: XMLHttpRequest; file: File }>) {\n evt.preventDefault();\n evt.detail.xhr.send(evt.detail.file);\n }\n\n private __handleFilesChanged(evt: CustomEvent) {\n const upload = evt.currentTarget as UploadElement;\n const nucleon = this.nucleon as DownloadableForm | null;\n\n const files = upload.files;\n if (files.length > 1) upload.files = [upload.files[0]];\n if (files[0]?.complete && !files[0].status) files[0].status = this.t('status_complete');\n\n const newName = upload.files[0]?.name ?? '';\n if (newName !== nucleon?.form.file_name) nucleon?.edit({ file_name: newName });\n }\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import '../../../../internal/InternalControl/index';
|
|
2
|
+
import '@vaadin/vaadin-upload';
|
|
3
|
+
import '../../../I18n/index';
|
|
4
|
+
import './style';
|
|
5
|
+
import { InternalDownloadableFormUploadControl } from './InternalDownloadableFormUploadControl';
|
|
6
|
+
export { InternalDownloadableFormUploadControl };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "../../../../internal/InternalControl/index.js";
|
|
2
|
+
import '@vaadin/vaadin-upload';
|
|
3
|
+
import "../../../I18n/index.js";
|
|
4
|
+
import "./style.js";
|
|
5
|
+
import { InternalDownloadableFormUploadControl } from "./InternalDownloadableFormUploadControl.js";
|
|
6
|
+
customElements.define('foxy-internal-downloadable-form-upload-control', InternalDownloadableFormUploadControl);
|
|
7
|
+
export { InternalDownloadableFormUploadControl };
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/index.ts"],"names":[],"mappings":"AAAA,uDAAoD;AACpD,OAAO,uBAAuB,CAAC;AAC/B,gCAA6B;AAC7B,oBAAiB;AAEjB,OAAO,EAAE,qCAAqC,EAAE,mDAAgD;AAEhG,cAAc,CAAC,MAAM,CACnB,gDAAgD,EAChD,qCAAqC,CACtC,CAAC;AAEF,OAAO,EAAE,qCAAqC,EAAE,CAAC","sourcesContent":["import '../../../../internal/InternalControl/index';\nimport '@vaadin/vaadin-upload';\nimport '../../../I18n/index';\nimport './style';\n\nimport { InternalDownloadableFormUploadControl } from './InternalDownloadableFormUploadControl';\n\ncustomElements.define(\n 'foxy-internal-downloadable-form-upload-control',\n InternalDownloadableFormUploadControl\n);\n\nexport { InternalDownloadableFormUploadControl };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { registerStyles } from '@vaadin/vaadin-themable-mixin/register-styles';
|
|
2
|
+
import { css } from 'lit-element';
|
|
3
|
+
registerStyles('vaadin-upload', css `:host(.foxy-downloadable-form-upload) vaadin-upload-file{
|
|
4
|
+
padding:var(--lumo-space-xs) 0 0 0;
|
|
5
|
+
line-height:var(--lumo-line-height-xs);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(commands){
|
|
9
|
+
margin-right:-4px;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(progress){
|
|
13
|
+
margin-right:2px;
|
|
14
|
+
margin-left:0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(start-button),
|
|
18
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(clear-button),
|
|
19
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(retry-button){
|
|
20
|
+
display:none;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:host(.foxy-downloadable-form-upload[disabled]) vaadin-upload-file::part(status){
|
|
24
|
+
color:var(--lumo-disabled-text-color);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(warning-icon),
|
|
28
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(done-icon){
|
|
29
|
+
width:0;
|
|
30
|
+
margin:0;
|
|
31
|
+
opacity:0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(info){
|
|
35
|
+
align-items:flex-start;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
:host(.foxy-downloadable-form-upload) vaadin-upload-file::part(name){
|
|
39
|
+
font-weight:500;
|
|
40
|
+
}
|
|
41
|
+
`);
|
|
42
|
+
//# sourceMappingURL=style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../../../../../src/elements/public/DownloadableForm/internal/InternalDownloadableFormUploadControl/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,cAAc,CACZ,eAAe,EACf,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCF,CACF,CAAC","sourcesContent":["import { registerStyles } from '@vaadin/vaadin-themable-mixin/register-styles';\nimport { css } from 'lit-element';\n\nregisterStyles(\n 'vaadin-upload',\n css`\n :host(.foxy-downloadable-form-upload) vaadin-upload-file {\n padding: var(--lumo-space-xs) 0 0 0;\n line-height: var(--lumo-line-height-xs);\n }\n\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(commands) {\n margin-right: -4px;\n }\n\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(progress) {\n margin-right: 2px;\n margin-left: 0;\n }\n\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(start-button),\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(clear-button),\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(retry-button) {\n display: none;\n }\n\n :host(.foxy-downloadable-form-upload[disabled]) vaadin-upload-file::part(status) {\n color: var(--lumo-disabled-text-color);\n }\n\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(warning-icon),\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(done-icon) {\n width: 0;\n margin: 0;\n opacity: 0;\n }\n\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(info) {\n align-items: flex-start;\n }\n\n :host(.foxy-downloadable-form-upload) vaadin-upload-file::part(name) {\n font-weight: 500;\n }\n `\n);\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Resource } from '@foxy.io/sdk/core';
|
|
2
|
+
import type { Rels } from '@foxy.io/sdk/backend';
|
|
3
|
+
export declare type Downloadable = Rels.Downloadable & {
|
|
4
|
+
links: {
|
|
5
|
+
'fx:create_upload_url': any;
|
|
6
|
+
};
|
|
7
|
+
props: {
|
|
8
|
+
item_category_id: number;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare type Data = Resource<Downloadable>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/elements/public/DownloadableForm/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Resource } from '@foxy.io/sdk/core';\nimport type { Rels } from '@foxy.io/sdk/backend';\n\nexport type Downloadable = Rels.Downloadable & {\n links: { 'fx:create_upload_url': any };\n props: { item_category_id: number };\n};\nexport type Data = Resource<Downloadable>;\n"]}
|
|
@@ -13,6 +13,10 @@ import { FormRenderer } from './types';
|
|
|
13
13
|
export declare class FormDialog extends Dialog {
|
|
14
14
|
/** @readonly */
|
|
15
15
|
static get properties(): PropertyDeclarations;
|
|
16
|
+
/** If true, FormDialog won't automatically close after the associated form deletes the resource. */
|
|
17
|
+
keepOpenOnDelete: boolean;
|
|
18
|
+
/** If true, FormDialog won't automatically close after the associated form creates a resource. */
|
|
19
|
+
keepOpenOnPost: boolean;
|
|
16
20
|
/** Optional URI list of the related resources (passed to form). */
|
|
17
21
|
related: string[];
|
|
18
22
|
/** Optional URL of the collection this resource belongs to (passed to form). */
|
|
@@ -15,6 +15,10 @@ import { UpdateEvent } from "../NucleonElement/UpdateEvent.js";
|
|
|
15
15
|
export class FormDialog extends Dialog {
|
|
16
16
|
constructor() {
|
|
17
17
|
super(...arguments);
|
|
18
|
+
/** If true, FormDialog won't automatically close after the associated form deletes the resource. */
|
|
19
|
+
this.keepOpenOnDelete = false;
|
|
20
|
+
/** If true, FormDialog won't automatically close after the associated form creates a resource. */
|
|
21
|
+
this.keepOpenOnPost = false;
|
|
18
22
|
/** Optional URI list of the related resources (passed to form). */
|
|
19
23
|
this.related = [];
|
|
20
24
|
/** Optional URL of the collection this resource belongs to (passed to form). */
|
|
@@ -29,18 +33,23 @@ export class FormDialog extends Dialog {
|
|
|
29
33
|
return;
|
|
30
34
|
evt.stopImmediatePropagation();
|
|
31
35
|
evt.preventDefault();
|
|
32
|
-
evt.respondWith(new API(this).fetch(evt.request)
|
|
33
|
-
const wasDeleting = evt.request.url === this.href && evt.request.method === 'DELETE';
|
|
34
|
-
const wasAdding = evt.request.url === this.parent && evt.request.method === 'POST';
|
|
35
|
-
if (response.ok && (wasDeleting || wasAdding))
|
|
36
|
-
this.open = false;
|
|
37
|
-
return response;
|
|
38
|
-
}));
|
|
36
|
+
evt.respondWith(new API(this).fetch(evt.request));
|
|
39
37
|
};
|
|
40
38
|
this.__handleUpdate = (evt) => {
|
|
39
|
+
var _a;
|
|
41
40
|
if (!(evt instanceof UpdateEvent))
|
|
42
41
|
return;
|
|
42
|
+
const result = (_a = evt.detail) === null || _a === void 0 ? void 0 : _a.result;
|
|
43
|
+
const Result = UpdateEvent.UpdateResult;
|
|
44
|
+
if (!this.keepOpenOnPost && result === Result.ResourceCreated)
|
|
45
|
+
this.open = false;
|
|
46
|
+
if (!this.keepOpenOnDelete && result === Result.ResourceDeleted)
|
|
47
|
+
this.open = false;
|
|
43
48
|
const target = evt.currentTarget;
|
|
49
|
+
if (this.parent !== target.parent)
|
|
50
|
+
this.parent = target.parent;
|
|
51
|
+
if (this.href !== target.href)
|
|
52
|
+
this.href = target.href;
|
|
44
53
|
this.closable = !target.in('busy');
|
|
45
54
|
this.editable =
|
|
46
55
|
target.in({ idle: { template: { clean: 'valid' } } }) ||
|
|
@@ -57,6 +66,8 @@ export class FormDialog extends Dialog {
|
|
|
57
66
|
group: { type: String },
|
|
58
67
|
parent: { type: String },
|
|
59
68
|
related: { type: Array },
|
|
69
|
+
keepOpenOnPost: { type: Boolean, attribute: 'keep-open-on-post' },
|
|
70
|
+
keepOpenOnDelete: { type: Boolean, attribute: 'keep-open-on-delete' },
|
|
60
71
|
};
|
|
61
72
|
}
|
|
62
73
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormDialog.js","sourceRoot":"","sources":["../../../../src/elements/public/FormDialog/FormDialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,IAAI,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,GAAG,EAAE,iCAA8B;AAC5C,OAAO,EAAE,MAAM,EAAE,uCAAoC;AAErD,OAAO,EAAE,UAAU,EAAE,wCAAqC;AAI1D,OAAO,EAAE,WAAW,EAAE,yCAAsC;AAE5D;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAW,SAAQ,MAAM;IAAtC;;
|
|
1
|
+
{"version":3,"file":"FormDialog.js","sourceRoot":"","sources":["../../../../src/elements/public/FormDialog/FormDialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,IAAI,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,GAAG,EAAE,iCAA8B;AAC5C,OAAO,EAAE,MAAM,EAAE,uCAAoC;AAErD,OAAO,EAAE,UAAU,EAAE,wCAAqC;AAI1D,OAAO,EAAE,WAAW,EAAE,yCAAsC;AAE5D;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAW,SAAQ,MAAM;IAAtC;;QAeE,oGAAoG;QACpG,qBAAgB,GAAG,KAAK,CAAC;QAEzB,kGAAkG;QAClG,mBAAc,GAAG,KAAK,CAAC;QAEvB,mEAAmE;QACnE,YAAO,GAAa,EAAE,CAAC;QAEvB,gFAAgF;QAChF,WAAM,GAAG,EAAE,CAAC;QAEZ,UAAK,GAAG,EAAE,CAAC;QAEX,6DAA6D;QAC7D,SAAI,GAAG,EAAE,CAAC;QAEF,WAAM,GAAiC,IAAI,CAAC;QAE5C,iBAAY,GAAwB,IAAI,CAAC;QAEzC,kBAAa,GAAG,CAAC,GAAU,EAAE,EAAE;YACrC,IAAI,CAAC,CAAC,GAAG,YAAY,UAAU,CAAC;gBAAE,OAAO;YAEzC,GAAG,CAAC,wBAAwB,EAAE,CAAC;YAC/B,GAAG,CAAC,cAAc,EAAE,CAAC;YACrB,GAAG,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC;QAEM,mBAAc,GAAG,CAAC,GAAU,EAAE,EAAE;;YACtC,IAAI,CAAC,CAAC,GAAG,YAAY,WAAW,CAAC;gBAAE,OAAO;YAE1C,MAAM,MAAM,SAAG,GAAG,CAAC,MAAM,0CAAE,MAAM,CAAC;YAClC,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC;YAExC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,MAAM,KAAK,MAAM,CAAC,eAAe;gBAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YACjF,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,MAAM,KAAK,MAAM,CAAC,eAAe;gBAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAEnF,MAAM,MAAM,GAAG,GAAG,CAAC,aAAsC,CAAC;YAE1D,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAEvD,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ;gBACX,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;oBACrD,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;oBACrD,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC;IAuFJ,CAAC;IArJC,gBAAgB;IAChB,MAAM,KAAK,UAAU;QACnB,OAAO;YACL,GAAG,KAAK,CAAC,UAAU;YACnB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACtB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE;YACxC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACvB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACxB,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACxB,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE;YACjE,gBAAgB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE;SACtE,CAAC;IACJ,CAAC;IAoDD;;;;;;OAMG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,IAAI,CAAC,KAAmC;QAC1C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,QAAQ,CAC9B,SAAS,EACT;aACK,KAAK;;+DAE6C,KAAK;;;;;;;;;;;;;;;;cAgBtD,KAAK,KAAK,CACD,CAAC;SACnB;aAAM;YACL,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;SAC3B;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,gBAAgB;IAChB,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;eAOA,IAAI,CAAC,IAAI;aACX,IAAI,CAAC,EAAE;;gBAEJ,CAAC,GAAoB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;QAI3E,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;;YAClB,OAAO,IAAI,CAAA,GAAG,MAAA,IAAI,CAAC,YAAY,+CAAjB,IAAI,EAAgB;gBAChC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,MAAM,EAAE,IAAI;gBACZ,IAAI;aACL,CAAC,EAAE,CAAC;QACP,CAAC,CAAC;KACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK;QAC1B,IAAI,SAAS,EAAE;YACb,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAA0B,CAAC;YACnF,OAAO,CAAC,IAAI,EAAE,CAAC;SAChB;aAAM;YACL,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC9B;IACH,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,IAAI;QACP,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAA2B,CAAC,MAAM,EAAE,CAAC;IAC7E,CAAC;CACF","sourcesContent":["import { PropertyDeclarations, TemplateResult, html } from 'lit-element';\n\nimport { API } from '../NucleonElement/API';\nimport { Dialog } from '../../private/Dialog/Dialog';\nimport { DialogHideEvent } from '../../private/Dialog/DialogHideEvent';\nimport { FetchEvent } from '../NucleonElement/FetchEvent';\nimport { FormRenderer } from './types';\nimport { InternalConfirmDialog } from '../../internal/InternalConfirmDialog/InternalConfirmDialog';\nimport { NucleonElement } from '../NucleonElement/NucleonElement';\nimport { UpdateEvent } from '../NucleonElement/UpdateEvent';\n\n/**\n * Dialog wrapper for the forms made with NucleonElement.\n *\n * @fires FormDialog#show - Instance of `FormDialog.ShowEvent`. Dispatched after dialog finishes entry transition.\n * @fires FormDialog#hide - Instance of `FormDialog.HideEvent`. Dispatched after dialog finishes exit transition.\n *\n * @element foxy-form-dialog\n * @since 1.1.0\n */\nexport class FormDialog extends Dialog {\n /** @readonly */\n static get properties(): PropertyDeclarations {\n return {\n ...super.properties,\n href: { type: String },\n form: { type: String, noAccessor: true },\n group: { type: String },\n parent: { type: String },\n related: { type: Array },\n keepOpenOnPost: { type: Boolean, attribute: 'keep-open-on-post' },\n keepOpenOnDelete: { type: Boolean, attribute: 'keep-open-on-delete' },\n };\n }\n\n /** If true, FormDialog won't automatically close after the associated form deletes the resource. */\n keepOpenOnDelete = false;\n\n /** If true, FormDialog won't automatically close after the associated form creates a resource. */\n keepOpenOnPost = false;\n\n /** Optional URI list of the related resources (passed to form). */\n related: string[] = [];\n\n /** Optional URL of the collection this resource belongs to (passed to form). */\n parent = '';\n\n group = '';\n\n /** Optional URL of the resource to load (passed to form). */\n href = '';\n\n private __form: string | null | FormRenderer = null;\n\n private __renderForm: FormRenderer | null = null;\n\n private __handleFetch = (evt: Event) => {\n if (!(evt instanceof FetchEvent)) return;\n\n evt.stopImmediatePropagation();\n evt.preventDefault();\n evt.respondWith(new API(this).fetch(evt.request));\n };\n\n private __handleUpdate = (evt: Event) => {\n if (!(evt instanceof UpdateEvent)) return;\n\n const result = evt.detail?.result;\n const Result = UpdateEvent.UpdateResult;\n\n if (!this.keepOpenOnPost && result === Result.ResourceCreated) this.open = false;\n if (!this.keepOpenOnDelete && result === Result.ResourceDeleted) this.open = false;\n\n const target = evt.currentTarget as NucleonElement<never>;\n\n if (this.parent !== target.parent) this.parent = target.parent;\n if (this.href !== target.href) this.href = target.href;\n\n this.closable = !target.in('busy');\n this.editable =\n target.in({ idle: { template: { clean: 'valid' } } }) ||\n target.in({ idle: { template: { dirty: 'valid' } } }) ||\n target.in({ idle: { snapshot: { dirty: 'valid' } } });\n };\n\n /**\n * Form's custom element tag. Generated custom element will have the following attributes:\n *\n * - `parent` – same as `foxy-form-dialog[parent]`;\n * - `href` – same as `foxy-form-dialog[href]`;\n * - `lang` – same as `foxy-form-dialog[lang]`;\n */\n get form(): string | null | FormRenderer {\n return this.__form;\n }\n\n set form(value: string | null | FormRenderer) {\n this.__form = value;\n\n if (typeof value === 'string') {\n this.__renderForm = new Function(\n 'options',\n `return options.html\\`\n <${value}\n id=\"form\"\n ns=\"$\\{options.dialog.ns} $\\{customElements.get('${value}')?.defaultNS ?? ''}\"\n href=\\${options.dialog.href}\n lang=\\${options.dialog.lang}\n group=\\${options.dialog.group}\n parent=\\${options.dialog.parent}\n disabledcontrols=\\${options.dialog.disabledControls.toString()}\n readonlycontrols=\\${options.dialog.readonlyControls.toString()}\n hiddencontrols=\\${options.dialog.hiddenControls.toString()}\n ?disabled=\\${options.dialog.disabled}\n ?readonly=\\${options.dialog.readonly}\n ?hidden=\\${options.dialog.hidden}\n .templates=\\${options.dialog.templates}\n .related=\\${options.dialog.related}\n @fetch=\\${options.handleFetch}\n @update=\\${options.handleUpdate}\n >\n </${value}>\\``\n ) as FormRenderer;\n } else {\n this.__renderForm = value;\n }\n\n this.requestUpdate();\n }\n\n /** @readonly */\n render(): TemplateResult {\n return html`\n <foxy-internal-confirm-dialog\n message=\"undo_message\"\n confirm=\"undo_confirm\"\n cancel=\"undo_cancel\"\n header=\"undo_header\"\n theme=\"error\"\n lang=${this.lang}\n ns=${this.ns}\n id=\"confirm\"\n @hide=${(evt: DialogHideEvent) => !evt.detail.cancelled && super.hide(true)}\n >\n </foxy-internal-confirm-dialog>\n\n ${super.render(() => {\n return html`${this.__renderForm?.({\n handleUpdate: this.__handleUpdate,\n handleFetch: this.__handleFetch,\n dialog: this,\n html,\n })}`;\n })}\n `;\n }\n\n async hide(cancelled = false): Promise<void> {\n if (cancelled) {\n const confirm = this.renderRoot.querySelector('#confirm') as InternalConfirmDialog;\n confirm.show();\n } else {\n return super.hide(cancelled);\n }\n }\n\n /** Submits the form. */\n async save(): Promise<void> {\n (this.renderRoot.querySelector('#form') as NucleonElement<never>).submit();\n }\n}\n"]}
|
|
@@ -14,7 +14,7 @@ export const discount = ({ ns, type, details }, format, lang) => {
|
|
|
14
14
|
const signIndex = (_b = (_a = /[-+]/.exec(tier)) === null || _a === void 0 ? void 0 : _a.index) !== null && _b !== void 0 ? _b : -1;
|
|
15
15
|
const adjustment = parseFloat(tier.substring(signIndex)) * factor;
|
|
16
16
|
const from = parseFloat(tier.substring(0, signIndex));
|
|
17
|
-
return `$t(${i18nKey}, ${JSON.stringify({ adjustment, from, ns })})`;
|
|
17
|
+
return `$t(${i18nKey}, ${JSON.stringify({ maximumFractionDigits: 10, adjustment, from, ns })})`;
|
|
18
18
|
});
|
|
19
19
|
return translatedTiers.join('; ');
|
|
20
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discount.js","sourceRoot":"","sources":["../../../../../src/elements/public/I18n/format/discount.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAmB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAS,EAAE,MAAM,EAAE,IAAI,EAAU,EAAE;IAC7F,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrE,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,IAAI,mBAAmB,CAAC;IAErD,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;;QACvC,MAAM,SAAS,eAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,0CAAE,KAAK,mCAAI,CAAC,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC;QAClE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAEtD,OAAO,MAAM,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"discount.js","sourceRoot":"","sources":["../../../../../src/elements/public/I18n/format/discount.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAmB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAS,EAAE,MAAM,EAAE,IAAI,EAAU,EAAE;IAC7F,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrE,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,IAAI,mBAAmB,CAAC;IAErD,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;;QACvC,MAAM,SAAS,eAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,0CAAE,KAAK,mCAAI,CAAC,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC;QAClE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAEtD,OAAO,MAAM,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,qBAAqB,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC","sourcesContent":["import { FormatFunction } from 'i18next';\n\ntype Value = { ns: string; type: string; details: string };\n\n/**\n * i18next formatter that returns a human-readable discount description for an API value.\n * @see https://www.i18next.com/translation-function/formatting\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const discount: FormatFunction = ({ ns, type, details }: Value, format, lang): string => {\n const methods = ['allunits', 'incremental', 'repeat', 'single'];\n const factor = type.endsWith('_percentage') ? 0.01 : 1;\n const tiers = details.split('|');\n const method = methods.includes(tiers[0]) ? tiers.shift() : 'single';\n const i18nKey = `${method}_${type}_discount_summary`;\n\n const translatedTiers = tiers.map(tier => {\n const signIndex = /[-+]/.exec(tier)?.index ?? -1;\n const adjustment = parseFloat(tier.substring(signIndex)) * factor;\n const from = parseFloat(tier.substring(0, signIndex));\n\n return `$t(${i18nKey}, ${JSON.stringify({ maximumFractionDigits: 10, adjustment, from, ns })})`;\n });\n\n return translatedTiers.join('; ');\n};\n"]}
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
* i18next formatter that presents a fraction as percentage.
|
|
3
3
|
* @see https://www.i18next.com/translation-function/formatting
|
|
4
4
|
*/
|
|
5
|
-
export const percent = (value, format, lang) => {
|
|
5
|
+
export const percent = (value, format, lang, options) => {
|
|
6
6
|
let result = null;
|
|
7
7
|
try {
|
|
8
|
-
if (typeof value === 'number')
|
|
9
|
-
result = value.toLocaleString(lang, { style: 'percent' });
|
|
8
|
+
if (typeof value === 'number') {
|
|
9
|
+
result = value.toLocaleString(lang, { ...options, style: 'percent' });
|
|
10
|
+
}
|
|
10
11
|
}
|
|
11
12
|
catch (err) {
|
|
12
13
|
console.warn(`i18next formatter error: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"percent.js","sourceRoot":"","sources":["../../../../../src/elements/public/I18n/format/percent.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAU,EAAE;
|
|
1
|
+
{"version":3,"file":"percent.js","sourceRoot":"","sources":["../../../../../src/elements/public/I18n/format/percent.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAU,EAAE;IAC9E,IAAI,MAAM,GAAkB,IAAI,CAAC;IAEjC,IAAI;QACF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;SACvE;KACF;IAAC,OAAO,GAAG,EAAE;QACZ,OAAO,CAAC,IAAI,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;KACzD;IAED,OAAO,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC","sourcesContent":["import { FormatFunction } from 'i18next';\n\n/**\n * i18next formatter that presents a fraction as percentage.\n * @see https://www.i18next.com/translation-function/formatting\n */\nexport const percent: FormatFunction = (value, format, lang, options): string => {\n let result: string | null = null;\n\n try {\n if (typeof value === 'number') {\n result = value.toLocaleString(lang, { ...options, style: 'percent' });\n }\n } catch (err) {\n console.warn(`i18next formatter error: ${err.message}`);\n }\n\n return result || String(value);\n};\n"]}
|