@talxis/base-controls 1.2410.2 → 1.2410.4

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.
Files changed (90) hide show
  1. package/README.md +20 -11
  2. package/dist/components/DatasetControl/DatasetControl.d.ts +3 -0
  3. package/dist/components/DatasetControl/DatasetControl.js +63 -0
  4. package/dist/components/DatasetControl/DatasetControl.js.map +1 -0
  5. package/dist/components/DatasetControl/hooks/useRerender.d.ts +1 -0
  6. package/dist/components/DatasetControl/hooks/useRerender.js +9 -0
  7. package/dist/components/DatasetControl/hooks/useRerender.js.map +1 -0
  8. package/dist/components/DatasetControl/index.d.ts +2 -0
  9. package/dist/components/DatasetControl/index.js +2 -0
  10. package/dist/components/DatasetControl/index.js.map +1 -0
  11. package/dist/components/DatasetControl/interfaces.d.ts +10 -0
  12. package/dist/components/DatasetControl/styles.d.ts +8 -0
  13. package/dist/components/DatasetControl/styles.js +17 -0
  14. package/dist/components/DatasetControl/styles.js.map +1 -0
  15. package/dist/components/DatasetControl/translations.d.ts +10 -0
  16. package/dist/components/DatasetControl/translations.js +7 -0
  17. package/dist/components/DatasetControl/translations.js.map +1 -0
  18. package/dist/components/Decimal/Decimal.js +1 -1
  19. package/dist/components/Decimal/Decimal.js.map +1 -1
  20. package/dist/components/Duration/Duration.js +1 -1
  21. package/dist/components/Duration/Duration.js.map +1 -1
  22. package/dist/components/Grid/Grid.js +9 -2
  23. package/dist/components/Grid/Grid.js.map +1 -1
  24. package/dist/components/Grid/core/components/AgGrid/AgGrid.js +21 -46
  25. package/dist/components/Grid/core/components/AgGrid/AgGrid.js.map +1 -1
  26. package/dist/components/Grid/core/components/AgGrid/controllers/useAgGridController.d.ts +0 -1
  27. package/dist/components/Grid/core/components/AgGrid/controllers/useAgGridController.js +7 -7
  28. package/dist/components/Grid/core/components/AgGrid/controllers/useAgGridController.js.map +1 -1
  29. package/dist/components/Grid/core/components/AgGrid/model/AgGrid.d.ts +0 -2
  30. package/dist/components/Grid/core/components/AgGrid/model/AgGrid.js +0 -7
  31. package/dist/components/Grid/core/components/AgGrid/model/AgGrid.js.map +1 -1
  32. package/dist/components/Grid/core/components/AgGrid/styles.d.ts +1 -4
  33. package/dist/components/Grid/core/components/AgGrid/styles.js +6 -9
  34. package/dist/components/Grid/core/components/AgGrid/styles.js.map +1 -1
  35. package/dist/components/Grid/core/components/Cell/EditableCell/EditableCell.js +0 -2
  36. package/dist/components/Grid/core/components/Cell/EditableCell/EditableCell.js.map +1 -1
  37. package/dist/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyCell.js +16 -4
  38. package/dist/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyCell.js.map +1 -1
  39. package/dist/components/Grid/core/components/Component/model/Component.js +7 -2
  40. package/dist/components/Grid/core/components/Component/model/Component.js.map +1 -1
  41. package/dist/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/RecordGrids.js +3 -0
  42. package/dist/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/RecordGrids.js.map +1 -1
  43. package/dist/components/Grid/core/constants.d.ts +1 -0
  44. package/dist/components/Grid/core/constants.js +4 -0
  45. package/dist/components/Grid/core/constants.js.map +1 -0
  46. package/dist/components/Grid/core/controllers/useGridController.d.ts +0 -2
  47. package/dist/components/Grid/core/controllers/useGridController.js +1 -17
  48. package/dist/components/Grid/core/controllers/useGridController.js.map +1 -1
  49. package/dist/components/Grid/core/model/Grid.d.ts +10 -3
  50. package/dist/components/Grid/core/model/Grid.js +45 -16
  51. package/dist/components/Grid/core/model/Grid.js.map +1 -1
  52. package/dist/components/Grid/core/services/KeyListener.d.ts +8 -0
  53. package/dist/components/Grid/core/services/KeyListener.js +22 -0
  54. package/dist/components/Grid/core/services/KeyListener.js.map +1 -0
  55. package/dist/components/Grid/core/services/RecordUpdateService/model/RecordUpdateService.js +2 -2
  56. package/dist/components/Grid/core/services/RecordUpdateService/model/RecordUpdateService.js.map +1 -1
  57. package/dist/components/Grid/filtering/controller/useColumnFilterConditionController.js.map +1 -1
  58. package/dist/components/Grid/interfaces.d.ts +2 -2
  59. package/dist/components/Grid/paging/components/Paging/Paging.js +7 -1
  60. package/dist/components/Grid/paging/components/Paging/Paging.js.map +1 -1
  61. package/dist/components/Grid/paging/controllers/usePagingController.d.ts +2 -1
  62. package/dist/components/Grid/paging/controllers/usePagingController.js +1 -0
  63. package/dist/components/Grid/paging/controllers/usePagingController.js.map +1 -1
  64. package/dist/components/Grid/paging/model/Paging.d.ts +2 -1
  65. package/dist/components/Grid/paging/model/Paging.js +22 -4
  66. package/dist/components/Grid/paging/model/Paging.js.map +1 -1
  67. package/dist/components/Grid/selection/controllers/useSelectionController.js +7 -3
  68. package/dist/components/Grid/selection/controllers/useSelectionController.js.map +1 -1
  69. package/dist/components/Grid/selection/model/Selection.d.ts +1 -1
  70. package/dist/components/Grid/selection/model/Selection.js +7 -4
  71. package/dist/components/Grid/selection/model/Selection.js.map +1 -1
  72. package/dist/components/Grid/sorting/Sorting.js +2 -3
  73. package/dist/components/Grid/sorting/Sorting.js.map +1 -1
  74. package/dist/components/Grid/translations.d.ts +4 -0
  75. package/dist/components/Grid/translations.js +2 -1
  76. package/dist/components/Grid/translations.js.map +1 -1
  77. package/dist/components/TwoOptions/TwoOptions.js +21 -3
  78. package/dist/components/TwoOptions/TwoOptions.js.map +1 -1
  79. package/dist/components/TwoOptions/interfaces.d.ts +1 -0
  80. package/dist/index.d.ts +25 -7
  81. package/dist/index.js +1 -1
  82. package/dist/utils/index.d.ts +0 -1
  83. package/dist/utils/index.js +0 -1
  84. package/dist/utils/index.js.map +1 -1
  85. package/package.json +3 -3
  86. package/dist/components/Grid/core/hooks/useRerender.js +0 -13
  87. package/dist/components/Grid/core/hooks/useRerender.js.map +0 -1
  88. package/dist/utils/Numeral.d.ts +0 -6
  89. package/dist/utils/Numeral.js +0 -64
  90. package/dist/utils/Numeral.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -279,6 +279,10 @@ declare const gridTranslations: {
279
279
  1029: string;
280
280
  1033: string;
281
281
  };
