q2-tecton-elements 1.47.0 → 1.48.0
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/cjs/click-elsewhere_2.cjs.entry.js +43 -7
- package/dist/cjs/click-elsewhere_2.cjs.entry.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/q2-chart-donut.cjs.entry.js +7 -4
- package/dist/cjs/q2-chart-donut.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-data-table.cjs.entry.js +8 -5
- package/dist/cjs/q2-data-table.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-dropdown-item.cjs.entry.js +13 -4
- package/dist/cjs/q2-dropdown-item.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-editable-field.cjs.entry.js +36 -27
- package/dist/cjs/q2-editable-field.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-input.cjs.entry.js +2 -2
- package/dist/cjs/q2-input.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-option-list.cjs.entry.js +2 -3
- package/dist/cjs/q2-option-list.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-relative-time.cjs.entry.js +34 -17
- package/dist/cjs/q2-relative-time.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-section.cjs.entry.js +2 -2
- package/dist/cjs/q2-section.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-select.cjs.entry.js +7 -2
- package/dist/cjs/q2-select.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-stepper.cjs.entry.js +2 -2
- package/dist/cjs/q2-stepper.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-tab-container.cjs.entry.js +1 -1
- package/dist/cjs/q2-tab-container.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
- package/dist/collection/components/q2-chart-donut/q2-chart-donut.js +7 -4
- package/dist/collection/components/q2-chart-donut/q2-chart-donut.js.map +1 -1
- package/dist/collection/components/q2-data-table/q2-data-table.css +15 -1
- package/dist/collection/components/q2-data-table/q2-data-table.js +28 -8
- package/dist/collection/components/q2-data-table/q2-data-table.js.map +1 -1
- package/dist/collection/components/q2-dropdown-item/q2-dropdown-item.js +22 -5
- package/dist/collection/components/q2-dropdown-item/q2-dropdown-item.js.map +1 -1
- package/dist/collection/components/q2-editable-field/q2-editable-field.js +41 -29
- package/dist/collection/components/q2-editable-field/q2-editable-field.js.map +1 -1
- package/dist/collection/components/q2-input/q2-input.js +22 -19
- package/dist/collection/components/q2-input/q2-input.js.map +1 -1
- package/dist/collection/components/q2-option-list/q2-option-list.js +2 -3
- package/dist/collection/components/q2-option-list/q2-option-list.js.map +1 -1
- package/dist/collection/components/q2-popover/q2-popover.js +43 -7
- package/dist/collection/components/q2-popover/q2-popover.js.map +1 -1
- package/dist/collection/components/q2-relative-time/q2-relative-time.js +79 -25
- package/dist/collection/components/q2-relative-time/q2-relative-time.js.map +1 -1
- package/dist/collection/components/q2-section/q2-section.js +7 -4
- package/dist/collection/components/q2-section/q2-section.js.map +1 -1
- package/dist/collection/components/q2-select/q2-select.js +7 -2
- package/dist/collection/components/q2-select/q2-select.js.map +1 -1
- package/dist/collection/components/q2-stepper/q2-stepper.js +2 -2
- package/dist/collection/components/q2-stepper/q2-stepper.js.map +1 -1
- package/dist/collection/components/q2-tab-container/q2-tab-container.css +2 -1
- package/dist/components/q2-chart-donut.js +7 -4
- package/dist/components/q2-chart-donut.js.map +1 -1
- package/dist/components/q2-data-table.js +10 -6
- package/dist/components/q2-data-table.js.map +1 -1
- package/dist/components/q2-dropdown-item2.js +16 -6
- package/dist/components/q2-dropdown-item2.js.map +1 -1
- package/dist/components/q2-editable-field.js +37 -28
- package/dist/components/q2-editable-field.js.map +1 -1
- package/dist/components/q2-input2.js +3 -3
- package/dist/components/q2-input2.js.map +1 -1
- package/dist/components/q2-option-list2.js +2 -3
- package/dist/components/q2-option-list2.js.map +1 -1
- package/dist/components/q2-popover2.js +43 -7
- package/dist/components/q2-popover2.js.map +1 -1
- package/dist/components/q2-relative-time.js +37 -18
- package/dist/components/q2-relative-time.js.map +1 -1
- package/dist/components/q2-section.js +2 -2
- package/dist/components/q2-section.js.map +1 -1
- package/dist/components/q2-select2.js +7 -2
- package/dist/components/q2-select2.js.map +1 -1
- package/dist/components/q2-stepper.js +2 -2
- package/dist/components/q2-stepper.js.map +1 -1
- package/dist/components/q2-tab-container.js +1 -1
- package/dist/components/q2-tab-container.js.map +1 -1
- package/dist/esm/click-elsewhere_2.entry.js +43 -7
- package/dist/esm/click-elsewhere_2.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/q2-chart-donut.entry.js +7 -4
- package/dist/esm/q2-chart-donut.entry.js.map +1 -1
- package/dist/esm/q2-data-table.entry.js +8 -5
- package/dist/esm/q2-data-table.entry.js.map +1 -1
- package/dist/esm/q2-dropdown-item.entry.js +14 -5
- package/dist/esm/q2-dropdown-item.entry.js.map +1 -1
- package/dist/esm/q2-editable-field.entry.js +37 -28
- package/dist/esm/q2-editable-field.entry.js.map +1 -1
- package/dist/esm/q2-input.entry.js +2 -2
- package/dist/esm/q2-input.entry.js.map +1 -1
- package/dist/esm/q2-option-list.entry.js +2 -3
- package/dist/esm/q2-option-list.entry.js.map +1 -1
- package/dist/esm/q2-relative-time.entry.js +34 -17
- package/dist/esm/q2-relative-time.entry.js.map +1 -1
- package/dist/esm/q2-section.entry.js +2 -2
- package/dist/esm/q2-section.entry.js.map +1 -1
- package/dist/esm/q2-select.entry.js +7 -2
- package/dist/esm/q2-select.entry.js.map +1 -1
- package/dist/esm/q2-stepper.entry.js +2 -2
- package/dist/esm/q2-stepper.entry.js.map +1 -1
- package/dist/esm/q2-tab-container.entry.js +1 -1
- package/dist/esm/q2-tab-container.entry.js.map +1 -1
- package/dist/esm/q2-tecton-elements.js +1 -1
- package/dist/q2-tecton-elements/p-11982614.entry.js +2 -0
- package/dist/q2-tecton-elements/p-11982614.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-e25194ce.entry.js → p-24719520.entry.js} +2 -2
- package/dist/q2-tecton-elements/p-24719520.entry.js.map +1 -0
- package/dist/q2-tecton-elements/p-30296b0e.entry.js +2 -0
- package/dist/q2-tecton-elements/p-30296b0e.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-b849365e.entry.js → p-32b56406.entry.js} +2 -2
- package/dist/q2-tecton-elements/{p-b849365e.entry.js.map → p-32b56406.entry.js.map} +1 -1
- package/dist/q2-tecton-elements/p-43236cac.entry.js +2 -0
- package/dist/q2-tecton-elements/p-43236cac.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-6f2de185.entry.js → p-4f7e6e79.entry.js} +2 -2
- package/dist/q2-tecton-elements/p-4f7e6e79.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-a3d58a50.entry.js → p-56dd051a.entry.js} +2 -2
- package/dist/q2-tecton-elements/p-56dd051a.entry.js.map +1 -0
- package/dist/q2-tecton-elements/p-6986a60e.entry.js +2 -0
- package/dist/q2-tecton-elements/{p-6eac40be.entry.js.map → p-6986a60e.entry.js.map} +1 -1
- package/dist/q2-tecton-elements/{p-774975fa.entry.js → p-6fdda37e.entry.js} +2 -2
- package/dist/q2-tecton-elements/p-6fdda37e.entry.js.map +1 -0
- package/dist/q2-tecton-elements/p-75bb43b2.entry.js +2 -0
- package/dist/q2-tecton-elements/p-75bb43b2.entry.js.map +1 -0
- package/dist/q2-tecton-elements/p-9a71bd16.entry.js +2 -0
- package/dist/q2-tecton-elements/p-9a71bd16.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-c9ee763d.entry.js → p-f4b28e89.entry.js} +2 -2
- package/dist/q2-tecton-elements/{p-c9ee763d.entry.js.map → p-f4b28e89.entry.js.map} +1 -1
- package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
- package/dist/q2-tecton-elements/q2-tecton-elements.esm.js.map +1 -1
- package/dist/test/elements/q2-chart-donut-test.e2e.js +9 -1
- package/dist/test/elements/q2-chart-donut-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-data-table-test.e2e.js +107 -11
- package/dist/test/elements/q2-data-table-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-dropdown-item-test.e2e.js +183 -104
- package/dist/test/elements/q2-dropdown-item-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-editable-field-test.e2e.js +436 -418
- package/dist/test/elements/q2-editable-field-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-popover-test.spec.js +162 -31
- package/dist/test/elements/q2-popover-test.spec.js.map +1 -1
- package/dist/test/elements/q2-relative-time-test.e2e.js +65 -40
- package/dist/test/elements/q2-relative-time-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-select-test.e2e.js +53 -22
- package/dist/test/elements/q2-select-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-stepper-test.e2e.js +23 -0
- package/dist/test/elements/q2-stepper-test.e2e.js.map +1 -1
- package/dist/types/components/q2-input/q2-input.d.ts +15 -1
- package/dist/types/components/q2-popover/q2-popover.d.ts +2 -0
- package/dist/types/components/q2-relative-time/q2-relative-time.d.ts +25 -11
- package/dist/types/components/q2-section/q2-section.d.ts +10 -2
- package/dist/types/components.d.ts +53 -22
- package/dist/types/workspace/workspace/_Gitlab_tecton-production_master/packages/q2-tecton-elements/.stencil/test/helpers.d.ts +1 -1
- package/package.json +3 -3
- package/dist/q2-tecton-elements/p-0e27ea75.entry.js +0 -2
- package/dist/q2-tecton-elements/p-0e27ea75.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-45d70da2.entry.js +0 -2
- package/dist/q2-tecton-elements/p-45d70da2.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-52e277b8.entry.js +0 -2
- package/dist/q2-tecton-elements/p-52e277b8.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-6eac40be.entry.js +0 -2
- package/dist/q2-tecton-elements/p-6f2de185.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-774975fa.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-a3d58a50.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-e25194ce.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-f450db0b.entry.js +0 -2
- package/dist/q2-tecton-elements/p-f450db0b.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-fce6bc58.entry.js +0 -2
- package/dist/q2-tecton-elements/p-fce6bc58.entry.js.map +0 -1
|
@@ -799,9 +799,9 @@ export namespace Components {
|
|
|
799
799
|
}
|
|
800
800
|
interface Q2DataTable {
|
|
801
801
|
/**
|
|
802
|
-
* Adds
|
|
802
|
+
* Adds borders between rows and/or columns in the table.
|
|
803
803
|
*/
|
|
804
|
-
"bordered": boolean;
|
|
804
|
+
"bordered": boolean | 'horizontal' | 'vertical' | 'grid';
|
|
805
805
|
/**
|
|
806
806
|
* Provides a caption for the data table.
|
|
807
807
|
*/
|
|
@@ -859,6 +859,10 @@ export namespace Components {
|
|
|
859
859
|
* Adds a shadow to the table
|
|
860
860
|
*/
|
|
861
861
|
"shadowed": boolean;
|
|
862
|
+
/**
|
|
863
|
+
* Enables alternating background colors for the table rows
|
|
864
|
+
*/
|
|
865
|
+
"striped": boolean;
|
|
862
866
|
}
|
|
863
867
|
interface Q2Detail {
|
|
864
868
|
/**
|
|
@@ -978,11 +982,12 @@ export namespace Components {
|
|
|
978
982
|
"disabled": boolean;
|
|
979
983
|
/**
|
|
980
984
|
* The text that appears within the dropdown item.
|
|
985
|
+
* @info This will be used as the `aria-label` for this item.
|
|
981
986
|
* @localizable
|
|
982
987
|
*/
|
|
983
988
|
"label": string;
|
|
984
989
|
/**
|
|
985
|
-
* Renders an icon button in the item. Clicking on this button will change the `type`
|
|
990
|
+
* Renders an icon button in the item. Clicking on this button will change the `type` on the item's click event detail to "remove".
|
|
986
991
|
*/
|
|
987
992
|
"removable": boolean;
|
|
988
993
|
/**
|
|
@@ -1211,6 +1216,10 @@ export namespace Components {
|
|
|
1211
1216
|
* Appends "(optional)" to the field label, and sets `aria-required` on the nested input tag to `false`.
|
|
1212
1217
|
*/
|
|
1213
1218
|
"optional": boolean;
|
|
1219
|
+
/**
|
|
1220
|
+
* The pattern string of the input field, regular expression string is expected. This allows us to check the validity user's input. For instance, <q2-input label="My input" pattern="[a-zA-Z0-9]{3,5}" id="myInput"> - Allows only 3~5 alphanumeric letters In Javascript, you can check the validity object in your q2-input Type "abcdefgh", then access the validity object
|
|
1221
|
+
* @snippet const myInput = document.querySelector('#myInput'); console.log(myInput.validity);
|
|
1222
|
+
*/
|
|
1214
1223
|
"pattern": string;
|
|
1215
1224
|
/**
|
|
1216
1225
|
* Text that appears within the field when it is blurred and empty. Placeholder text disappears when the user focuses on the field and provides input.
|
|
@@ -1710,13 +1719,13 @@ export namespace Components {
|
|
|
1710
1719
|
}
|
|
1711
1720
|
interface Q2RelativeTime {
|
|
1712
1721
|
/**
|
|
1713
|
-
* If you want to
|
|
1714
|
-
* @warning - Requires a valid `date` value. - Providing a valid `baseDate` will disable `sync` and remove the "in"/"ago" suffixes in the time message. - Must be a valid ISO date string.
|
|
1722
|
+
* If you want to display the length of time between two specific dates, you can provide a valid `date` and `baseDate`, and the component will display the length of time between the two dates. If `baseDate` is not provided, the date and time at render will be used instead and - if `sync` is true - updated every second to reflect the time between the `date` value and the time at render.
|
|
1723
|
+
* @warning - Requires a valid `date` value. - If the provided `baseDate` is invalid, the component will display "Invalid Date" and a warning message will be printed in the console. - Providing a valid `baseDate` will disable `sync` and remove the "in"/"ago" suffixes in the time message. - Must be a valid ISO date string.
|
|
1715
1724
|
*/
|
|
1716
1725
|
"baseDate": Date | string;
|
|
1717
1726
|
/**
|
|
1718
1727
|
* The date you want to calculate relative time from.
|
|
1719
|
-
* @warning Must be a valid ISO date string.
|
|
1728
|
+
* @warning - Must be a valid ISO date string. - If the provided `date` is invalid, the component will display "Invalid Date" and a warning message will be printed in the console.
|
|
1720
1729
|
*/
|
|
1721
1730
|
"date": Date | string;
|
|
1722
1731
|
/**
|
|
@@ -1724,8 +1733,8 @@ export namespace Components {
|
|
|
1724
1733
|
*/
|
|
1725
1734
|
"displayedMessageValue": () => Promise<string>;
|
|
1726
1735
|
/**
|
|
1727
|
-
* The language used for the
|
|
1728
|
-
* @info It is recommended to use the BCP 47 Language Tags in the [
|
|
1736
|
+
* The language used for the displayed message.
|
|
1737
|
+
* @info It is recommended to use the BCP 47 Language Tags in the ["language-extlang" format](https://www.w3.org/International/articles/language-tags/).
|
|
1729
1738
|
*/
|
|
1730
1739
|
"locale": string;
|
|
1731
1740
|
/**
|
|
@@ -1733,7 +1742,8 @@ export namespace Components {
|
|
|
1733
1742
|
*/
|
|
1734
1743
|
"messageFormat": 'long' | 'short' | 'narrow';
|
|
1735
1744
|
/**
|
|
1736
|
-
*
|
|
1745
|
+
* Determines if the displayed message will use numeric or relative values.
|
|
1746
|
+
* @info Set this property to `always` to force the use of numeric values (e.g. "1 day ago") rather than relative ones (e.g. "yesterday").
|
|
1737
1747
|
*/
|
|
1738
1748
|
"numeric": 'always' | 'auto';
|
|
1739
1749
|
/**
|
|
@@ -1742,9 +1752,17 @@ export namespace Components {
|
|
|
1742
1752
|
*/
|
|
1743
1753
|
"sync": boolean;
|
|
1744
1754
|
/**
|
|
1745
|
-
*
|
|
1755
|
+
* Enforces the use of the provided unit of measurement in the displayed message.
|
|
1746
1756
|
*/
|
|
1747
1757
|
"unit": 'second' | 'minute' | 'hour' | 'day' | 'month' | 'quarter' | 'year';
|
|
1758
|
+
/**
|
|
1759
|
+
* Checks the provided baseDate prop is a valid date.
|
|
1760
|
+
*/
|
|
1761
|
+
"validBaseDateProp": () => Promise<boolean>;
|
|
1762
|
+
/**
|
|
1763
|
+
* Checks the provided date prop is a valid date.
|
|
1764
|
+
*/
|
|
1765
|
+
"validDateProp": () => Promise<boolean>;
|
|
1748
1766
|
}
|
|
1749
1767
|
interface Q2Section {
|
|
1750
1768
|
/**
|
|
@@ -1756,7 +1774,8 @@ export namespace Components {
|
|
|
1756
1774
|
*/
|
|
1757
1775
|
"expanded": boolean;
|
|
1758
1776
|
/**
|
|
1759
|
-
* The text to display above the `q2-section`. Renders as an `<h2>` element.
|
|
1777
|
+
* The text to display above the `q2-section`. Renders as an `<h2>` element. It is also used to provided an `aria-label` for the toggle button when the component is collapsible.
|
|
1778
|
+
* @warning If you are providing a custom header, setting this property is still strongly encouraged for the purposes of accessibility.
|
|
1760
1779
|
*/
|
|
1761
1780
|
"label": string;
|
|
1762
1781
|
/**
|
|
@@ -3832,9 +3851,9 @@ declare namespace LocalJSX {
|
|
|
3832
3851
|
}
|
|
3833
3852
|
interface Q2DataTable {
|
|
3834
3853
|
/**
|
|
3835
|
-
* Adds
|
|
3854
|
+
* Adds borders between rows and/or columns in the table.
|
|
3836
3855
|
*/
|
|
3837
|
-
"bordered"?: boolean;
|
|
3856
|
+
"bordered"?: boolean | 'horizontal' | 'vertical' | 'grid';
|
|
3838
3857
|
/**
|
|
3839
3858
|
* Provides a caption for the data table.
|
|
3840
3859
|
*/
|
|
@@ -3916,6 +3935,10 @@ declare namespace LocalJSX {
|
|
|
3916
3935
|
* Adds a shadow to the table
|
|
3917
3936
|
*/
|
|
3918
3937
|
"shadowed"?: boolean;
|
|
3938
|
+
/**
|
|
3939
|
+
* Enables alternating background colors for the table rows
|
|
3940
|
+
*/
|
|
3941
|
+
"striped"?: boolean;
|
|
3919
3942
|
}
|
|
3920
3943
|
interface Q2Detail {
|
|
3921
3944
|
/**
|
|
@@ -4035,11 +4058,12 @@ declare namespace LocalJSX {
|
|
|
4035
4058
|
"disabled"?: boolean;
|
|
4036
4059
|
/**
|
|
4037
4060
|
* The text that appears within the dropdown item.
|
|
4061
|
+
* @info This will be used as the `aria-label` for this item.
|
|
4038
4062
|
* @localizable
|
|
4039
4063
|
*/
|
|
4040
4064
|
"label"?: string;
|
|
4041
4065
|
/**
|
|
4042
|
-
* Renders an icon button in the item. Clicking on this button will change the `type`
|
|
4066
|
+
* Renders an icon button in the item. Clicking on this button will change the `type` on the item's click event detail to "remove".
|
|
4043
4067
|
*/
|
|
4044
4068
|
"removable"?: boolean;
|
|
4045
4069
|
/**
|
|
@@ -4096,6 +4120,7 @@ declare namespace LocalJSX {
|
|
|
4096
4120
|
"maxlength"?: number;
|
|
4097
4121
|
/**
|
|
4098
4122
|
* Emitted when the 'Edit', 'Cancel', or 'Save' buttons are clicked. The event detail will not include a `value` or `formattedValue` if the event name is 'edit' or 'cancel'.
|
|
4123
|
+
* @info If you are utilizing events to provide input validation, it is recommended you use the `input` event, not the `change` event.
|
|
4099
4124
|
*/
|
|
4100
4125
|
"onChange"?: (event: Q2EditableFieldCustomEvent<{
|
|
4101
4126
|
editing: boolean;
|
|
@@ -4274,6 +4299,10 @@ declare namespace LocalJSX {
|
|
|
4274
4299
|
* Appends "(optional)" to the field label, and sets `aria-required` on the nested input tag to `false`.
|
|
4275
4300
|
*/
|
|
4276
4301
|
"optional"?: boolean;
|
|
4302
|
+
/**
|
|
4303
|
+
* The pattern string of the input field, regular expression string is expected. This allows us to check the validity user's input. For instance, <q2-input label="My input" pattern="[a-zA-Z0-9]{3,5}" id="myInput"> - Allows only 3~5 alphanumeric letters In Javascript, you can check the validity object in your q2-input Type "abcdefgh", then access the validity object
|
|
4304
|
+
* @snippet const myInput = document.querySelector('#myInput'); console.log(myInput.validity);
|
|
4305
|
+
*/
|
|
4277
4306
|
"pattern"?: string;
|
|
4278
4307
|
/**
|
|
4279
4308
|
* Text that appears within the field when it is blurred and empty. Placeholder text disappears when the user focuses on the field and provides input.
|
|
@@ -4799,18 +4828,18 @@ declare namespace LocalJSX {
|
|
|
4799
4828
|
}
|
|
4800
4829
|
interface Q2RelativeTime {
|
|
4801
4830
|
/**
|
|
4802
|
-
* If you want to
|
|
4803
|
-
* @warning - Requires a valid `date` value. - Providing a valid `baseDate` will disable `sync` and remove the "in"/"ago" suffixes in the time message. - Must be a valid ISO date string.
|
|
4831
|
+
* If you want to display the length of time between two specific dates, you can provide a valid `date` and `baseDate`, and the component will display the length of time between the two dates. If `baseDate` is not provided, the date and time at render will be used instead and - if `sync` is true - updated every second to reflect the time between the `date` value and the time at render.
|
|
4832
|
+
* @warning - Requires a valid `date` value. - If the provided `baseDate` is invalid, the component will display "Invalid Date" and a warning message will be printed in the console. - Providing a valid `baseDate` will disable `sync` and remove the "in"/"ago" suffixes in the time message. - Must be a valid ISO date string.
|
|
4804
4833
|
*/
|
|
4805
4834
|
"baseDate"?: Date | string;
|
|
4806
4835
|
/**
|
|
4807
4836
|
* The date you want to calculate relative time from.
|
|
4808
|
-
* @warning Must be a valid ISO date string.
|
|
4837
|
+
* @warning - Must be a valid ISO date string. - If the provided `date` is invalid, the component will display "Invalid Date" and a warning message will be printed in the console.
|
|
4809
4838
|
*/
|
|
4810
4839
|
"date"?: Date | string;
|
|
4811
4840
|
/**
|
|
4812
|
-
* The language used for the
|
|
4813
|
-
* @info It is recommended to use the BCP 47 Language Tags in the [
|
|
4841
|
+
* The language used for the displayed message.
|
|
4842
|
+
* @info It is recommended to use the BCP 47 Language Tags in the ["language-extlang" format](https://www.w3.org/International/articles/language-tags/).
|
|
4814
4843
|
*/
|
|
4815
4844
|
"locale"?: string;
|
|
4816
4845
|
/**
|
|
@@ -4818,7 +4847,8 @@ declare namespace LocalJSX {
|
|
|
4818
4847
|
*/
|
|
4819
4848
|
"messageFormat"?: 'long' | 'short' | 'narrow';
|
|
4820
4849
|
/**
|
|
4821
|
-
*
|
|
4850
|
+
* Determines if the displayed message will use numeric or relative values.
|
|
4851
|
+
* @info Set this property to `always` to force the use of numeric values (e.g. "1 day ago") rather than relative ones (e.g. "yesterday").
|
|
4822
4852
|
*/
|
|
4823
4853
|
"numeric"?: 'always' | 'auto';
|
|
4824
4854
|
/**
|
|
@@ -4827,7 +4857,7 @@ declare namespace LocalJSX {
|
|
|
4827
4857
|
*/
|
|
4828
4858
|
"sync"?: boolean;
|
|
4829
4859
|
/**
|
|
4830
|
-
*
|
|
4860
|
+
* Enforces the use of the provided unit of measurement in the displayed message.
|
|
4831
4861
|
*/
|
|
4832
4862
|
"unit"?: 'second' | 'minute' | 'hour' | 'day' | 'month' | 'quarter' | 'year';
|
|
4833
4863
|
}
|
|
@@ -4841,7 +4871,8 @@ declare namespace LocalJSX {
|
|
|
4841
4871
|
*/
|
|
4842
4872
|
"expanded"?: boolean;
|
|
4843
4873
|
/**
|
|
4844
|
-
* The text to display above the `q2-section`. Renders as an `<h2>` element.
|
|
4874
|
+
* The text to display above the `q2-section`. Renders as an `<h2>` element. It is also used to provided an `aria-label` for the toggle button when the component is collapsible.
|
|
4875
|
+
* @warning If you are providing a custom header, setting this property is still strongly encouraged for the purposes of accessibility.
|
|
4845
4876
|
*/
|
|
4846
4877
|
"label"?: string;
|
|
4847
4878
|
/**
|
|
@@ -41,5 +41,5 @@ export declare const evaluateA11y: (page: any, ...args: string[]) => Promise<{}>
|
|
|
41
41
|
* @note This function should be called before the component is rendered.
|
|
42
42
|
* @note Be sure to call `jest.restoreAllMocks()` after the test to restore the original fetch function.
|
|
43
43
|
*/
|
|
44
|
-
export declare const mockIconFetch: (iconMarkup?: string) => jest.SpyInstance<Promise<Response>, [input: URL |
|
|
44
|
+
export declare const mockIconFetch: (iconMarkup?: string) => jest.SpyInstance<Promise<Response>, [input: string | URL | Request, init?: RequestInit], any>;
|
|
45
45
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "q2-tecton-elements",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.48.0",
|
|
4
4
|
"description": "Q2 Tecton Custom Elements",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Q2 Tecton Team",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@stencil/core": "4.18.0",
|
|
36
|
-
"q2-tecton-common": "1.
|
|
36
|
+
"q2-tecton-common": "1.48.0",
|
|
37
37
|
"swiper": "8.4.4"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"typescript": "5.4.5",
|
|
55
55
|
"typescript-eslint": "^7.11.0"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "5cc45af73c1c199eb540024b721631e860726210"
|
|
58
58
|
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as t,c as i,h as e,g as s}from"./p-a5f18e27.js";import{l as n,h as a,o as r,i as h,w as d}from"./p-84190698.js";const l="*{box-sizing:border-box}*:active{outline:none}*:focus{outline:none;box-shadow:var(--const-double-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #0066cc)}:host{box-shadow:none !important}::-moz-focus-inner{border:none}input,textarea,button{font-family:inherit;font-size:inherit;font-stretch:inherit}:host(.sr),:host(.sr) button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.sr,.sr button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none}:host([hidden]){display:none}.invisible{visibility:hidden}:host{display:inline-block;max-width:100%}.q2-editable-field-wrapper:not([hidden]){display:flex}.q2-editable-field-wrapper.editing{align-items:flex-end}:host([block]){display:block;width:100%}:host([block]) .q2-editable-field-wrapper:not([hidden]){display:grid;grid-template-columns:1fr auto auto}q2-input,.text-wrapper{margin:0 var(--tct-scale-2, var(--app-scale-2x, 10px)) 0 0}q2-input{flex:1 1 auto;min-width:170px}.text-wrapper{flex:0 auto;align-self:center;display:inline-block}:host([truncated]) .text-wrapper{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}q2-btn{flex:0 0 44px}dl{margin:var(--tct-scale-0, var(--app-scale-0x, 0))}dt{font-weight:600}dd{margin-left:var(--tct-scale-0, var(--app-scale-0x, 0));display:flex;align-items:center}";const o=l;const c=class{constructor(e){t(this,e);this.input=i(this,"input",7);this.change=i(this,"change",7);this.scheduledAfterRender=[];this.defaultValue=this.value;this.inputInput=t=>{t.stopPropagation();this.input.emit(t.detail);this.formattedValue=t.detail.formattedValue;this.innerValue=t.detail.value};this.inputChange=t=>{t.stopPropagation()};this.inputKeyDown=t=>{if(t.key==="Escape"||t.key==="Esc"){t.preventDefault();this.cancelClick();return}if(t.key==="Enter"){t.preventDefault();this.saveClick();return}};this.inputClick=t=>{t.stopPropagation()};this.saveClick=t=>{t&&t.stopPropagation();const i=this.hostElement.shadowRoot.querySelector("q2-input").value;this.defaultValue=i;this.change.emit({editing:false,name:"save",value:this.innerValue||i,formattedValue:this.formattedValue||i});setTimeout((()=>{const{errors:t=[]}=this;if(!t.length)return;this.hostElement.focus()}),1)};this.editClick=t=>{t===null||t===void 0?void 0:t.stopPropagation();this.change.emit({editing:true,name:"edit"})};this.cancelClick=t=>{t===null||t===void 0?void 0:t.stopPropagation();this.change.emit({editing:false,name:"cancel"});this.inputElement.setValue(this.defaultValue)};this.block=undefined;this.disabled=undefined;this.editing=false;this.errors=undefined;this.formatModifier=undefined;this.hideLabel=undefined;this.hints=undefined;this.label="";this.maxlength=undefined;this.persistentLabel=undefined;this.truncated=undefined;this.type=undefined;this.value="";this.ariaLabel=undefined;this.formattedValue=undefined}get locLabel(){return this.label&&n(this.label)||""}componentWillLoad(){a(this)}componentDidRender(){this.scheduledAfterRender.forEach((t=>t()));this.scheduledAfterRender=[];this.formattedValue=this.inputElement.formattedValue}componentDidLoad(){r(this.hostElement)}errorsObserver(){var t;const{editing:i,errors:e=[]}=this;const s=this.hostElement.shadowRoot.activeElement;const n=(t=(s===null||s===void 0?void 0:s.tagName)==="Q2-INPUT")!==null&&t!==void 0?t:false;const a=e.length;if(n||!s||!i||!a)return;this.inputElement.focus()}ariaLabelObserver(){a(this)}observesEditing(t,i){if(t===i)return;this.scheduledAfterRender.push(this.hostElement.focus)}get wrapperClass(){return`q2-editable-field-wrapper ${this.editing?"editing":""}`}onHostElementChange(t){if(!h(t,this.hostElement)||this.hostElement.onchange)return;switch(t.detail.name){case"save":this.value=t.detail.value;break;case"cancel":this.inputElement.value=this.value;break}this.editing=t.detail.editing}delegateFocus(t){if(!h(t,this.hostElement))return;this.hostElement.shadowRoot.querySelector(this.editing?"q2-input":"q2-btn.begin-edit").focus()}clickEdit(){var t;if(this.editing)return;(t=this.editBtnElement)===null||t===void 0?void 0:t.click()}clickCancel(){var t;if(!this.editing)return;(t=this.cancelBtnElement)===null||t===void 0?void 0:t.click()}clickSave(){var t;if(!this.editing)return;(t=this.saveBtnElement)===null||t===void 0?void 0:t.click()}async setValue(t,i={clickSave:true}){await this.clickEdit();await d();await this.inputElement.setValue(t);if(i.clickSave){await this.clickSave();await d()}}render(){return e("div",{key:"66150588f5a753181d584bde5472b782af4051c3"},this.generateEditStateDOM(),this.generateReadStateDOM())}generateEditStateDOM(){return e("div",{class:this.wrapperClass,hidden:!this.editing},e("q2-input",{ref:t=>this.inputElement=t,label:this.locLabel,hideLabel:this.hideLabel,value:this.value,hints:Array.isArray(this.hints)&&this.hints.map((t=>n(t)))||undefined,errors:Array.isArray(this.errors)&&this.errors.map((t=>n(t)))||undefined,type:this.type,disabled:this.disabled,formatModifier:this.formatModifier,maxlength:this.maxlength,"test-id":"editableInput",onInput:this.inputInput,onChange:this.inputChange,onKeyDown:this.inputKeyDown,onClick:this.inputClick}),e("q2-btn",{ref:t=>this.cancelBtnElement=t,class:"cancel-edit",label:`${n("tecton.element.editableField.cancel")} ${this.locLabel}`,"hide-label":true,"test-id":"cancelButton",onClick:this.cancelClick},e("q2-icon",{type:"close"})),e("q2-btn",{ref:t=>this.saveBtnElement=t,class:"save-edit",label:`${n("tecton.element.editableField.save")} ${this.locLabel}`,"hide-label":true,"test-id":"saveButton",onClick:this.saveClick},e("q2-icon",{type:"checkmark"})))}generateReadStateDOM(){if(this.persistentLabel&&this.locLabel){return e("div",{class:this.wrapperClass,hidden:this.editing},e("dl",null,e("dt",{class:"read-state-label"},this.locLabel),e("dd",null,e("span",{class:"text-wrapper"},this.formattedValue||this.value),this.generateEditBtn())))}return e("div",{class:this.wrapperClass,hidden:this.editing},e("div",{class:"text-wrapper"},this.formattedValue||this.value),this.generateEditBtn())}generateEditBtn(){return e("q2-btn",{ref:t=>this.editBtnElement=t,class:"begin-edit",label:`${n("tecton.element.editableField.edit")} ${this.locLabel}`,"hide-label":true,disabled:this.disabled,"test-id":"editButton",onClick:this.editClick},e("q2-icon",{type:"edit"}))}get hostElement(){return s(this)}static get watchers(){return{errors:["errorsObserver"],ariaLabel:["ariaLabelObserver"],editing:["observesEditing"]}}};c.style=o;export{c as q2_editable_field};
|
|
2
|
-
//# sourceMappingURL=p-0e27ea75.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["q2EditableFieldCss","Q2EditableFieldStyle0","Q2EditableField","this","scheduledAfterRender","defaultValue","value","inputInput","event","stopPropagation","input","emit","detail","formattedValue","innerValue","inputChange","e","inputKeyDown","key","preventDefault","cancelClick","saveClick","inputClick","valueFromInputProp","hostElement","shadowRoot","querySelector","change","editing","name","setTimeout","errors","length","focus","editClick","inputElement","setValue","locLabel","label","loc","componentWillLoad","handleAriaLabel","componentDidRender","forEach","fn","componentDidLoad","overrideFocus","errorsObserver","focusedElement","activeElement","isInputFocused","_a","tagName","hasErrors","ariaLabelObserver","observesEditing","newValue","oldValue","push","wrapperClass","onHostElementChange","isEventFromElement","onchange","delegateFocus","clickEdit","editBtnElement","click","clickCancel","cancelBtnElement","clickSave","saveBtnElement","options","waitForNextPaint","render","h","generateEditStateDOM","generateReadStateDOM","class","hidden","ref","el","hideLabel","hints","Array","isArray","map","str","undefined","type","disabled","formatModifier","maxlength","onInput","onChange","onKeyDown","onClick","persistentLabel","generateEditBtn"],"sources":["src/components/q2-editable-field/q2-editable-field.scss?tag=q2-editable-field&encapsulation=shadow","src/components/q2-editable-field/q2-editable-field.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n\n:host {\n display: inline-block;\n max-width: 100%;\n}\n\n.q2-editable-field-wrapper:not([hidden]) {\n display: flex;\n}\n\n.q2-editable-field-wrapper.editing {\n align-items: flex-end;\n}\n\n:host([block]) {\n display:block;\n width: 100%;\n .q2-editable-field-wrapper:not([hidden]) {\n display: grid;\n grid-template-columns: 1fr auto auto;\n }\n}\n\nq2-input,\n.text-wrapper {\n margin: 0 var(--tct-scale-2, var(--app-scale-2x, 10px)) 0 0;\n}\n\nq2-input {\n flex: 1 1 auto;\n min-width: 170px;\n}\n\n.text-wrapper {\n flex: 0 auto;\n align-self: center;\n display: inline-block;\n}\n\n:host([truncated]) .text-wrapper {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\nq2-btn {\n flex: 0 0 44px;\n}\n\ndl {\n margin: var(--tct-scale-0, var(--app-scale-0x, 0));\n}\n\ndt {\n font-weight: 600;\n}\n\ndd {\n margin-left: var(--tct-scale-0, var(--app-scale-0x, 0));\n display: flex;\n align-items: center;\n}\n","import { Component, State, Prop, h, Listen, Element, Event, EventEmitter, Method, Watch } from '@stencil/core';\nimport { IEventDetail, Q2InputCustomEvent } from 'src/components';\nimport { handleAriaLabel, isEventFromElement, loc, overrideFocus, waitForNextPaint } from 'src/utils';\nimport { Q2Input } from '../q2-input/q2-input';\nimport { IFormatterValueObject } from '../q2-input/q2-input-types';\n\ninterface IExtendedQ2InputElement extends HTMLQ2InputElement {\n formattedValue: IFormatterValueObject['formattedValue'];\n}\n\n@Component({ tag: 'q2-editable-field', shadow: true, styleUrl: 'q2-editable-field.scss' })\nexport class Q2EditableField {\n /** If `true`, component expands to fill the width of its parent element. */\n @Prop({ reflect: true }) block: boolean;\n\n /** Disables the edit button and field. */\n @Prop({ reflect: true }) disabled: boolean;\n\n /** Controls the edit state of the element. */\n @Prop({ reflect: true, mutable: true }) editing: boolean = false;\n\n /**\n * Determines the `errors` applied to the `q2-input` element.\n *\n * See [q2-input](https://tecton.q2developer.com/ui/q2-input/) for more information.\n */\n @Prop() errors: string[];\n\n /**\n * Determines the `formatModifier` applied to the `q2-input` element.\n * @info\n * Only applicable when `type=\"currency\"`.\n *\n * See [q2-input](https://tecton.q2developer.com/ui/q2-input/) for more information.\n */\n @Prop({ reflect: true }) formatModifier: string;\n\n /** Hide's the field's `<label>` element from view. */\n @Prop({ reflect: true, mutable: true }) hideLabel: boolean;\n\n /**\n * Determines the `hints` applied to the `q2-input` element.\n *\n * See [q2-input](https://tecton.q2developer.com/ui/q2-input/) for more information.\n */\n @Prop() hints: string[];\n\n /**\n * The visible descriptor for the element.\n * Serves as the input label while in the edit state and as a decorative label for the read state when `persistentLabel` is `true`.\n * @localizable\n */\n @Prop({ reflect: true, mutable: true }) label: string = '';\n\n /**\n * Determines the `maxLength` applied to the `q2-input`.\n *\n * See [q2-input](https://tecton.q2developer.com/ui/q2-input/) for more information.\n */\n @Prop({ reflect: true }) maxlength: number;\n\n /** Displays the provided label in the read state. */\n @Prop({ reflect: true }) persistentLabel: boolean;\n\n /** Shortens long values with ellipses instead of splitting into multiple lines. */\n @Prop({ reflect: true }) truncated: boolean;\n\n /**\n * Determines the `type` applied to the `q2-input` element.\n *\n * See [q2-input](https://tecton.q2developer.com/ui/q2-input/) for all `type` values.\n */\n @Prop({ reflect: true }) type: Q2Input['type'];\n\n /** Serves as the visible text while in the read state, and the default value of the input while in the edit state. */\n @Prop({ reflect: true, mutable: true }) value: string = '';\n\n /** @deprecated */\n @Prop({ reflect: true, mutable: true }) ariaLabel: string;\n\n scheduledAfterRender: (() => void)[] = [];\n\n @Element() hostElement: HTMLElement;\n inputElement: HTMLQ2InputElement;\n editBtnElement: HTMLQ2BtnElement;\n cancelBtnElement: HTMLQ2BtnElement;\n saveBtnElement: HTMLQ2BtnElement;\n\n @State() formattedValue: string;\n innerValue: string;\n defaultValue: string = this.value;\n\n get locLabel() {\n return (this.label && loc(this.label)) || '';\n }\n\n /////// LIFECYCLE HOOKS ///////\n\n componentWillLoad() {\n handleAriaLabel(this);\n }\n\n componentDidRender() {\n this.scheduledAfterRender.forEach(fn => fn());\n this.scheduledAfterRender = [];\n this.formattedValue = (this.inputElement as IExtendedQ2InputElement).formattedValue;\n }\n\n componentDidLoad() {\n overrideFocus(this.hostElement);\n }\n\n //////// OBSERVERS ////////\n\n @Watch('errors')\n errorsObserver() {\n const { editing, errors = [] } = this;\n const focusedElement = this.hostElement.shadowRoot.activeElement;\n const isInputFocused = focusedElement?.tagName === 'Q2-INPUT' ?? false;\n const hasErrors = errors.length;\n if (isInputFocused || !focusedElement || !editing || !hasErrors) return;\n this.inputElement.focus();\n }\n\n @Watch('ariaLabel')\n ariaLabelObserver() {\n handleAriaLabel(this);\n }\n\n @Watch('editing')\n observesEditing(newValue: boolean, oldValue: boolean) {\n if (newValue === oldValue) return;\n this.scheduledAfterRender.push(this.hostElement.focus);\n }\n\n get wrapperClass() {\n return `q2-editable-field-wrapper ${this.editing ? 'editing' : ''}`;\n }\n\n ///////// HOST ELEMENT EVENTS //////\n\n @Listen('change')\n onHostElementChange(event: CustomEvent) {\n if (!isEventFromElement(event, this.hostElement) || this.hostElement.onchange) return;\n switch (event.detail.name) {\n case 'save':\n this.value = event.detail.value;\n break;\n\n case 'cancel':\n this.inputElement.value = this.value;\n break;\n }\n\n this.editing = event.detail.editing;\n }\n\n @Listen('focus')\n delegateFocus(event: FocusEvent) {\n if (!isEventFromElement(event, this.hostElement)) return;\n this.hostElement.shadowRoot.querySelector<HTMLElement>(this.editing ? 'q2-input' : 'q2-btn.begin-edit').focus();\n }\n\n ///////// EVENTS /////////\n\n /**\n * Emitted when the user updates the `q2-input` element in the editing state.\n */\n @Event() input: EventEmitter<{ formattedValue: string; value: string }>;\n\n /**\n * Emitted when the 'Edit', 'Cancel', or 'Save' buttons are clicked.\n *\n * The event detail will not include a `value` or `formattedValue` if the event name is 'edit' or 'cancel'.\n */\n @Event() change: EventEmitter<{\n editing: boolean;\n name: 'edit' | 'cancel' | 'save';\n value?: string;\n formattedValue?: string;\n }>;\n\n /// Methods ///\n /**\n * Emulates clicking the edit button, which will display the `<q2-input>` field.\n *\n * @testOnly\n */\n @Method()\n clickEdit() {\n if (this.editing) return;\n this.editBtnElement?.click();\n }\n\n /**\n * Emulates clicking the cancel button, which will hide the `<q2-input>` field.\n *\n * @testOnly\n */\n @Method()\n clickCancel() {\n if (!this.editing) return;\n this.cancelBtnElement?.click();\n }\n\n /**\n * Emulates clicking the save button, saving value in the `<q2-input>` field, and emitting a `change` event.\n *\n * @testOnly\n */\n @Method()\n clickSave() {\n if (!this.editing) return;\n this.saveBtnElement?.click();\n }\n\n /**\n * Emulates clicking the edit button, and setting the value of the `<q2-input>` field.\n *\n * If the `clickSave` argument is `true` (default), the save button will be clicked after the value is set, and a\\\n * `change` event will be emitted.\n *\n * @testOnly\n */\n @Method()\n async setValue(value: string, options: { clickSave?: boolean } = { clickSave: true }) {\n await this.clickEdit();\n await waitForNextPaint();\n\n await this.inputElement.setValue(value);\n\n if (options.clickSave) {\n await this.clickSave();\n await waitForNextPaint();\n }\n }\n\n //////// ACTIONS /////////\n\n inputInput = (event: Q2InputCustomEvent<IEventDetail> & InputEvent) => {\n event.stopPropagation();\n this.input.emit(event.detail);\n this.formattedValue = event.detail.formattedValue;\n this.innerValue = event.detail.value;\n };\n\n inputChange = (e: CustomEvent) => {\n e.stopPropagation();\n };\n\n inputKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n e.preventDefault();\n this.cancelClick();\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n this.saveClick();\n return;\n }\n };\n\n inputClick = (event: MouseEvent) => {\n event.stopPropagation();\n };\n\n saveClick = (event?: MouseEvent) => {\n event && event.stopPropagation();\n const valueFromInputProp = this.hostElement.shadowRoot.querySelector('q2-input').value;\n this.defaultValue = valueFromInputProp;\n this.change.emit({\n editing: false,\n name: 'save',\n value: this.innerValue || valueFromInputProp,\n formattedValue: this.formattedValue || valueFromInputProp,\n });\n\n setTimeout(() => {\n const { errors = [] } = this;\n if (!errors.length) return;\n this.hostElement.focus();\n }, 1);\n };\n\n editClick = (event: MouseEvent) => {\n event?.stopPropagation();\n this.change.emit({ editing: true, name: 'edit' });\n };\n\n cancelClick = (event?: MouseEvent) => {\n event?.stopPropagation();\n this.change.emit({ editing: false, name: 'cancel' });\n this.inputElement.setValue(this.defaultValue);\n };\n\n render() {\n return (\n <div>\n {this.generateEditStateDOM()}\n {this.generateReadStateDOM()}\n </div>\n );\n }\n\n generateEditStateDOM() {\n return (\n <div\n class={this.wrapperClass}\n hidden={!this.editing}\n >\n <q2-input\n ref={el => (this.inputElement = el)}\n label={this.locLabel}\n hideLabel={this.hideLabel}\n value={this.value}\n hints={(Array.isArray(this.hints) && this.hints.map(str => loc(str))) || undefined}\n errors={(Array.isArray(this.errors) && this.errors.map(str => loc(str))) || undefined}\n type={this.type}\n disabled={this.disabled}\n formatModifier={this.formatModifier}\n maxlength={this.maxlength}\n test-id=\"editableInput\"\n onInput={this.inputInput}\n onChange={this.inputChange}\n onKeyDown={this.inputKeyDown}\n onClick={this.inputClick}\n />\n <q2-btn\n ref={el => (this.cancelBtnElement = el)}\n class=\"cancel-edit\"\n label={`${loc('tecton.element.editableField.cancel')} ${this.locLabel}`}\n hide-label\n test-id=\"cancelButton\"\n onClick={this.cancelClick}\n >\n <q2-icon type=\"close\" />\n </q2-btn>\n <q2-btn\n ref={el => (this.saveBtnElement = el)}\n class=\"save-edit\"\n label={`${loc('tecton.element.editableField.save')} ${this.locLabel}`}\n hide-label\n test-id=\"saveButton\"\n onClick={this.saveClick}\n >\n <q2-icon type=\"checkmark\" />\n </q2-btn>\n </div>\n );\n }\n\n generateReadStateDOM() {\n if (this.persistentLabel && this.locLabel) {\n return (\n <div\n class={this.wrapperClass}\n hidden={this.editing}\n >\n <dl>\n <dt class=\"read-state-label\">{this.locLabel}</dt>\n <dd>\n <span class=\"text-wrapper\">{this.formattedValue || this.value}</span>\n {this.generateEditBtn()}\n </dd>\n </dl>\n </div>\n );\n }\n return (\n <div\n class={this.wrapperClass}\n hidden={this.editing}\n >\n <div class=\"text-wrapper\">{this.formattedValue || this.value}</div>\n {this.generateEditBtn()}\n </div>\n );\n }\n\n generateEditBtn() {\n return (\n <q2-btn\n ref={el => (this.editBtnElement = el)}\n class=\"begin-edit\"\n label={`${loc('tecton.element.editableField.edit')} ${this.locLabel}`}\n hide-label\n disabled={this.disabled}\n test-id=\"editButton\"\n onClick={this.editClick}\n >\n <q2-icon type=\"edit\" />\n </q2-btn>\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e,h as t,F as s,g as i}from"./p-a5f18e27.js";import{d as n}from"./p-3c42c90f.js";const a="*{box-sizing:border-box}*:active{outline:none}*:focus{outline:none;box-shadow:var(--const-double-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #0066cc)}:host{box-shadow:none !important}::-moz-focus-inner{border:none}input,textarea,button{font-family:inherit;font-size:inherit;font-stretch:inherit}:host(.sr),:host(.sr) button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.sr,.sr button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none}:host([hidden]){display:none}.invisible{visibility:hidden}:host{display:inline}";const r=a;const o=class{constructor(t){e(this,t);this.syncTimer=null;this.trimSuffix=false;this.baseDate=undefined;this.locale=document.documentElement.lang||"en-US";this.messageFormat="short";this.numeric="auto";this.sync=true;this.date=undefined;this.unit=undefined;this.displayedMessage=undefined}componentWillLoad(){this.updateMessage()}connectedCallback(){this.syncUpdated()}disconnectedCallback(){window.clearInterval(this.syncTimer);this.syncTimer=null}get shouldShow(){return!!this.displayedMessage}get validDate(){const e=new Date(this.date);return n.isValid(e)}get handleDate(){if(!this.validDate)console.warn("Error: Invalid date provided to q2-relative-time.");return new Date(this.date)}get validBaseDate(){const e=new Date(this.baseDate);return n.isValid(e)}get handleBaseDate(){if(this.validBaseDate){this.trimSuffix=true;this.sync=false;return new Date(this.baseDate)}else{this.trimSuffix=false;this.sync=true;return new Date}}get isValidUnit(){if(["second","minute","hour","day","month","quarter","year"].includes(this.unit))return true;return false}get handleNumeric(){if(this.validBaseDate)return"always";return this.numeric}syncUpdated(){if(this.sync){this.syncTimer=window.setInterval((()=>{this.updateMessage()}),1e3)}else{window.clearInterval(this.syncTimer);this.syncTimer=null}}updateMessage(){const{validDate:e,handleDate:t,handleBaseDate:s,locale:i,handleNumeric:a,messageFormat:r,isValidUnit:o,unit:d,trimSuffix:h}=this;if(!e){this.sync=false;this.displayedMessage="Invalid Date Provided";return}const l=n.intlFormatDistance(new Date(t),new Date(s),{locale:i,localeMatcher:"best fit",numeric:a,style:r,unit:o?d:null});if(h){this.displayedMessage=this.trimMessage(l)}else{this.displayedMessage=l}}trimMessage(e){return e.replace(/^in\s?/,"").replace(/\sago$/,"")}async displayedMessageValue(){return this.displayedMessage}render(){const{shouldShow:e,displayedMessage:i}=this;return t(s,{key:"26e452a6b2cda738835ac8675aea30b50846920a"},e?t("time",{dateTime:i},i):null)}get hostElement(){return i(this)}static get watchers(){return{sync:["syncUpdated"],messageFormat:["updateMessage"],locale:["updateMessage"],date:["updateMessage"],baseDate:["updateMessage"],numeric:["updateMessage"],unit:["updateMessage"]}}};o.style=r;export{o as q2_relative_time};
|
|
2
|
-
//# sourceMappingURL=p-45d70da2.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["q2RelativeTimeCss","Q2RelativeTimeStyle0","Q2RelativeTime","this","syncTimer","trimSuffix","document","documentElement","lang","componentWillLoad","updateMessage","connectedCallback","syncUpdated","disconnectedCallback","window","clearInterval","shouldShow","displayedMessage","validDate","targetDate","Date","date","isValidDate","handleDate","console","warn","validBaseDate","baseDate","handleBaseDate","sync","isValidUnit","includes","unit","handleNumeric","numeric","setInterval","locale","messageFormat","message","intlFormatDistance","localeMatcher","style","trimMessage","replace","displayedMessageValue","render","h","Fragment","key","dateTime"],"sources":["src/components/q2-relative-time/q2-relative-time.scss?tag=q2-relative-time&encapsulation=shadow","src/components/q2-relative-time/q2-relative-time.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n:host {\n display: inline;\n}\n","import { Component, Prop, State, Method, Watch, Element, h, ComponentInterface, Fragment } from '@stencil/core';\nimport { isValid as isValidDate, intlFormatDistance } from 'date-fns';\n\n@Component({ tag: 'q2-relative-time', shadow: true, styleUrl: 'q2-relative-time.scss' })\nexport class Q2RelativeTime implements ComponentInterface {\n /**\n * If you want to compare two specific dates, you can provide a valid `date` and `baseDate`, and the component will tell you the elapsed time between the two dates.\n * If `baseDate` is not provided, the date and time at render will be used instead and - if `sync` is true - updated every second to reflect the time between the `date` value and now.\n * @warning\n * - Requires a valid `date` value.\n * - Providing a valid `baseDate` will disable `sync` and remove the \"in\"/\"ago\" suffixes in the time message.\n * - Must be a valid ISO date string.\n */\n @Prop({ reflect: true }) baseDate: Date | string;\n\n /**\n * The language used for the relative time message.\n * @info\n * It is recommended to use the BCP 47 Language Tags in the ['language-extlang' format](https://www.w3.org/International/articles/language-tags/).\n */\n @Prop({ reflect: true }) locale: string = document.documentElement.lang || 'en-US';\n\n /** The length of the relative time message. */\n @Prop({ reflect: true }) messageFormat: 'long' | 'short' | 'narrow' = 'short';\n\n /** Set this to `always` to force the use of numeric values (e.g. \"1 day ago\") rather than relative ones (e.g. \"yesterday\") in the time message. */\n @Prop({ reflect: true }) numeric: 'always' | 'auto' = 'auto';\n\n /**\n * Keep the displayed message updated as time passes in the webpage.\n * @warning\n * If a valid `baseDate` is provided, `sync` will be set to `false`.\n */\n @Prop({ reflect: true, mutable: true }) sync: boolean = true;\n\n /**\n * The date you want to calculate relative time from.\n * @warning\n * Must be a valid ISO date string.\n */\n @Prop({ reflect: true }) date: Date | string;\n\n /** Force the unit of measurement. */\n @Prop({ reflect: true }) unit: 'second' | 'minute' | 'hour' | 'day' | 'month' | 'quarter' | 'year';\n\n /**\n * @private\n * Used to manage the sync timer that updates the time since the component was connected to the DOM.\n * Will be set to null if a valid `baseDate` is provided.\n */\n syncTimer = null;\n\n /** @private Will be set to true if a valid `baseDate` is provided. */\n trimSuffix: boolean = false;\n\n @State() displayedMessage: string;\n\n @Element() hostElement: HTMLElement;\n\n /// Lifecycle Hooks ///\n\n componentWillLoad(): void | Promise<void> {\n this.updateMessage();\n }\n\n connectedCallback(): void {\n this.syncUpdated();\n }\n\n disconnectedCallback(): void {\n window.clearInterval(this.syncTimer);\n this.syncTimer = null;\n }\n\n /// Getters ///\n get shouldShow(): boolean {\n return !!this.displayedMessage;\n }\n\n get validDate(): boolean {\n const targetDate = new Date(this.date);\n return isValidDate(targetDate);\n }\n\n get handleDate(): Date {\n if (!this.validDate) console.warn('Error: Invalid date provided to q2-relative-time.');\n return new Date(this.date);\n }\n\n get validBaseDate(): boolean {\n const baseDate = new Date(this.baseDate);\n return isValidDate(baseDate);\n }\n\n get handleBaseDate(): Date {\n if (this.validBaseDate) {\n this.trimSuffix = true;\n this.sync = false;\n return new Date(this.baseDate);\n } else {\n this.trimSuffix = false;\n this.sync = true;\n return new Date();\n }\n }\n\n get isValidUnit(): boolean {\n if (['second', 'minute', 'hour', 'day', 'month', 'quarter', 'year'].includes(this.unit)) return true;\n return false;\n }\n\n get handleNumeric(): 'always' | 'auto' {\n if (this.validBaseDate) return 'always';\n return this.numeric;\n }\n\n /// Watchers ///\n @Watch('sync')\n syncUpdated() {\n if (this.sync) {\n this.syncTimer = window.setInterval(() => {\n this.updateMessage();\n }, 1000);\n } else {\n window.clearInterval(this.syncTimer);\n this.syncTimer = null;\n }\n }\n\n @Watch('messageFormat')\n @Watch('locale')\n @Watch('date')\n @Watch('baseDate')\n @Watch('numeric')\n @Watch('unit')\n updateMessage() {\n const {\n validDate,\n handleDate,\n handleBaseDate,\n locale,\n handleNumeric,\n messageFormat,\n isValidUnit,\n unit,\n trimSuffix,\n } = this;\n\n if (!validDate) {\n this.sync = false;\n this.displayedMessage = 'Invalid Date Provided';\n return;\n }\n\n const message = intlFormatDistance(new Date(handleDate), new Date(handleBaseDate), {\n locale,\n localeMatcher: 'best fit',\n numeric: handleNumeric,\n style: messageFormat,\n unit: isValidUnit ? unit : null,\n });\n\n if (trimSuffix) {\n this.displayedMessage = this.trimMessage(message);\n } else {\n this.displayedMessage = message;\n }\n }\n\n /// Helpers ///\n trimMessage(message: string): string {\n return message.replace(/^in\\s?/, '').replace(/\\sago$/, '');\n }\n\n /// Methods ///\n /** Retrieves the value of the displayed messages. */\n @Method()\n async displayedMessageValue(): Promise<string> {\n return this.displayedMessage;\n }\n\n /// DOM ///\n\n render() {\n const { shouldShow, displayedMessage } = this;\n\n return <Fragment>{shouldShow ? <time dateTime={displayedMessage}>{displayedMessage}</time> : null}</Fragment>;\n }\n}\n"],"mappings":"6FAAA,MAAMA,EAAoB,+qBAC1B,MAAAC,EAAeD,E,MCGFE,EAAc,M,yBA8CvBC,KAAAC,UAAY,KAGZD,KAAAE,WAAsB,M,oCAjCoBC,SAASC,gBAAgBC,MAAQ,Q,mBAGL,Q,aAGhB,O,UAOE,K,wEA4BxD,iBAAAC,GACIN,KAAKO,e,CAGT,iBAAAC,GACIR,KAAKS,a,CAGT,oBAAAC,GACIC,OAAOC,cAAcZ,KAAKC,WAC1BD,KAAKC,UAAY,I,CAIrB,cAAIY,GACA,QAASb,KAAKc,gB,CAGlB,aAAIC,GACA,MAAMC,EAAa,IAAIC,KAAKjB,KAAKkB,MACjC,OAAOC,UAAYH,E,CAGvB,cAAII,GACA,IAAKpB,KAAKe,UAAWM,QAAQC,KAAK,qDAClC,OAAO,IAAIL,KAAKjB,KAAKkB,K,CAGzB,iBAAIK,GACA,MAAMC,EAAW,IAAIP,KAAKjB,KAAKwB,UAC/B,OAAOL,UAAYK,E,CAGvB,kBAAIC,GACA,GAAIzB,KAAKuB,cAAe,CACpBvB,KAAKE,WAAa,KAClBF,KAAK0B,KAAO,MACZ,OAAO,IAAIT,KAAKjB,KAAKwB,S,KAClB,CACHxB,KAAKE,WAAa,MAClBF,KAAK0B,KAAO,KACZ,OAAO,IAAIT,I,EAInB,eAAIU,GACA,GAAI,CAAC,SAAU,SAAU,OAAQ,MAAO,QAAS,UAAW,QAAQC,SAAS5B,KAAK6B,MAAO,OAAO,KAChG,OAAO,K,CAGX,iBAAIC,GACA,GAAI9B,KAAKuB,cAAe,MAAO,SAC/B,OAAOvB,KAAK+B,O,CAKhB,WAAAtB,GACI,GAAIT,KAAK0B,KAAM,CACX1B,KAAKC,UAAYU,OAAOqB,aAAY,KAChChC,KAAKO,eAAe,GACrB,I,KACA,CACHI,OAAOC,cAAcZ,KAAKC,WAC1BD,KAAKC,UAAY,I,EAUzB,aAAAM,GACI,MAAMQ,UACFA,EAASK,WACTA,EAAUK,eACVA,EAAcQ,OACdA,EAAMH,cACNA,EAAaI,cACbA,EAAaP,YACbA,EAAWE,KACXA,EAAI3B,WACJA,GACAF,KAEJ,IAAKe,EAAW,CACZf,KAAK0B,KAAO,MACZ1B,KAAKc,iBAAmB,wBACxB,M,CAGJ,MAAMqB,EAAUC,qBAAmB,IAAInB,KAAKG,GAAa,IAAIH,KAAKQ,GAAiB,CAC/EQ,SACAI,cAAe,WACfN,QAASD,EACTQ,MAAOJ,EACPL,KAAMF,EAAcE,EAAO,OAG/B,GAAI3B,EAAY,CACZF,KAAKc,iBAAmBd,KAAKuC,YAAYJ,E,KACtC,CACHnC,KAAKc,iBAAmBqB,C,EAKhC,WAAAI,CAAYJ,GACR,OAAOA,EAAQK,QAAQ,SAAU,IAAIA,QAAQ,SAAU,G,CAM3D,2BAAMC,GACF,OAAOzC,KAAKc,gB,CAKhB,MAAA4B,GACI,MAAM7B,WAAEA,EAAUC,iBAAEA,GAAqBd,KAEzC,OAAO2C,EAACC,EAAQ,CAAAC,IAAA,4CAAEhC,EAAa8B,EAAA,QAAMG,SAAUhC,GAAmBA,GAA2B,K"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as t,c as e,h as a,F as r,g as o}from"./p-a5f18e27.js";import{r as l,l as n}from"./p-84190698.js";const c="*{box-sizing:border-box}*:active{outline:none}*:focus{outline:none;box-shadow:var(--const-double-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #0066cc)}:host{box-shadow:none !important}::-moz-focus-inner{border:none}input,textarea,button{font-family:inherit;font-size:inherit;font-stretch:inherit}:host(.sr),:host(.sr) button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.sr,.sr button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none}:host([hidden]){display:none}.invisible{visibility:hidden}:host{display:block}.container{--comp-cell-padding:var(--tct-data-table-cell-padding, var(--tct-table-cell-padding, var(--app-scale-3x, 15px)));--comp-select-column-width:var(--tct-data-table-select-column-width, var(--tct-table-select-column-width, var(--tct-checkbox-size, 20px)));--comp-dropdown-column-width:var(--tct-data-table-dropdown-column-width, var(--tct-table-dropdown-column-width, var(--tct-btn-icon-width, 44px)));--comp-expandable-row-control-column-width:var(--tct-data-table-expandable-row-control-column-width, var(--tct-table-expandable-row-control-column-width, var(--tct-btn-icon-width, 44px)));overflow:auto;--comp-scrollbar-size:var(--tct-scrollbar-size, var(--t-scrollbar-size, var(--app-scale-1x, 5px)));--comp-scrollbar-border-radius:var(--tct-scrollbar-border-radius, var(--t-scrollbar-border-radius, var(--app-border-radius-1, 3px)));--comp-scrollbar-color:var(--tct-scrollbar-color, var(--t-scrollbar-color, var(--t-a11y-gray-color, #747474)));scrollbar-width:thin;scrollbar-color:var(--comp-scrollbar-color) transparent}.container::-webkit-scrollbar{width:var(--comp-scrollbar-size);height:var(--comp-scrollbar-size);margin:5px}.container::-webkit-scrollbar-thumb{background:var(--comp-scrollbar-color);border-radius:var(--comp-scrollbar-border-radius)}.container::-webkit-scrollbar-track{background:transparent;border-radius:var(--comp-scrollbar-border-radius)}:host([shadowed]:not([shadowed=false])) .container{box-shadow:var(--tct-data-table-shadow, var(--tct-table-shadow, var(--app-shadow-1, 0 2px 4px rgba(0, 0, 0, 0.3))))}:host([density=compact]) .container{--comp-cell-padding:var(--tct-data-table-cell-padding-compact, var(--tct-table-cell-padding-compact, var(--app-scale-1x, 5px)))}:host([density=comfortable]) .container{--comp-cell-padding:var(--tct-data-table-cell-padding-comfortable, var(--tct-table-cell-padding-comfortable, var(--app-scale-5x, 25px)))}table{table-layout:var(--tct-data-table-layout, var(--tct-table-layout, auto));border-collapse:collapse;border-spacing:0;width:var(--tct-data-table-width, var(--tct-table-width));min-width:100%;background:var(--tct-data-table-background, var(--tct-table-background, var(--t-base, #ffffff)));caption-side:var(--tct-data-table-caption-side, var(--tct-table-caption-side, bottom))}thead{border-width:var(--tct-data-table-header-border-width, var(--tct-table-header-border-width, 0 0 2px 0));border-style:var(--tct-data-table-header-border-style, var(--tct-table-header-border-style, solid));border-color:var(--tct-data-table-header-border-color, var(--tct-table-header-border-color, var(--t-gray-9, #999999)));background:var(--tct-data-table-header-background, var(--tct-table-header-background))}col.select-column{width:var(--comp-select-column-width)}col.expandable-row-control-column{width:var(--comp-expandable-row-control-column-width)}col.dropdown-column{width:var(--comp-dropdown-column-width)}td,th{padding:var(--comp-cell-padding);text-align:start;vertical-align:middle}td.align-end,th.align-end{text-align:end}td.align-center,th.align-center{text-align:center}td.vertical-align-top,th.vertical-align-top{vertical-align:top}td.vertical-align-bottom,th.vertical-align-bottom{vertical-align:bottom}th .header-content{font-weight:var(--tct-data-table-header-font-weight, var(--tct-table-header-font-weight, 600));font-size:var(--tct-data-table-header-font-size, var(--app-font-size, 14px))}th.sorted .header-content{font-weight:var(--tct-data-table-header-sorted-font-weight, var(--tct-table-header-sorted-font-weight, 600))}th .sorted-indicator{--comp-header-sortable-icon-size:var(--tct-data-table-header-sortable-icon-size, var(--tct-table-header-sortable-icon-size, var(--app-scale-3x, 15px)));--tct-icon-stroke-width:2;width:var(--comp-header-sortable-icon-size);height:var(--comp-header-sortable-icon-size)}th .sorted-indicator.direction-ASC{transform:rotate(180deg)}th q2-btn .header-content{display:flex;align-items:center;gap:var(--tct-data-table-header-content-gap, var(--tct-table-header-content-gap, var(--app-scale-2x, 10px)))}tr.expandable,tr.clickable{cursor:pointer}tr.expandable:focus,tr.clickable:focus{outline:none;box-shadow:none}tr.expandable:hover{background:var(--tct-data-table-expandable-row-hover-background, var(--tct-table-expandable-row-hover-background, var(--t-gray-14, #f2f2f2)))}tr.clickable:hover{background:var(--tct-data-table-clickable-row-hover-background, var(--tct-table-clickable-row-hover-background, var(--t-gray-14, #f2f2f2)))}tr.selected{background:var(--tct-data-table-selected-row-background, var(--tct-table-selected-row-background, var(--t-gray-14, #f2f2f2)))}tr.expanded{background:var(--tct-data-table-expanded-row-background, var(--tct-table-expanded-row-background, var(--t-gray-14, #f2f2f2)))}tr.expanded .toggle-expandable-row{transform:rotate(180deg)}:host([bordered]:not([bordered=false])) tbody tr{border-width:var(--tct-data-table-row-border-width, var(--tct-table-row-border-width, 0 0 1px 0));border-style:var(--tct-data-table-row-border-style, var(--tct-table-row-border-style, solid));border-color:var(--tct-data-table-row-border-color, var(--tct-table-row-border-color, var(--t-gray-9, #999999)))}tr.loading-row{background:var(--tct-data-table-loading-row-background, var(--tct-table-loading-row-background, var(--t-base, #ffffff)))}tr.loading-row td{text-align:center}tr.loading-row q2-loading{font-size:4em}tr.empty-state{background:var(--tct-data-table-loading-row-background, var(--t-base, #ffffff))}tr.empty-state td{text-align:center}tr.empty-state .empty-state-content{display:flex;flex-direction:column;align-items:center;padding-top:var(--app-scale-10x, 50px);padding-bottom:var(--app-scale-10x, 50px);gap:var(--app-scale-4x, 20px);--tct-icon-size:var(--app-scale-6x, 30px)}tr.expandable-row{background:var(--tct-data-table-expanded-row-background, var(--tct-table-expanded-row-background, var(--t-gray-14, #f2f2f2)))}td.clamped div{text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-line-clamp:var(--comp-line-clamp-count, 1);-webkit-box-orient:vertical}td.expandable-row-control-column{--tct-btn-icon-hover-bg:transparent;padding:var(--tct-data-table-expandable-row-control-column-padding, var(--tct-table-expandable-row-control-column-padding, 0 5px));text-align:center}td.dropdown-column{padding:var(--tct-data-table-dropdown-column-padding, var(--tct-table-dropdown-column-padding, 0 5px));text-align:center}td.click-column:not(.sr){padding:var(--tct-data-table-clickable-column-padding, var(--tct-table-clickable-column-padding, 0 5px));text-align:center}caption{padding:var(--tct-data-table-caption-padding, var(--tct-table-caption-padding, var(--app-scale-2x, 10px)));font-size:var(--tct-data-table-caption-font-size, var(--tct-table-caption-font-size, inherit));font-weight:var(--tct-data-table-caption-font-weight, var(--tct-table-caption-font-weight, 600));text-align:var(--tct-data-table-caption-text-align, var(--tct-table-caption-text-align, center));color:var(--tct-data-table-caption-color, var(--tct-table-caption-color, inherit))}q2-checkbox{padding:0}";const i=c;const d=class{constructor(a){t(this,a);this.select=e(this,"select",7);this.click=e(this,"click",7);this.toggle=e(this,"toggle",7);this.sort=e(this,"sort",7);this.selectAllRows=e(this,"selectAllRows",7);this.checkSlots=()=>{var t,e,a,r;this.hasExpandableRows=!!((e=(t=this.hostElement)===null||t===void 0?void 0:t.querySelector(`[slot$="-expandable-content"]`))!==null&&e!==void 0?e:false);this.hasDropdowns=!!((r=(a=this.hostElement)===null||a===void 0?void 0:a.querySelector(`[slot$="-dropdown"]`))!==null&&r!==void 0?r:false);this.checkSlotCount+=1};this.onSort=t=>{const e=t.sorted==="ASC"?"DESC":"ASC";const a=t.key;const r=this.sort.emit({header:t,direction:e});if(r.defaultPrevented)return;this.serializedHeaders=this.serializedHeaders.map((t=>{const r=a===t.key?e:undefined;return Object.assign(Object.assign({},t),{sorted:r})}));this.serializedRows=this.sortRows(this.serializedRows,Object.assign(Object.assign({},t),{sorted:e}))};this.onSelectRow=(t,e)=>{t.stopPropagation();const{selectMode:a,serializedRows:r,selectedRows:o}=this;const{checked:l}=t.detail;const n=Object.assign(Object.assign({},e),{selected:l});let c;if(a==="single"){c=l?[n]:[]}else{c=l?[...o,n]:o.filter((t=>t.id!==n.id))}const i=c.length===r.length;const d=!i&&c.length>0;const s=this.select.emit({row:n,rows:c,allSelected:i});if(s.defaultPrevented)return;this.serializedRows=this.serializedRows.map((t=>t.id===n.id?n:t));this.allRowsSelected=i;this.someRowsSelected=d};this.onClickTableRow=(t,e)=>{if(this.clickable){this.onClickRow(t,e)}else if(this.hasExpandableRows){this.onToggleRow(t,e)}};this.onClickRow=(t,e)=>{t.stopPropagation();this.click.emit({row:e})};this.onToggleRow=(t,e)=>{t.stopPropagation();const a=Object.assign(Object.assign({},e),{expanded:!e.expanded});const r=this.toggle.emit({row:a});if(r.defaultPrevented)return;this.serializedRows=this.serializedRows.map((t=>{if(t.id===a.id)return a;else return Object.assign({},t)}))};this.onControlContainerClick=t=>{t.stopPropagation()};this.bordered=undefined;this.clickable=undefined;this.caption=undefined;this.density=undefined;this.emptyIcon="inbox";this.emptyMessage="tecton.element.dataTable.emptyMessage";this.headers=undefined;this.hideCaption=undefined;this.hideClickable=undefined;this.loading=undefined;this.rows=undefined;this.selectable=undefined;this.selectMode="multiple";this.shadowed=undefined;this.serializedHeaders=[];this.serializedRows=[];this.hasExpandableRows=false;this.hasDropdowns=false;this.allRowsSelected=false;this.someRowsSelected=false;this.hasRowData=false;this.checkSlotCount=0}componentWillLoad(){this.headersHandler(this.headers);this.rowsHandler(this.rows)}componentDidLoad(){if(typeof MutationObserver!=="undefined"){const t=new MutationObserver((()=>this.checkSlots()));t.observe(this.hostElement,{childList:true,subtree:true,attributes:true});this.mutationObserver=t}if(typeof ResizeObserver!=="undefined"){this.resizeObserver=new ResizeObserver((()=>l()));this.resizeObserver.observe(this.hostElement)}}disconnectedCallback(){if(this.mutationObserver){this.mutationObserver.disconnect();this.mutationObserver=null}if(this.resizeObserver){this.resizeObserver.disconnect();this.resizeObserver=null}}get selectedRows(){return this.serializedRows.filter((({selected:t})=>t))}get selectedRow(){return this.selectedRows.find((({selected:t})=>!!t))}get numberOfColumns(){var t,e;return((e=(t=this.serializedHeaders)===null||t===void 0?void 0:t.length)!==null&&e!==void 0?e:0)+(this.selectable?1:0)+(this.clickable?1:0)+(this.hasExpandableRows?1:0)+(this.hasDropdowns?1:0)}get mappedHeaders(){return this.serializedHeaders.reduce(((t,e)=>{t[e.key]=e;return t}),{})}sortRows(t,e){const{key:a,sorted:r}=e;const o=r||"ASC";const l=[...t].sort(((t,e)=>{const r=t.cells[a].value;const l=e.cells[a].value;if(r<l)return o==="ASC"?-1:1;if(r>l)return o==="ASC"?1:-1;return 0}));return l}headersHandler(t=[]){this.serializedHeaders=t.map((t=>{const{title:e}=t;let{key:a}=t;if(!a)a=e.toLowerCase().replace(/\s/g,"-");return Object.assign({key:a},t)}))}rowsHandler(t=[]){const{serializedHeaders:e,mappedHeaders:a}=this;const r={id:null,cells:{},selected:false,expanded:false,disabled:false};let o=true;let l=false;const n=t.map((({id:t,cells:e,selected:n,expanded:c,disabled:i})=>{const d=Object.entries(e).reduce(((t,[e,r])=>{const o=a[e]||{};const{align:l,type:n="text",lineClamp:c,verticalAlign:i}=o;const d="type"in o&&o.type==="badge";const s={value:"",ariaLabel:undefined,type:n,align:l,lineClamp:c,verticalAlign:i,badgeStatus:d?o.badgeStatus:undefined,badgeTheme:d?o.badgeTheme:undefined};const b=typeof r==="object"?Object.assign(Object.assign({},s),r):Object.assign(Object.assign({},s),{value:r});t[e]=b;return t}),{});if(o&&!n)o=false;if(!o&&n)l=true;return Object.assign(Object.assign({},r),{id:t,selected:!!n,expanded:!!c,disabled:!!i,cells:d})}));const c=e.find((({sorted:t})=>t));this.hasRowData=!!t.length;this.allRowsSelected=this.hasRowData&&o;this.someRowsSelected=this.hasRowData&&l;this.serializedRows=!!c?this.sortRows(n,c):n;this.checkSlots()}selectableHandler(){if(this.selectable===false){this.selectAllRows.emit({checked:false})}}onClickListener(t){if(t instanceof PointerEvent)t.stopImmediatePropagation()}onSelectAllRows(t){t.stopPropagation();const{checked:e}=t.detail;const a=e?this.serializedRows.map((t=>{if(t.disabled){return t}else{return Object.assign(Object.assign({},t),{selected:e})}})):[];const r=this.select.emit({row:undefined,rows:a,allSelected:e});if(r.defaultPrevented)return;this.serializedRows=this.serializedRows.map((t=>{if(t.disabled)return t;t.selected=e;return t}));this.allRowsSelected=e;this.someRowsSelected=false}render(){const{caption:t}=this;return a("div",{key:"d1de84188f5da69359c6c9f04d0a6ecf8190883b",class:"container"},a("table",{key:"9b8d3e02d2417c005ed2ee6e0495dec2355476b1"},t&&a("caption",{key:"b3545a27ae848672c2f0604f89d22558a59cd066",class:this.hideCaption?"sr":undefined},t),this.renderTableColGroup(),this.renderTableHeader(),this.renderEmptyState(),this.renderTableRows()))}renderTableColGroup(){const{serializedHeaders:t,selectable:e,clickable:r,hasExpandableRows:o,hasDropdowns:l}=this;if(!t.length)return null;return a("colgroup",null,e&&a("col",{class:"select-column"}),t.map((({width:t,backgroundColor:e})=>a("col",{style:{width:t,backgroundColor:e}}))),r&&a("col",{class:"click-column"}),o&&a("col",{class:"expandable-row-control-column"}),l&&a("col",{class:"dropdown-column"}))}renderTableHeader(){const{serializedHeaders:t,selectable:e,clickable:r,hideClickable:o,selectMode:l,hasExpandableRows:c,hasDropdowns:i,allRowsSelected:d,someRowsSelected:s,hasRowData:b,loading:h}=this;if(!t.length)return null;return a("thead",null,a("tr",null,e&&a("th",null,l==="multiple"&&a("q2-checkbox",{label:n("tecton.element.dataTable.selectAllRows"),"hide-label":true,onChange:()=>this.selectAllRows.emit({checked:!d}),checked:b&&d&&!s,indeterminate:b&&s&&!d,disabled:h||!b,"test-id":"select-all-rows-control"})),t.map((t=>{const{align:e,sorted:r,verticalAlign:o}=t;const l=[];if(e)l.push(`align-${e}`);if(o)l.push(`vertical-align-${o}`);if(!!r)l.push("sorted");return a("th",{class:l.join(" "),id:`header-${t.key}`},t.sortable?a("q2-btn",{onClick:()=>this.onSort(t),"test-id":"sort-control",disabled:this.loading},a("div",{class:"header-content","aria-label":t.ariaLabel||undefined},t.title,!!r?a("q2-icon",{class:`sorted-indicator direction-${r}`,type:"arrow-down",label:r==="ASC"?n("tecton.element.dataTable.sortedAscending"):n("tecton.element.dataTable.sortedDescending"),"test-id":"sorted-indicator"}):a("q2-icon",{class:`sorted-indicator`,type:"sort",label:n("tecton.element.dataTable.clickToSort"),"test-id":"sorted-indicator"}))):a("div",{class:"header-content","aria-label":t.ariaLabel||undefined},t.title))})),r&&a("th",{id:"click",class:o?"sr":undefined},a("span",{class:"sr"},n("tecton.element.dataTable.clickRow"))),c&&a("th",{id:"toggle"},a("span",{class:"sr"},n("tecton.element.dataTable.toggleRow"))),i&&a("th",null,a("span",{class:"sr"},n("tecton.element.dataTable.dropdown")))))}renderEmptyState(){const{hasRowData:t,numberOfColumns:e,emptyIcon:r,emptyMessage:o,loading:l}=this;if(t||l)return null;return a("slot",{name:"empty-table"},a("tbody",null,a("tr",{class:"empty-state"},a("td",{colSpan:e},a("div",{class:"empty-state-content"},a("q2-icon",{type:r}),a("p",null,n(o)))))))}renderTableRows(){const{serializedHeaders:t,serializedRows:e,selectable:o,clickable:l,hideClickable:c,selectMode:i,hasExpandableRows:d,hasDropdowns:s,numberOfColumns:b,loading:h}=this;if(h){return a("tbody",null,a("tr",{class:"loading-row"},a("td",{colSpan:b},a("q2-loading",{inline:true}))))}let p=false;let u;if(i==="single"){u=this.selectedRow;p=!!u}const v=[];if(l)v.push("click-column");if(c)v.push("sr");const f=v.join(" ");return a("tbody",null,e.map((e=>{const c=`row-${e.id}-cell`;const i=`row-${e.id}-expandable-content`;const h=`row-${e.id}-dropdown`;const v=d&&!!this.hostElement.querySelector(`[slot="${i}"]`);const g=s&&!!this.hostElement.querySelector(`[slot="${h}"]`);const w=[];if(v)w.push("expandable");if(l)w.push("clickable");if(e.expanded)w.push("expanded");if(e.selected)w.push("selected");const m=l||v;return a(r,null,a("tr",{id:`row-${e.id}`,class:w.join(" "),onClick:m&&(t=>this.onClickTableRow(t,e)),tabIndex:m?-1:undefined},o&&a("td",{class:"select-column",onClick:this.onControlContainerClick},a("q2-checkbox",{label:n("tecton.element.dataTable.selectRow"),"hide-label":true,checked:e.selected,disabled:p&&e!==u||e.disabled,onChange:t=>this.onSelectRow(t,e),"test-id":"select-row-control"})),t.map((({key:t})=>{const r=e.cells[t];const o=r===null||r===void 0?void 0:r.lineClamp;const l=r===null||r===void 0?void 0:r.align;const n=r===null||r===void 0?void 0:r.verticalAlign;const i=[];if(l)i.push(`align-${l}`);if(n)i.push(`vertical-align-${n}`);if(o)i.push("clamped");const d=o?{"--comp-line-clamp-count":`${o}`}:undefined;return a("td",{class:i.join(" "),style:d},a("slot",{name:`${c}-${t}`},this.renderCellContent(r)))})),l&&a("td",{class:f},a("q2-btn",{intent:"neutral",size:"small",onClick:t=>this.onClickRow(t,e),"test-id":"clickable-row-control"},n("tecton.element.dataTable.clickRow"))),d&&a("td",{class:"expandable-row-control-column",onClick:this.onControlContainerClick},v&&a("q2-btn",{onClick:t=>this.onToggleRow(t,e),ariaExpanded:`${e.expanded}`,ariaControls:i,ariaLabel:n("tecton.element.dataTable.toggleRow"),"test-id":"expandable-row-control"},a("q2-icon",{type:"chevron-down",class:"toggle-expandable-row"}))),s&&a("td",{class:"dropdown-column",onClick:this.onControlContainerClick},g&&a("slot",{name:h}))),v&&a("tr",{id:i,class:"expandable-row",hidden:!e.expanded,"aria-hidden":!e.expanded},a("td",{colSpan:b,headers:"toggle"},a("div",{class:"expandable-content"},a("slot",{name:i})))))})))}renderCellContent(t){if(!t)return;const{type:e,ariaLabel:r,value:o}=t;if([undefined,null].includes(o))return;switch(e){case"badge":let e;switch(typeof o){case"string":e=parseFloat(o);break;case"boolean":e=o?1:0;break;default:e=o;break}return a("q2-badge",{"aria-label":r,value:e,theme:t.badgeTheme,status:t.badgeStatus,size:"large"});case"icon":const l=typeof o==="string"?o:`${o}`;return a("q2-icon",{label:r,type:l});case"boolean":return!!o?a("q2-icon",{label:n("tecton.element.dataTable.booleanTrue"),type:"checkmark"}):a("div",{"aria-label":n("tecton.element.dataTable.booleanFalse")});case"code":return a("code",{"aria-label":r},o);default:return a("div",{"aria-label":r},o)}}get hostElement(){return o(this)}static get watchers(){return{headers:["headersHandler"],rows:["rowsHandler"],selectable:["selectableHandler"]}}};d.style=i;export{d as q2_data_table};
|
|
2
|
-
//# sourceMappingURL=p-52e277b8.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["q2DataTableCss","Q2DataTableStyle0","Q2DataTable","this","checkSlots","hasExpandableRows","_b","_a","hostElement","querySelector","hasDropdowns","_d","_c","checkSlotCount","onSort","header","direction","sorted","sortKey","key","sortEvent","sort","emit","defaultPrevented","serializedHeaders","map","serializedHeader","undefined","Object","assign","serializedRows","sortRows","onSelectRow","event","row","stopPropagation","selectMode","selectedRows","currentlySelectedRows","checked","detail","selectedRow","selected","filter","id","allRowsSelected","length","isIndeterminate","selectEvent","select","rows","allSelected","someRowsSelected","onClickTableRow","clickable","onClickRow","onToggleRow","click","expanded","toggleEvent","toggle","onControlContainerClick","componentWillLoad","headersHandler","headers","rowsHandler","componentDidLoad","MutationObserver","observer","observe","childList","subtree","attributes","mutationObserver","ResizeObserver","resizeObserver","resizeIframe","disconnectedCallback","disconnect","find","numberOfColumns","selectable","mappedHeaders","reduce","accum","sortedRows","a","b","aValue","cells","value","bValue","title","toLowerCase","replace","defaultRow","disabled","isAllSelected","serializedCells","entries","cellKey","cellData","align","type","lineClamp","verticalAlign","isBadge","defaultCell","ariaLabel","badgeStatus","badgeTheme","result","sortedHeader","hasRowData","selectableHandler","selectAllRows","onClickListener","PointerEvent","stopImmediatePropagation","onSelectAllRows","render","caption","h","class","hideCaption","renderTableColGroup","renderTableHeader","renderEmptyState","renderTableRows","width","backgroundColor","style","hideClickable","loading","label","loc","onChange","indeterminate","headerClasses","push","join","sortable","onClick","emptyIcon","emptyMessage","name","colSpan","inline","isSelectDisabled","clickableClasses","clickableClassString","cellSlotPrefix","expandableRowName","dropdownCellName","rowHasExpandableSlot","rowHasDropdownSlot","rowClasses","rowIsClickable","Fragment","e","tabIndex","cell","cellAlign","cellVerticalAlign","cellClasses","cellStyles","renderCellContent","intent","size","ariaExpanded","ariaControls","hidden","includes","valueAsInt","parseFloat","theme","status","valueAsString"],"sources":["src/components/q2-data-table/q2-data-table.scss?tag=q2-data-table&encapsulation=shadow","src/components/q2-data-table/q2-data-table.tsx"],"sourcesContent":["@import '../../styles/host.scss';\n@import '../../styles/functions';\n\n:host {\n display: block;\n}\n\n.container {\n --comp-cell-padding: #{var-list(--tct-data-table-cell-padding, --tct-table-cell-padding, --app-scale-3x, 15px)};\n --comp-select-column-width: #{var-list(\n --tct-data-table-select-column-width,\n --tct-table-select-column-width,\n --tct-checkbox-size,\n 20px\n )};\n --comp-dropdown-column-width: #{var-list(\n --tct-data-table-dropdown-column-width,\n --tct-table-dropdown-column-width,\n --tct-btn-icon-width,\n 44px\n )};\n --comp-expandable-row-control-column-width: #{var-list(\n --tct-data-table-expandable-row-control-column-width,\n --tct-table-expandable-row-control-column-width,\n --tct-btn-icon-width,\n 44px\n )};\n\n overflow: auto;\n @include tiny-scrollbar();\n\n :host([shadowed]:not([shadowed='false'])) & {\n box-shadow: var-list(\n --tct-data-table-shadow,\n --tct-table-shadow,\n --app-shadow-1,\n unquote('0 2px 4px rgba(0, 0, 0, 0.3)')\n );\n }\n\n :host([density='compact']) & {\n --comp-cell-padding: #{var-list(\n --tct-data-table-cell-padding-compact,\n --tct-table-cell-padding-compact,\n --app-scale-1x,\n 5px\n )};\n }\n\n :host([density='comfortable']) & {\n --comp-cell-padding: #{var-list(\n --tct-data-table-cell-padding-comfortable,\n --tct-table-cell-padding-comfortable,\n --app-scale-5x,\n 25px\n )};\n }\n}\n\ntable {\n table-layout: var-list(--tct-data-table-layout, --tct-table-layout, auto);\n border-collapse: collapse;\n border-spacing: 0;\n width: var-list(--tct-data-table-width, --tct-table-width);\n min-width: 100%;\n background: var-list(--tct-data-table-background, --tct-table-background, --t-base, #ffffff);\n caption-side: var-list(--tct-data-table-caption-side, --tct-table-caption-side, bottom);\n}\n\nthead {\n border-width: var-list(--tct-data-table-header-border-width, --tct-table-header-border-width, unquote('0 0 2px 0'));\n border-style: var-list(--tct-data-table-header-border-style, --tct-table-header-border-style, solid);\n border-color: var-list(--tct-data-table-header-border-color, --tct-table-header-border-color, --t-gray-9, #999999);\n background: var-list(--tct-data-table-header-background, --tct-table-header-background);\n}\n\ncol {\n &.select-column {\n width: var(--comp-select-column-width);\n }\n\n &.expandable-row-control-column {\n width: var(--comp-expandable-row-control-column-width);\n }\n\n &.dropdown-column {\n width: var(--comp-dropdown-column-width);\n }\n}\n\ntd,\nth {\n padding: var(--comp-cell-padding);\n text-align: start;\n vertical-align: middle;\n\n &.align-end {\n text-align: end;\n }\n &.align-center {\n text-align: center;\n }\n &.vertical-align-top {\n vertical-align: top;\n }\n &.vertical-align-bottom {\n vertical-align: bottom;\n }\n}\n\nth {\n .header-content {\n font-weight: var-list(--tct-data-table-header-font-weight, --tct-table-header-font-weight, 600);\n font-size: var-list(--tct-data-table-header-font-size, --app-font-size, 14px);\n }\n\n &.sorted {\n .header-content {\n font-weight: var-list(\n --tct-data-table-header-sorted-font-weight,\n --tct-table-header-sorted-font-weight,\n 600\n );\n }\n }\n\n .sorted-indicator {\n --comp-header-sortable-icon-size: #{var-list(\n --tct-data-table-header-sortable-icon-size,\n --tct-table-header-sortable-icon-size,\n --app-scale-3x,\n 15px\n )};\n --tct-icon-stroke-width: 2;\n\n width: var(--comp-header-sortable-icon-size);\n height: var(--comp-header-sortable-icon-size);\n\n &.direction-ASC {\n transform: rotate(180deg);\n }\n }\n\n q2-btn {\n .header-content {\n display: flex;\n align-items: center;\n gap: var-list(--tct-data-table-header-content-gap, --tct-table-header-content-gap, --app-scale-2x, 10px);\n }\n }\n}\n\ntr {\n &.expandable,\n &.clickable {\n cursor: pointer;\n\n &:focus {\n outline: none;\n box-shadow: none;\n }\n }\n\n &.expandable {\n &:hover {\n background: var-list(\n --tct-data-table-expandable-row-hover-background,\n --tct-table-expandable-row-hover-background,\n --t-gray-14,\n #f2f2f2\n );\n }\n }\n\n &.clickable {\n &:hover {\n background: var-list(\n --tct-data-table-clickable-row-hover-background,\n --tct-table-clickable-row-hover-background,\n --t-gray-14,\n #f2f2f2\n );\n }\n }\n\n &.selected {\n background: var-list(\n --tct-data-table-selected-row-background,\n --tct-table-selected-row-background,\n --t-gray-14,\n #f2f2f2\n );\n }\n\n &.expanded {\n background: var-list(\n --tct-data-table-expanded-row-background,\n --tct-table-expanded-row-background,\n --t-gray-14,\n #f2f2f2\n );\n\n .toggle-expandable-row {\n transform: rotate(180deg);\n }\n }\n\n :host([bordered]:not([bordered='false'])) tbody & {\n border-width: var-list(--tct-data-table-row-border-width, --tct-table-row-border-width, unquote('0 0 1px 0'));\n border-style: var-list(--tct-data-table-row-border-style, --tct-table-row-border-style, solid);\n border-color: var-list(--tct-data-table-row-border-color, --tct-table-row-border-color, --t-gray-9, #999999);\n }\n\n &.loading-row {\n background: var-list(\n --tct-data-table-loading-row-background,\n --tct-table-loading-row-background,\n --t-base,\n #ffffff\n );\n td {\n text-align: center;\n }\n\n q2-loading {\n font-size: 4em;\n }\n }\n\n &.empty-state {\n background: var-list(--tct-data-table-loading-row-background, --t-base, #ffffff);\n td {\n text-align: center;\n }\n .empty-state-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: var(--app-scale-10x, 50px);\n padding-bottom: var(--app-scale-10x, 50px);\n gap: var(--app-scale-4x, 20px);\n --tct-icon-size: var(--app-scale-6x, 30px);\n }\n }\n\n &.expandable-row {\n background: var-list(\n --tct-data-table-expanded-row-background,\n --tct-table-expanded-row-background,\n --t-gray-14,\n #f2f2f2\n );\n }\n}\n\ntd {\n &.clamped {\n div {\n text-overflow: ellipsis;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: var(--comp-line-clamp-count, 1);\n -webkit-box-orient: vertical;\n }\n }\n\n &.expandable-row-control-column {\n --tct-btn-icon-hover-bg: transparent;\n padding: var-list(\n --tct-data-table-expandable-row-control-column-padding,\n --tct-table-expandable-row-control-column-padding,\n unquote('0 5px')\n );\n text-align: center;\n }\n\n &.dropdown-column {\n padding: var-list(\n --tct-data-table-dropdown-column-padding,\n --tct-table-dropdown-column-padding,\n unquote('0 5px')\n );\n text-align: center;\n }\n\n &.click-column:not(.sr) {\n padding: var-list(\n --tct-data-table-clickable-column-padding,\n --tct-table-clickable-column-padding,\n unquote('0 5px')\n );\n text-align: center;\n }\n}\n\ncaption {\n padding: var-list(--tct-data-table-caption-padding, --tct-table-caption-padding, --app-scale-2x, 10px);\n font-size: var-list(--tct-data-table-caption-font-size, --tct-table-caption-font-size, inherit);\n font-weight: var-list(--tct-data-table-caption-font-weight, --tct-table-caption-font-weight, 600);\n text-align: var-list(--tct-data-table-caption-text-align, --tct-table-caption-text-align, center);\n color: var-list(--tct-data-table-caption-color, --tct-table-caption-color, inherit);\n}\n\nq2-checkbox {\n padding: 0;\n}\n","import {\n Component,\n State,\n Prop,\n h,\n ComponentInterface,\n Watch,\n Event,\n Element,\n EventEmitter,\n Fragment,\n Listen,\n} from '@stencil/core';\nimport { loc, resizeIframe } from '../../utils';\n\nexport type Q2DataTableCellAlignOptions = 'start' | 'center' | 'end';\n\nexport type Q2DataTableCellType =\n | {\n // defines the type of cell\n type?: 'text' | 'number' | 'icon' | 'boolean' | 'code';\n }\n | {\n // when type='badge'\n type?: 'badge';\n badgeStatus?: HTMLQ2BadgeElement['status'];\n badgeTheme?: HTMLQ2BadgeElement['theme'];\n };\n\nexport type Q2DataTableHeader = {\n title: string;\n align?: Q2DataTableCellAlignOptions;\n // Will be autogenerated from the title if not provided\n // The key is used to grab the data from the row data\n key?: string;\n // Enables sorting for this column when true\n sortable?: boolean;\n width?: string;\n // defines background for the column\n backgroundColor?: string;\n sorted?: 'ASC' | 'DESC';\n ariaLabel?: string;\n lineClamp?: number;\n verticalAlign?: 'top' | 'bottom';\n} & Partial<Q2DataTableCellType>;\n\nexport type Q2DataTableCell = {\n value: string | number | boolean;\n align?: Q2DataTableCellAlignOptions;\n ariaLabel?: string;\n lineClamp?: number;\n verticalAlign?: 'top' | 'bottom';\n} & Q2DataTableCellType;\n\nexport type Q2DataTableBaseRow = {\n id: string | number;\n selected?: boolean;\n expanded?: boolean;\n disabled?: boolean;\n};\n\nexport type Q2DataTableCells = Record<string, string | number | Q2DataTableCell>;\nexport type Q2DataTableSerializedCells = Record<string, Q2DataTableCell>;\n\nexport type Q2DataTableRow = Q2DataTableBaseRow & {\n cells: Q2DataTableCells;\n};\nexport type Q2DataTableSerializedRow = Q2DataTableBaseRow & {\n cells: Q2DataTableSerializedCells;\n};\n\n@Component({ tag: 'q2-data-table', shadow: true, styleUrl: 'q2-data-table.scss' })\nexport class Q2DataTable implements ComponentInterface {\n /** Adds a border between each row for the table. */\n @Prop({ mutable: true, reflect: true }) bordered: boolean;\n\n /** Adds the ability to click a row and have the table emit an event with the selected row's data. */\n @Prop({ mutable: true, reflect: true }) clickable: boolean;\n\n /** Provides a caption for the data table. */\n @Prop({ mutable: true }) caption: string;\n\n /** Determines the amount of padding for each of the cells in the table. */\n @Prop({ mutable: true, reflect: true }) density: 'compact' | 'normal' | 'comfortable';\n\n /** Determines the `q2-icon` that will display when `rows` has no value. */\n @Prop({ reflect: true }) emptyIcon: string = 'inbox';\n\n /** Determines the message that will display when `rows` has no value.\n * @localizable\n */\n @Prop({ reflect: true }) emptyMessage: string = 'tecton.element.dataTable.emptyMessage';\n\n /**\n * Defines the headers of the table.\n *\n * @snippet\n * element.headers = [\n * {\n * title: 'Day of the Week',\n * key: 'day',\n * },\n * {\n * title: 'Sales',\n * key: 'sales',\n * align: 'end',\n * }\n * ]\n *\n */\n @Prop({ mutable: true }) headers: Q2DataTableHeader[];\n\n /** Hides the caption from view, but still makes it available to screen readers for accessibility purposes. */\n @Prop({ mutable: true, reflect: true }) hideCaption: boolean;\n\n /**\n * Visually hides the `Select` button that displays when `clickable=true`. It will still be discoverable by assistive technologies.\n *\n * @info\n * Use of this property requires `clickable` to be set to `true`.\n */\n @Prop({ mutable: true }) hideClickable: boolean;\n\n /** Displays a loading state on the table to indicate background activity. */\n @Prop({ mutable: true, reflect: true }) loading: boolean;\n\n /**\n * Defines the rows of the table.\n *\n * @snippet\n * element.rows = [\n * {\n * id: 1,\n * cells: {\n * day: 'Monday',\n * sales: 93\n * }\n * },\n * {\n * id: 2,\n * cells: {\n * day: 'Tuesday',\n * sales: 127\n * }\n * },\n * {\n * id: 3,\n * cells: {\n * day: 'Wednesday',\n * sales: 121\n * }\n * ]\n */\n @Prop({ mutable: true }) rows: Q2DataTableRow[];\n\n /** Adds a checkbox to each row of the table making it selectable. */\n @Prop({ mutable: true, reflect: true }) selectable: boolean;\n\n /**\n * Determines if the selectable checkboxes allow for multi-select or not. If set to \"single\", once a row is selected, all other rows will be disabled.\n * See the documentation on the `select` event for how to handle selections.\n *\n * @warning\n * Use of this property requires `selectable` to be set to `true`.\n */\n @Prop({ mutable: true }) selectMode: 'multiple' | 'single' = 'multiple';\n\n /** Adds a shadow to the table */\n @Prop({ mutable: true, reflect: true }) shadowed: boolean;\n\n @Element() hostElement: HTMLElement;\n\n @State() serializedHeaders: Q2DataTableHeader[] = [];\n @State() serializedRows: Q2DataTableSerializedRow[] = [];\n @State() hasExpandableRows: boolean = false;\n @State() hasDropdowns: boolean = false;\n @State() allRowsSelected: boolean = false;\n @State() someRowsSelected: boolean = false;\n @State() hasRowData: boolean = false;\n @State() checkSlotCount: number = 0;\n\n /**\n * Emitted when a row is selected.\n *\n * Requires the `selectable` prop to be set to `true`.\n *\n * Call `event.preventDefault()` to prevent the default selection behavior.\n */\n @Event() select: EventEmitter<{\n row: Q2DataTableSerializedRow;\n rows: Q2DataTableSerializedRow[];\n allSelected: boolean;\n }>;\n\n /**\n * Emitted when a row is clicked.\n *\n * Requires the `clickable` prop to be set to `true`.\n *\n * Call `event.preventDefault()` to prevent the default click behavior.\n */\n @Event() click: EventEmitter<{ row: Q2DataTableSerializedRow }>;\n\n /**\n * Emitted when an expandable row is toggled.\n *\n * Requires content in the `row-{id}-expandable-content` slot.\n *\n * Call `event.preventDefault()` to prevent the default toggling behavior.\n */\n @Event() toggle: EventEmitter<{ row: Q2DataTableSerializedRow }>;\n\n /**\n * Emitted when a column is sorted.\n *\n * Requires the `sortable` prop to be set to `true` on the column.\n *\n * Call `event.preventDefault()` to prevent the default sorting behavior.\n */\n @Event() sort: EventEmitter<{ header: Q2DataTableHeader; direction: 'ASC' | 'DESC' }>;\n\n /**\n * Emitted when the select-all checkbox is toggled.\n *\n * Requires the `selectable` prop to be set to `true` and the `selectMode` prop to be set to `multiple`.\n *\n * Call `event.preventDefault()` to prevent the default behavior.\n */\n @Event() selectAllRows: EventEmitter<{ checked: boolean }>;\n\n mutationObserver: MutationObserver;\n resizeObserver: ResizeObserver;\n\n /// LifeCycle Hooks ///\n componentWillLoad() {\n this.headersHandler(this.headers);\n this.rowsHandler(this.rows);\n }\n\n componentDidLoad(): void {\n if (typeof MutationObserver !== 'undefined') {\n const observer = new MutationObserver(() => this.checkSlots());\n observer.observe(this.hostElement, { childList: true, subtree: true, attributes: true });\n this.mutationObserver = observer;\n }\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => resizeIframe());\n this.resizeObserver.observe(this.hostElement);\n }\n }\n\n disconnectedCallback() {\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n /// Getters ///\n get selectedRows() {\n return this.serializedRows.filter(({ selected }) => selected);\n }\n\n get selectedRow() {\n return this.selectedRows.find(({ selected }) => !!selected);\n }\n\n get numberOfColumns() {\n return (\n (this.serializedHeaders?.length ?? 0) +\n (this.selectable ? 1 : 0) +\n (this.clickable ? 1 : 0) +\n (this.hasExpandableRows ? 1 : 0) +\n (this.hasDropdowns ? 1 : 0)\n );\n }\n\n get mappedHeaders() {\n return this.serializedHeaders.reduce<Record<string, Q2DataTableHeader>>((accum, header) => {\n accum[header.key] = header;\n return accum;\n }, {});\n }\n\n /// Helpers ///\n sortRows(rows: Q2DataTableSerializedRow[], header: Q2DataTableHeader) {\n const { key, sorted } = header;\n const direction = sorted || 'ASC';\n\n const sortedRows = [...rows].sort((a, b) => {\n const aValue = a.cells[key].value;\n const bValue = b.cells[key].value;\n\n if (aValue < bValue) return direction === 'ASC' ? -1 : 1;\n if (aValue > bValue) return direction === 'ASC' ? 1 : -1;\n return 0;\n });\n\n return sortedRows;\n }\n\n checkSlots = () => {\n this.hasExpandableRows = !!(this.hostElement?.querySelector(`[slot$=\"-expandable-content\"]`) ?? false);\n this.hasDropdowns = !!(this.hostElement?.querySelector(`[slot$=\"-dropdown\"]`) ?? false);\n\n // The booleans above may not change, even if the slot has content\n // So we increment this property to force a re-render and ensure proper rendering\n this.checkSlotCount += 1;\n };\n\n /// Watchers ///\n @Watch('headers')\n headersHandler(headers: Q2DataTableHeader[] = []) {\n this.serializedHeaders = headers.map<Q2DataTableHeader>(header => {\n const { title } = header;\n let { key } = header;\n\n // If no key is provided, generate one from the title\n if (!key) key = title.toLowerCase().replace(/\\s/g, '-');\n\n return {\n key,\n ...header,\n };\n });\n }\n\n @Watch('rows')\n rowsHandler(rows: Q2DataTableRow[] = []) {\n const { serializedHeaders, mappedHeaders } = this;\n const defaultRow = {\n id: null,\n cells: {},\n selected: false,\n expanded: false,\n disabled: false,\n };\n\n // tracks if the select-all checkbox should be visually updated as the `rows` are built\n let isAllSelected = true;\n let isIndeterminate = false;\n\n const serializedRows = rows.map(({ id, cells, selected, expanded, disabled }) => {\n const serializedCells = Object.entries(cells).reduce<Q2DataTableSerializedCells>(\n (accum, [cellKey, cellData]) => {\n const header = mappedHeaders[cellKey] || ({} as Q2DataTableHeader);\n const { align, type = 'text', lineClamp, verticalAlign } = header;\n\n const isBadge = 'type' in header && header.type === 'badge';\n const defaultCell: Q2DataTableCell = {\n value: '',\n ariaLabel: undefined,\n type,\n align,\n lineClamp,\n verticalAlign,\n badgeStatus: isBadge ? header.badgeStatus : undefined,\n badgeTheme: isBadge ? header.badgeTheme : undefined,\n };\n\n const result: Q2DataTableCell =\n typeof cellData === 'object'\n ? { ...defaultCell, ...cellData }\n : { ...defaultCell, value: cellData };\n\n accum[cellKey] = result;\n return accum;\n },\n {}\n );\n\n if (isAllSelected && !selected) isAllSelected = false;\n if (!isAllSelected && selected) isIndeterminate = true;\n return {\n ...defaultRow,\n id,\n selected: !!selected,\n expanded: !!expanded,\n disabled: !!disabled,\n cells: serializedCells,\n };\n });\n\n const sortedHeader = serializedHeaders.find(({ sorted }) => sorted);\n\n this.hasRowData = !!rows.length;\n this.allRowsSelected = this.hasRowData && isAllSelected;\n this.someRowsSelected = this.hasRowData && isIndeterminate;\n\n this.serializedRows = !!sortedHeader ? this.sortRows(serializedRows, sortedHeader) : serializedRows;\n this.checkSlots();\n }\n\n @Watch('selectable')\n selectableHandler() {\n if (this.selectable === false) {\n this.selectAllRows.emit({ checked: false });\n }\n }\n\n /// Listeners ///\n @Listen('click')\n onClickListener(event: MouseEvent) {\n if (event instanceof PointerEvent) event.stopImmediatePropagation();\n }\n\n @Listen('selectAllRows')\n onSelectAllRows(event: CustomEvent<{ checked: boolean }>) {\n event.stopPropagation();\n const { checked } = event.detail;\n const selectedRows = checked\n ? this.serializedRows.map(row => {\n if (row.disabled) {\n return row;\n } else {\n return {\n ...row,\n selected: checked,\n };\n }\n })\n : [];\n const selectEvent = this.select.emit({ row: undefined, rows: selectedRows, allSelected: checked });\n if (selectEvent.defaultPrevented) return;\n\n this.serializedRows = this.serializedRows.map(row => {\n if (row.disabled) return row;\n row.selected = checked;\n return row;\n });\n this.allRowsSelected = checked;\n this.someRowsSelected = false;\n }\n\n /// Event Handlers ///\n onSort = (header: Q2DataTableHeader) => {\n const direction = header.sorted === 'ASC' ? 'DESC' : 'ASC';\n const sortKey = header.key;\n const sortEvent = this.sort.emit({ header, direction });\n if (sortEvent.defaultPrevented) return;\n\n this.serializedHeaders = this.serializedHeaders.map<Q2DataTableHeader>(serializedHeader => {\n const sorted = sortKey === serializedHeader.key ? direction : undefined;\n return { ...serializedHeader, sorted };\n });\n this.serializedRows = this.sortRows(this.serializedRows, { ...header, sorted: direction });\n };\n\n onSelectRow = (event: CustomEvent<{ checked: boolean }>, row: Q2DataTableSerializedRow) => {\n event.stopPropagation();\n const { selectMode, serializedRows, selectedRows: currentlySelectedRows } = this;\n const { checked } = event.detail;\n\n const selectedRow = { ...row, selected: checked };\n let selectedRows;\n if (selectMode === 'single') {\n selectedRows = checked ? [selectedRow] : [];\n } else {\n selectedRows = checked\n ? [...currentlySelectedRows, selectedRow]\n : currentlySelectedRows.filter(row => row.id !== selectedRow.id);\n }\n\n const allRowsSelected = selectedRows.length === serializedRows.length;\n const isIndeterminate = !allRowsSelected && selectedRows.length > 0;\n const selectEvent = this.select.emit({ row: selectedRow, rows: selectedRows, allSelected: allRowsSelected });\n if (selectEvent.defaultPrevented) return;\n\n this.serializedRows = this.serializedRows.map(row => (row.id === selectedRow.id ? selectedRow : row));\n this.allRowsSelected = allRowsSelected;\n this.someRowsSelected = isIndeterminate;\n };\n\n onClickTableRow = (event: MouseEvent, row: Q2DataTableSerializedRow) => {\n if (this.clickable) {\n this.onClickRow(event, row);\n } else if (this.hasExpandableRows) {\n this.onToggleRow(event, row);\n }\n };\n\n onClickRow = (event: MouseEvent, row: Q2DataTableSerializedRow) => {\n event.stopPropagation();\n this.click.emit({ row });\n };\n\n onToggleRow = (event: MouseEvent, row: Q2DataTableSerializedRow) => {\n event.stopPropagation();\n const selectedRow = { ...row, expanded: !row.expanded };\n const toggleEvent = this.toggle.emit({ row: selectedRow });\n if (toggleEvent.defaultPrevented) return;\n\n this.serializedRows = this.serializedRows.map(row => {\n if (row.id === selectedRow.id) return selectedRow;\n else return { ...row };\n });\n };\n\n onControlContainerClick = (event: MouseEvent) => {\n event.stopPropagation();\n };\n\n /// DOM ///\n\n render() {\n const { caption } = this;\n return (\n <div class=\"container\">\n <table>\n {caption && <caption class={this.hideCaption ? 'sr' : undefined}>{caption}</caption>}\n {this.renderTableColGroup()}\n {this.renderTableHeader()}\n {this.renderEmptyState()}\n {this.renderTableRows()}\n </table>\n </div>\n );\n }\n\n renderTableColGroup() {\n const { serializedHeaders: headers, selectable, clickable, hasExpandableRows, hasDropdowns } = this;\n\n if (!headers.length) return null;\n\n return (\n <colgroup>\n {selectable && <col class=\"select-column\" />}\n {headers.map(({ width, backgroundColor }) => (\n <col style={{ width, backgroundColor }} />\n ))}\n {clickable && <col class=\"click-column\" />}\n {hasExpandableRows && <col class=\"expandable-row-control-column\" />}\n {hasDropdowns && <col class=\"dropdown-column\" />}\n </colgroup>\n );\n }\n\n renderTableHeader() {\n const {\n serializedHeaders: headers,\n selectable,\n clickable,\n hideClickable,\n selectMode,\n hasExpandableRows,\n hasDropdowns,\n allRowsSelected,\n someRowsSelected,\n hasRowData,\n loading,\n } = this;\n\n if (!headers.length) return null;\n\n return (\n <thead>\n <tr>\n {selectable && (\n <th>\n {selectMode === 'multiple' && (\n <q2-checkbox\n label={loc('tecton.element.dataTable.selectAllRows')}\n hide-label\n onChange={() => this.selectAllRows.emit({ checked: !allRowsSelected })}\n checked={hasRowData && allRowsSelected && !someRowsSelected}\n indeterminate={hasRowData && someRowsSelected && !allRowsSelected}\n disabled={loading || !hasRowData}\n test-id=\"select-all-rows-control\"\n ></q2-checkbox>\n )}\n </th>\n )}\n {headers.map(header => {\n const { align, sorted, verticalAlign } = header;\n const headerClasses = [];\n if (align) headerClasses.push(`align-${align}`);\n if (verticalAlign) headerClasses.push(`vertical-align-${verticalAlign}`);\n if (!!sorted) headerClasses.push('sorted');\n return (\n <th\n class={headerClasses.join(' ')}\n id={`header-${header.key}`}\n >\n {header.sortable ? (\n <q2-btn\n onClick={() => this.onSort(header)}\n test-id=\"sort-control\"\n disabled={this.loading}\n >\n <div\n class=\"header-content\"\n aria-label={header.ariaLabel || undefined}\n >\n {header.title}\n\n {!!sorted ? (\n <q2-icon\n class={`sorted-indicator direction-${sorted}`}\n type=\"arrow-down\"\n label={\n sorted === 'ASC'\n ? loc('tecton.element.dataTable.sortedAscending')\n : loc('tecton.element.dataTable.sortedDescending')\n }\n test-id=\"sorted-indicator\"\n ></q2-icon>\n ) : (\n <q2-icon\n class={`sorted-indicator`}\n type=\"sort\"\n label={loc('tecton.element.dataTable.clickToSort')}\n test-id=\"sorted-indicator\"\n ></q2-icon>\n )}\n </div>\n </q2-btn>\n ) : (\n <div\n class=\"header-content\"\n aria-label={header.ariaLabel || undefined}\n >\n {header.title}\n </div>\n )}\n </th>\n );\n })}\n {clickable && (\n <th\n id=\"click\"\n class={hideClickable ? 'sr' : undefined}\n >\n <span class=\"sr\">{loc('tecton.element.dataTable.clickRow')}</span>\n </th>\n )}\n {hasExpandableRows && (\n <th id=\"toggle\">\n <span class=\"sr\">{loc('tecton.element.dataTable.toggleRow')}</span>\n </th>\n )}\n {hasDropdowns && (\n <th>\n <span class=\"sr\">{loc('tecton.element.dataTable.dropdown')}</span>\n </th>\n )}\n </tr>\n </thead>\n );\n }\n\n renderEmptyState() {\n const { hasRowData, numberOfColumns, emptyIcon, emptyMessage, loading } = this;\n if (hasRowData || loading) return null;\n\n return (\n <slot name=\"empty-table\">\n <tbody>\n <tr class=\"empty-state\">\n <td colSpan={numberOfColumns}>\n <div class=\"empty-state-content\">\n <q2-icon type={emptyIcon}></q2-icon>\n <p>{loc(emptyMessage)}</p>\n </div>\n </td>\n </tr>\n </tbody>\n </slot>\n );\n }\n\n renderTableRows() {\n const {\n serializedHeaders: headers,\n serializedRows: rows,\n selectable,\n clickable,\n hideClickable,\n selectMode,\n hasExpandableRows,\n hasDropdowns,\n numberOfColumns,\n loading,\n } = this;\n\n if (loading) {\n return (\n <tbody>\n <tr class=\"loading-row\">\n <td colSpan={numberOfColumns}>\n <q2-loading inline></q2-loading>\n </td>\n </tr>\n </tbody>\n );\n }\n\n let isSelectDisabled = false;\n let selectedRow;\n if (selectMode === 'single') {\n selectedRow = this.selectedRow;\n isSelectDisabled = !!selectedRow;\n }\n const clickableClasses = [];\n if (clickable) clickableClasses.push('click-column');\n if (hideClickable) clickableClasses.push('sr');\n const clickableClassString = clickableClasses.join(' ');\n\n return (\n <tbody>\n {rows.map(row => {\n const cellSlotPrefix = `row-${row.id}-cell`;\n const expandableRowName = `row-${row.id}-expandable-content`;\n const dropdownCellName = `row-${row.id}-dropdown`;\n const rowHasExpandableSlot =\n hasExpandableRows && !!this.hostElement.querySelector(`[slot=\"${expandableRowName}\"]`);\n const rowHasDropdownSlot =\n hasDropdowns && !!this.hostElement.querySelector(`[slot=\"${dropdownCellName}\"]`);\n const rowClasses = [];\n if (rowHasExpandableSlot) rowClasses.push('expandable');\n if (clickable) rowClasses.push('clickable');\n if (row.expanded) rowClasses.push('expanded');\n if (row.selected) rowClasses.push('selected');\n const rowIsClickable = clickable || rowHasExpandableSlot;\n\n return (\n <Fragment>\n <tr\n id={`row-${row.id}`}\n class={rowClasses.join(' ')}\n onClick={rowIsClickable && (e => this.onClickTableRow(e, row))}\n tabIndex={rowIsClickable ? -1 : undefined}\n >\n {selectable && (\n <td\n class=\"select-column\"\n onClick={this.onControlContainerClick}\n >\n <q2-checkbox\n label={loc('tecton.element.dataTable.selectRow')}\n hide-label\n checked={row.selected}\n disabled={(isSelectDisabled && row !== selectedRow) || row.disabled}\n onChange={e => this.onSelectRow(e, row)}\n test-id=\"select-row-control\"\n ></q2-checkbox>\n </td>\n )}\n {headers.map(({ key }) => {\n const cell = row.cells[key];\n const lineClamp = cell?.lineClamp;\n const cellAlign = cell?.align;\n const cellVerticalAlign = cell?.verticalAlign;\n const cellClasses = [];\n if (cellAlign) cellClasses.push(`align-${cellAlign}`);\n if (cellVerticalAlign) cellClasses.push(`vertical-align-${cellVerticalAlign}`);\n if (lineClamp) cellClasses.push('clamped');\n const cellStyles = lineClamp\n ? { '--comp-line-clamp-count': `${lineClamp}` }\n : undefined;\n\n return (\n <td\n class={cellClasses.join(' ')}\n style={cellStyles}\n >\n <slot name={`${cellSlotPrefix}-${key}`}>\n {this.renderCellContent(cell)}\n </slot>\n </td>\n );\n })}\n {clickable && (\n <td class={clickableClassString}>\n <q2-btn\n intent=\"neutral\"\n size=\"small\"\n onClick={e => this.onClickRow(e, row)}\n test-id=\"clickable-row-control\"\n >\n {loc('tecton.element.dataTable.clickRow')}\n </q2-btn>\n </td>\n )}\n {hasExpandableRows && (\n <td\n class=\"expandable-row-control-column\"\n onClick={this.onControlContainerClick}\n >\n {rowHasExpandableSlot && (\n <q2-btn\n onClick={e => this.onToggleRow(e, row)}\n ariaExpanded={`${row.expanded}`}\n ariaControls={expandableRowName}\n ariaLabel={loc('tecton.element.dataTable.toggleRow')}\n test-id=\"expandable-row-control\"\n >\n <q2-icon\n type=\"chevron-down\"\n class=\"toggle-expandable-row\"\n ></q2-icon>\n </q2-btn>\n )}\n </td>\n )}\n {hasDropdowns && (\n <td\n class=\"dropdown-column\"\n onClick={this.onControlContainerClick}\n >\n {rowHasDropdownSlot && <slot name={dropdownCellName}></slot>}\n </td>\n )}\n </tr>\n {rowHasExpandableSlot && (\n <tr\n id={expandableRowName}\n class=\"expandable-row\"\n hidden={!row.expanded}\n aria-hidden={!row.expanded}\n >\n <td\n colSpan={numberOfColumns}\n headers=\"toggle\"\n >\n <div class=\"expandable-content\">\n <slot name={expandableRowName}></slot>\n </div>\n </td>\n </tr>\n )}\n </Fragment>\n );\n })}\n </tbody>\n );\n }\n\n renderCellContent(cell: Q2DataTableCell) {\n if (!cell) return;\n\n const { type, ariaLabel, value } = cell;\n\n if ([undefined, null].includes(value)) return;\n\n switch (type) {\n case 'badge':\n let valueAsInt;\n switch (typeof value) {\n case 'string':\n valueAsInt = parseFloat(value);\n break;\n\n case 'boolean':\n valueAsInt = value ? 1 : 0;\n break;\n\n default:\n valueAsInt = value;\n break;\n }\n\n return (\n <q2-badge\n aria-label={ariaLabel}\n value={valueAsInt}\n theme={cell.badgeTheme}\n status={cell.badgeStatus}\n size=\"large\"\n ></q2-badge>\n );\n\n case 'icon':\n const valueAsString = typeof value === 'string' ? value : `${value}`;\n return (\n <q2-icon\n label={ariaLabel}\n type={valueAsString}\n ></q2-icon>\n );\n\n case 'boolean':\n return !!value ? (\n <q2-icon\n label={loc('tecton.element.dataTable.booleanTrue')}\n type=\"checkmark\"\n ></q2-icon>\n ) : (\n <div aria-label={loc('tecton.element.dataTable.booleanFalse')}></div>\n );\n\n case 'code':\n return <code aria-label={ariaLabel}>{value}</code>;\n\n default:\n return <div aria-label={ariaLabel}>{value}</div>;\n }\n }\n}\n"],"mappings":"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"}
|