282
+ "paging-pages-totalcount": {
283
+ 1029: string;
284
+ 1033: string;
285
+ };
282
286
  norecordsfound: {
283
287
  1029: string;
284
288
  1033: string;
@@ -352,9 +356,9 @@ interface IGridParameters extends IParameters$1 {
352
356
  EnableSorting?: Omit<ITwoOptionsProperty, 'attributes'>;
353
357
  EnableNavigation?: Omit<ITwoOptionsProperty, 'attributes'>;
354
358
  EnableOptionSetColors?: Omit<ITwoOptionsProperty, 'attributes'>;
355
- UseContainerAsHeight?: Omit<ITwoOptionsProperty, 'attributes'>;
359
+ Height?: IStringProperty;
356
360
  InlineRibbonButtonIds?: IStringProperty;
357
- SelectableRows?: ComponentFramework.PropertyTypes.EnumProperty<"none" | "single" | "multiple">;
361
+ SelectableRows?: Omit<ComponentFramework.PropertyTypes.EnumProperty<"none" | "single" | "multiple">, 'type'>;
358
362
  Grid: IDatasetProperty;
359
363
  }
360
364
  interface IGridOutputs extends IOutputs$1 {
@@ -848,6 +852,7 @@ interface ITwoOptions extends IControl<ITwoOptionsParameters, ITwoOptionsOutputs
848
852
  }
849
853
  interface ITwoOptionsParameters extends IBaseParameters {
850
854
  value: ITwoOptionsProperty;
855
+ EnableOptionSetColors?: Omit<ITwoOptionsProperty, 'attributes'>;
851
856
  }
852
857
  interface ITwoOptionsOutputs extends IOutputs$1 {
853
858
  value?: boolean;
@@ -855,10 +860,23 @@ interface ITwoOptionsOutputs extends IOutputs$1 {
855
860
 
856
861
  declare const TwoOptions: (props: ITwoOptions) => JSX.Element;
857
862
 
858
- declare class Numeral {
859
- static decimal(formatting: ComponentFramework.UserSettingApi.NumberFormattingInfo): void;
860
- static currency(formatting: ComponentFramework.UserSettingApi.NumberFormattingInfo): void;
861
- private static get _locales();
863
+ declare const datasetControlTranslations: {
864
+ search: {
865
+ 1029: string;
866
+ 1033: string;
867
+ };
868
+ records: {
869
+ 1029: string;
870
+ 1033: string;
871
+ };
872
+ };
873
+
874
+ interface IDatasetControl extends IControl<IGridParameters, IGridOutputs, Partial<ITranslation<typeof datasetControlTranslations & typeof gridTranslations>>, any & {
875
+ onDatasetInit: () => void;
876
+ }> {
877
+ EnableQuickFind?: Omit<ITwoOptionsProperty, 'attributes'>;
862
878
  }
863
879
 
864
- export { DateTime, Decimal, Duration, Grid, IControl, IControlController, IDatasetProperty, IDateTime, IDateTimeOutputs, IDateTimeParameters, IDateTimeProperty, IDecimal, IDecimalNumberProperty, IDecimalOutputs, IDecimalParameters, IDefaultTranslations, IDuration, IDurationOutputs, IDurationParameters, IEntity, IEntityColumn, IEntityRecord, IGrid, IGridOutputs, IGridParameters, ILayout, ILookup, ILookupOutputs, ILookupParameters, ILookupProperty, IMetadata, IMultiSelectOptionSet, IMultiSelectOptionSetOutputs, IMultiSelectOptionSetParameters, IMultiSelectOptionSetProperty, IOptionSet, IOptionSetOutputs, IOptionSetParameters, IOptionSetProperty, IOutputs, IParameters$1 as IParameters, IProperty, IStringProperty, ITextField, ITextFieldOutputs, ITextFieldParameters, ITranslation, ITranslations, ITwoOptions, ITwoOptionsOutputs, ITwoOptionsParameters, ITwoOptionsProperty, IWholeNumberProperty, Lookup, MultiSelectOptionSet, Numeral, OptionSet, TextField, TwoOptions, useControl, useControlSizing, useControlTheme, useDateTime, useFocusIn, useInputBasedControl, useLookup, useMouseOver };
880
+ declare const DatasetControl: (props: IDatasetControl) => JSX.Element;
881
+
882
+ export { DatasetControl, DateTime, Decimal, Duration, Grid, IControl, IControlController, IDatasetControl, IDatasetProperty, IDateTime, IDateTimeOutputs, IDateTimeParameters, IDateTimeProperty, IDecimal, IDecimalNumberProperty, IDecimalOutputs, IDecimalParameters, IDefaultTranslations, IDuration, IDurationOutputs, IDurationParameters, IEntity, IEntityColumn, IEntityRecord, IGrid, IGridOutputs, IGridParameters, ILayout, ILookup, ILookupOutputs, ILookupParameters, ILookupProperty, IMetadata, IMultiSelectOptionSet, IMultiSelectOptionSetOutputs, IMultiSelectOptionSetParameters, IMultiSelectOptionSetProperty, IOptionSet, IOptionSetOutputs, IOptionSetParameters, IOptionSetProperty, IOutputs, IParameters$1 as IParameters, IProperty, IStringProperty, ITextField, ITextFieldOutputs, ITextFieldParameters, ITranslation, ITranslations, ITwoOptions, ITwoOptionsOutputs, ITwoOptionsParameters, ITwoOptionsProperty, IWholeNumberProperty, Lookup, MultiSelectOptionSet, OptionSet, TextField, TwoOptions, useControl, useControlSizing, useControlTheme, useDateTime, useFocusIn, useInputBasedControl, useLookup, useMouseOver };
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- export { Numeral } from './utils/Numeral.js';
2
1
  export { useControl } from './hooks/useControl.js';
3
2
  export { useControlSizing } from './hooks/useControlSizing.js';
4
3
  export { useFocusIn } from './hooks/useFocusIn.js';
@@ -16,4 +15,5 @@ export { MultiSelectOptionSet } from './components/MultiSelectOptionSet/MultiSel
16
15
  export { OptionSet } from './components/OptionSet/OptionSet.js';
17
16
  export { TextField } from './components/TextField/TextField.js';
18
17
  export { TwoOptions } from './components/TwoOptions/TwoOptions.js';
18
+ export { DatasetControl } from './components/DatasetControl/DatasetControl.js';
19
19
  //# sourceMappingURL=index.js.map
@@ -1,2 +1 @@
1
- export * from './Numeral';
2
1
  export * from './Theme';
@@ -1,3 +1,2 @@
1
- export { Numeral } from './Numeral.js';
2
1
  export { getControlTheme, normalizeComponentStyling } from './Theme.js';
3
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talxis/base-controls",
3
- "version": "1.2410.2",
3
+ "version": "1.2410.4",
4
4
  "description": "Set of React components that natively work with Power Apps Component Framework API's",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -71,8 +71,8 @@
71
71
  "@ag-grid-community/styles": "^31.3.2",
72
72
  "@fluentui/react": "^8.119.1",
73
73
  "@fluentui/react-migration-v8-v9": "^9.6.20",
74
- "@talxis/client-libraries": "1.2407.2",
75
- "@talxis/react-components": "^1.2409.8",
74
+ "@talxis/client-libraries": "1.2410.6",
75
+ "@talxis/react-components": "^1.2409.9",
76
76
  "color": "^4.2.3",
77
77
  "dayjs": "^1.11.10",
78
78
  "external-svg-loader": "^1.7.1",
@@ -1,13 +0,0 @@
1
- import { useState } from 'react';
2
-
3
- const useRerender = () => {
4
- const [rerender, setRerender] = useState(0);
5
- const renderDecorator = async (fn) => {
6
- await fn?.();
7
- setRerender(c => c + 1);
8
- };
9
- return [rerender, renderDecorator];
10
- };
11
-
12
- export { useRerender };
13
- //# sourceMappingURL=useRerender.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useRerender.js","sources":["../../../../../src/components/Grid/core/hooks/useRerender.ts"],"sourcesContent":["import { useEffect, useState } from \"react\"\n\nexport const useRerender = (): [\n number,\n (fn?: () => any | Promise<any>) => void\n] => {\n const [rerender, setRerender] = useState<number>(0);\n\n const renderDecorator = async (fn?: () => any | Promise<any>) => {\n await fn?.();\n setRerender(c => c + 1);\n }\n\n return [rerender, renderDecorator];\n}"],"names":[],"mappings":";;AAEO,MAAM,WAAW,GAAG,MAGvB;IACA,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAC;AAEpD,IAAA,MAAM,eAAe,GAAG,OAAO,EAA6B,KAAI;QAC5D,MAAM,EAAE,IAAI,CAAC;QACb,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,KAAC,CAAA;AAED,IAAA,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AACvC;;;;"}
@@ -1,6 +0,0 @@
1
- /// <reference types="powerapps-component-framework" />
2
- export declare class Numeral {
3
- static decimal(formatting: ComponentFramework.UserSettingApi.NumberFormattingInfo): void;
4
- static currency(formatting: ComponentFramework.UserSettingApi.NumberFormattingInfo): void;
5
- private static get _locales();
6
- }
@@ -1,64 +0,0 @@
1
- import numeral from 'numeral';
2
-
3
- class Numeral {
4
- static decimal(formatting) {
5
- const locale = {
6
- ordinal: (num) => {
7
- return '.';
8
- },
9
- currency: {
10
- symbol: formatting.currencySymbol
11
- },
12
- abbreviations: {
13
- thousand: 'k',
14
- million: 'm',
15
- billion: 'b',
16
- trillion: 't'
17
- },
18
- delimiters: {
19
- decimal: formatting.numberDecimalSeparator,
20
- thousands: formatting.numberGroupSeparator,
21
- }
22
- };
23
- if (!this._locales.includes('__pcfcustomdecimal')) {
24
- numeral.register('locale', '__pcfcustomdecimal', locale);
25
- }
26
- else {
27
- numeral.locales['__pcfcustomdecimal'] = locale;
28
- }
29
- numeral.locale('__pcfcustomdecimal');
30
- }
31
- static currency(formatting) {
32
- const locale = {
33
- ordinal: (num) => {
34
- return '.';
35
- },
36
- currency: {
37
- symbol: formatting.currencySymbol
38
- },
39
- abbreviations: {
40
- thousand: 'k',
41
- million: 'm',
42
- billion: 'b',
43
- trillion: 't'
44
- },
45
- delimiters: {
46
- decimal: formatting.currencyDecimalSeparator,
47
- thousands: formatting.currencyGroupSeparator,
48
- }
49
- };
50
- if (!this._locales.includes('__pcfcustomcurrency')) {
51
- numeral.register('locale', '__pcfcustomcurrency', locale);
52
- }
53
- else {
54
- numeral.locales['__pcfcustomcurrency'] = locale;
55
- }
56
- numeral.locale('__pcfcustomcurrency');
57
- }
58
- static get _locales() {
59
- return Object.keys(numeral.locales);
60
- }
61
- }
62
-
63
- export { Numeral };
64
- //# sourceMappingURL=Numeral.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Numeral.js","sources":["../../src/utils/Numeral.ts"],"sourcesContent":["import numeral from \"numeral\";\n\nexport class Numeral {\n public static decimal(formatting: ComponentFramework.UserSettingApi.NumberFormattingInfo) {\n const locale = {\n ordinal: (num: number) => {\n return '.';\n },\n currency: {\n symbol: formatting.currencySymbol\n },\n abbreviations: {\n thousand: 'k',\n million: 'm',\n billion: 'b',\n trillion: 't'\n },\n delimiters: {\n decimal: formatting.numberDecimalSeparator,\n thousands: formatting.numberGroupSeparator,\n }\n };\n if (!this._locales.includes('__pcfcustomdecimal')) {\n numeral.register('locale', '__pcfcustomdecimal', locale);\n }\n else {\n numeral.locales['__pcfcustomdecimal'] = locale;\n }\n numeral.locale('__pcfcustomdecimal');\n }\n\n public static currency(formatting: ComponentFramework.UserSettingApi.NumberFormattingInfo) {\n const locale = {\n ordinal: (num: number) => {\n return '.';\n },\n currency: {\n symbol: formatting.currencySymbol\n },\n abbreviations: {\n thousand: 'k',\n million: 'm',\n billion: 'b',\n trillion: 't'\n },\n delimiters: {\n decimal: formatting.currencyDecimalSeparator,\n thousands: formatting.currencyGroupSeparator,\n }\n };\n if (!this._locales.includes('__pcfcustomcurrency')) {\n numeral.register('locale', '__pcfcustomcurrency', locale);\n }\n else {\n numeral.locales['__pcfcustomcurrency'] = locale;\n }\n numeral.locale('__pcfcustomcurrency');\n }\n private static get _locales() {\n return Object.keys(numeral.locales);\n }\n}"],"names":[],"mappings":";;MAEa,OAAO,CAAA;IACT,OAAO,OAAO,CAAC,UAAkE,EAAA;AACpF,QAAA,MAAM,MAAM,GAAG;AACX,YAAA,OAAO,EAAE,CAAC,GAAW,KAAI;AACrB,gBAAA,OAAO,GAAG,CAAC;aACd;AACD,YAAA,QAAQ,EAAE;gBACN,MAAM,EAAE,UAAU,CAAC,cAAc;AACpC,aAAA;AACD,YAAA,aAAa,EAAE;AACX,gBAAA,QAAQ,EAAE,GAAG;AACb,gBAAA,OAAO,EAAE,GAAG;AACZ,gBAAA,OAAO,EAAE,GAAG;AACZ,gBAAA,QAAQ,EAAE,GAAG;AAChB,aAAA;AACD,YAAA,UAAU,EAAE;gBACR,OAAO,EAAE,UAAU,CAAC,sBAAsB;gBAC1C,SAAS,EAAE,UAAU,CAAC,oBAAoB;AAC7C,aAAA;SACJ,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;YAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAC5D,SAAA;AACI,aAAA;AACD,YAAA,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC;AAClD,SAAA;AACD,QAAA,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;KACxC;IAEM,OAAO,QAAQ,CAAC,UAAkE,EAAA;AACrF,QAAA,MAAM,MAAM,GAAG;AACX,YAAA,OAAO,EAAE,CAAC,GAAW,KAAI;AACrB,gBAAA,OAAO,GAAG,CAAC;aACd;AACD,YAAA,QAAQ,EAAE;gBACN,MAAM,EAAE,UAAU,CAAC,cAAc;AACpC,aAAA;AACD,YAAA,aAAa,EAAE;AACX,gBAAA,QAAQ,EAAE,GAAG;AACb,gBAAA,OAAO,EAAE,GAAG;AACZ,gBAAA,OAAO,EAAE,GAAG;AACZ,gBAAA,QAAQ,EAAE,GAAG;AAChB,aAAA;AACD,YAAA,UAAU,EAAE;gBACR,OAAO,EAAE,UAAU,CAAC,wBAAwB;gBAC5C,SAAS,EAAE,UAAU,CAAC,sBAAsB;AAC/C,aAAA;SACJ,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;YAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAC7D,SAAA;AACI,aAAA;AACD,YAAA,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC;AACnD,SAAA;AACD,QAAA,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;KACzC;AACO,IAAA,WAAW,QAAQ,GAAA;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;KACvC;AACJ;;;;"}