@talxis/base-controls 1.2406.2 → 1.2406.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 (214) hide show
  1. package/package.json +1 -1
  2. package/.env +0 -1
  3. package/.eslintrc +0 -117
  4. package/.npmgitignore +0 -9
  5. package/.vscode/settings.json +0 -3
  6. package/.yalcignore +0 -2
  7. package/azure-pipelines.yml +0 -44
  8. package/examples/Currency/Currency/ControlManifest.Input.xml +0 -53
  9. package/examples/Currency/Currency/index.ts +0 -66
  10. package/examples/Currency/Currency.pcfproj +0 -46
  11. package/examples/Currency/package-lock.json +0 -15900
  12. package/examples/Currency/package.json +0 -29
  13. package/examples/Currency/pcfconfig.json +0 -3
  14. package/examples/Currency/tsconfig.json +0 -7
  15. package/examples/DateTime/DateTime/ControlManifest.Input.xml +0 -58
  16. package/examples/DateTime/DateTime/index.ts +0 -69
  17. package/examples/DateTime/DateTime.pcfproj +0 -46
  18. package/examples/DateTime/package-lock.json +0 -15900
  19. package/examples/DateTime/package.json +0 -29
  20. package/examples/DateTime/pcfconfig.json +0 -3
  21. package/examples/DateTime/tsconfig.json +0 -7
  22. package/examples/Decimal/Decimal/ControlManifest.Input.xml +0 -66
  23. package/examples/Decimal/Decimal/index.ts +0 -66
  24. package/examples/Decimal/Decimal.pcfproj +0 -46
  25. package/examples/Decimal/package-lock.json +0 -15900
  26. package/examples/Decimal/package.json +0 -28
  27. package/examples/Decimal/pcfconfig.json +0 -3
  28. package/examples/Decimal/tsconfig.json +0 -7
  29. package/examples/Duration/Duration/ControlManifest.Input.xml +0 -53
  30. package/examples/Duration/Duration/index.ts +0 -66
  31. package/examples/Duration/Duration.pcfproj +0 -46
  32. package/examples/Duration/package-lock.json +0 -15900
  33. package/examples/Duration/package.json +0 -29
  34. package/examples/Duration/pcfconfig.json +0 -3
  35. package/examples/Duration/tsconfig.json +0 -7
  36. package/examples/Grid/Grid/ControlManifest.Input.xml +0 -28
  37. package/examples/Grid/Grid/index.ts +0 -100
  38. package/examples/Grid/Grid.pcfproj +0 -46
  39. package/examples/Grid/package-lock.json +0 -15901
  40. package/examples/Grid/package.json +0 -30
  41. package/examples/Grid/pcfconfig.json +0 -3
  42. package/examples/Grid/tsconfig.json +0 -7
  43. package/examples/Lookup/Lookup/ControlManifest.Input.xml +0 -51
  44. package/examples/Lookup/Lookup/index.ts +0 -90
  45. package/examples/Lookup/Lookup.pcfproj +0 -46
  46. package/examples/Lookup/package-lock.json +0 -15900
  47. package/examples/Lookup/package.json +0 -29
  48. package/examples/Lookup/pcfconfig.json +0 -3
  49. package/examples/Lookup/tsconfig.json +0 -8
  50. package/examples/MultiSelectOptionSet/MultiSelectOptionSet/ControlManifest.Input.xml +0 -53
  51. package/examples/MultiSelectOptionSet/MultiSelectOptionSet/index.ts +0 -86
  52. package/examples/MultiSelectOptionSet/MultiSelectOptionSet.pcfproj +0 -46
  53. package/examples/MultiSelectOptionSet/package-lock.json +0 -15900
  54. package/examples/MultiSelectOptionSet/package.json +0 -31
  55. package/examples/MultiSelectOptionSet/pcfconfig.json +0 -3
  56. package/examples/MultiSelectOptionSet/tsconfig.json +0 -7
  57. package/examples/OptionSet/OptionSet/ControlManifest.Input.xml +0 -53
  58. package/examples/OptionSet/OptionSet/index.ts +0 -70
  59. package/examples/OptionSet/OptionSet.pcfproj +0 -46
  60. package/examples/OptionSet/package-lock.json +0 -15900
  61. package/examples/OptionSet/package.json +0 -29
  62. package/examples/OptionSet/pcfconfig.json +0 -3
  63. package/examples/OptionSet/tsconfig.json +0 -7
  64. package/examples/TwoOptions/TwoOptions/ControlManifest.Input.xml +0 -53
  65. package/examples/TwoOptions/TwoOptions/index.ts +0 -69
  66. package/examples/TwoOptions/TwoOptions.pcfproj +0 -46
  67. package/examples/TwoOptions/package-lock.json +0 -15900
  68. package/examples/TwoOptions/package.json +0 -29
  69. package/examples/TwoOptions/pcfconfig.json +0 -3
  70. package/examples/TwoOptions/tsconfig.json +0 -7
  71. package/public/index.html +0 -43
  72. package/public/manifest.json +0 -25
  73. package/rollup.config.js +0 -44
  74. package/src/components/DateTime/DateTime.tsx +0 -97
  75. package/src/components/DateTime/components/Calendar.tsx +0 -80
  76. package/src/components/DateTime/hooks/useDateTime.ts +0 -144
  77. package/src/components/DateTime/index.ts +0 -2
  78. package/src/components/DateTime/interfaces.ts +0 -22
  79. package/src/components/DateTime/styles.ts +0 -37
  80. package/src/components/DateTime/translations.ts +0 -18
  81. package/src/components/Decimal/Decimal.tsx +0 -120
  82. package/src/components/Decimal/index.ts +0 -2
  83. package/src/components/Decimal/interfaces.ts +0 -20
  84. package/src/components/Duration/Duration.tsx +0 -143
  85. package/src/components/Duration/index.ts +0 -2
  86. package/src/components/Duration/interfaces.ts +0 -22
  87. package/src/components/Duration/translations.ts +0 -30
  88. package/src/components/Grid/Grid.tsx +0 -24
  89. package/src/components/Grid/core/components/AgGrid/AgGrid.tsx +0 -206
  90. package/src/components/Grid/core/components/AgGrid/components/EmptyRecordsOverlay/EmptyRecords.tsx +0 -16
  91. package/src/components/Grid/core/components/AgGrid/components/EmptyRecordsOverlay/styles.ts +0 -20
  92. package/src/components/Grid/core/components/AgGrid/components/LoadingOverlay/LoadingOverlay.tsx +0 -7
  93. package/src/components/Grid/core/components/AgGrid/controllers/useAgGridController.ts +0 -68
  94. package/src/components/Grid/core/components/AgGrid/model/AgGrid.ts +0 -100
  95. package/src/components/Grid/core/components/AgGrid/styles.ts +0 -72
  96. package/src/components/Grid/core/components/Cell/Commands/Commands.tsx +0 -32
  97. package/src/components/Grid/core/components/Cell/Commands/Icon.tsx +0 -17
  98. package/src/components/Grid/core/components/Cell/Commands/styles.ts +0 -21
  99. package/src/components/Grid/core/components/Cell/Commands/useCommands.tsx +0 -53
  100. package/src/components/Grid/core/components/Cell/EditableCell/EditableCell.tsx +0 -140
  101. package/src/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyCell.tsx +0 -176
  102. package/src/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyOptionSet/ReadOnlyOptionSet.tsx +0 -67
  103. package/src/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyOptionSet/styles.ts +0 -24
  104. package/src/components/Grid/core/components/Cell/ReadOnlyCell/styles.ts +0 -56
  105. package/src/components/Grid/core/components/ColumnHeader/ColumnHeader.tsx +0 -71
  106. package/src/components/Grid/core/components/ColumnHeader/components/GlobalCheckbox/GlobalCheckbox.tsx +0 -31
  107. package/src/components/Grid/core/components/ColumnHeader/components/GlobalCheckbox/styles.ts +0 -16
  108. package/src/components/Grid/core/components/ColumnHeader/styles.ts +0 -40
  109. package/src/components/Grid/core/components/Component/Component.tsx +0 -59
  110. package/src/components/Grid/core/components/Component/controller/useComponentController.ts +0 -39
  111. package/src/components/Grid/core/components/Component/model/Component.ts +0 -251
  112. package/src/components/Grid/core/components/Dialog/Constants.tsx +0 -8
  113. package/src/components/Grid/core/components/Dialog/Styles.tsx +0 -61
  114. package/src/components/Grid/core/components/Dialog/index.tsx +0 -22
  115. package/src/components/Grid/core/components/Dialog/interfaces/index.d.ts +0 -7
  116. package/src/components/Grid/core/components/Save/Save.tsx +0 -74
  117. package/src/components/Grid/core/components/Save/components/ChangeEditor/ChangeEditor.tsx +0 -63
  118. package/src/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/RecordGrids.tsx +0 -153
  119. package/src/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/styles.ts +0 -52
  120. package/src/components/Grid/core/components/Save/components/ChangeEditor/styles.ts +0 -34
  121. package/src/components/Grid/core/components/Save/hooks/useSave.ts +0 -59
  122. package/src/components/Grid/core/components/Save/styles.ts +0 -41
  123. package/src/components/Grid/core/controllers/useGridController.ts +0 -46
  124. package/src/components/Grid/core/enums/ConditionOperator.ts +0 -46
  125. package/src/components/Grid/core/enums/DataType.ts +0 -25
  126. package/src/components/Grid/core/hooks/useGridInstance.ts +0 -7
  127. package/src/components/Grid/core/hooks/useRefreshCallback.ts +0 -20
  128. package/src/components/Grid/core/hooks/useRerender.ts +0 -15
  129. package/src/components/Grid/core/interfaces/IGridColumn.ts +0 -19
  130. package/src/components/Grid/core/interfaces/IGridContext.ts +0 -7
  131. package/src/components/Grid/core/model/Grid.ts +0 -250
  132. package/src/components/Grid/core/model/GridDependency.ts +0 -34
  133. package/src/components/Grid/core/model/Metadata.ts +0 -20
  134. package/src/components/Grid/core/services/RecordUpdateService/controllers/useRecordUpdateServiceController.ts +0 -36
  135. package/src/components/Grid/core/services/RecordUpdateService/model/RecordUpdateService.ts +0 -222
  136. package/src/components/Grid/filtering/components/FilterCallout/FilterCallout.tsx +0 -83
  137. package/src/components/Grid/filtering/components/FilterCallout/components/ConditionOperator/ConditionOperator.tsx +0 -66
  138. package/src/components/Grid/filtering/components/FilterCallout/components/ConditionValue/ConditionValue.tsx +0 -48
  139. package/src/components/Grid/filtering/components/FilterCallout/components/ConditionValue/model/ConditionComponentValue.ts +0 -120
  140. package/src/components/Grid/filtering/components/FilterCallout/styles.ts +0 -37
  141. package/src/components/Grid/filtering/constants.ts +0 -48
  142. package/src/components/Grid/filtering/controller/useColumnFilterConditionController.ts +0 -63
  143. package/src/components/Grid/filtering/model/Condition.ts +0 -309
  144. package/src/components/Grid/filtering/model/Filtering.ts +0 -78
  145. package/src/components/Grid/filtering/utils/FilteringUtilts.ts +0 -190
  146. package/src/components/Grid/interfaces.ts +0 -109
  147. package/src/components/Grid/paging/components/Paging/Paging.tsx +0 -76
  148. package/src/components/Grid/paging/components/Paging/styles.ts +0 -38
  149. package/src/components/Grid/paging/controllers/usePagingController.ts +0 -34
  150. package/src/components/Grid/paging/model/Paging.ts +0 -49
  151. package/src/components/Grid/selection/controllers/useSelectionController.ts +0 -25
  152. package/src/components/Grid/selection/model/Selection.ts +0 -60
  153. package/src/components/Grid/sorting/Sorting.ts +0 -30
  154. package/src/components/Grid/sorting/components/SortingContextualMenu/SortingContextualMenu.tsx +0 -126
  155. package/src/components/Grid/sorting/components/SortingContextualMenu/styles.ts +0 -12
  156. package/src/components/Grid/sorting/controllers/useColumnSortingController.ts +0 -26
  157. package/src/components/Grid/translations.ts +0 -80
  158. package/src/components/Grid/validation/controllers/useRecordValidationController.ts +0 -31
  159. package/src/components/Grid/validation/model/ColumnValidation.ts +0 -81
  160. package/src/components/Lookup/Lookup.tsx +0 -199
  161. package/src/components/Lookup/components/RecordCreator.tsx +0 -53
  162. package/src/components/Lookup/components/TargetSelector.tsx +0 -43
  163. package/src/components/Lookup/hooks/useFetchXml.ts +0 -31
  164. package/src/components/Lookup/hooks/useLoadedEntities.ts +0 -23
  165. package/src/components/Lookup/hooks/useLookup.ts +0 -126
  166. package/src/components/Lookup/index.ts +0 -2
  167. package/src/components/Lookup/interfaces.ts +0 -45
  168. package/src/components/Lookup/lib.ts +0 -3110
  169. package/src/components/Lookup/styles.ts +0 -106
  170. package/src/components/Lookup/translations.ts +0 -28
  171. package/src/components/MultiSelectOptionSet/MultiSelectOptionSet.tsx +0 -83
  172. package/src/components/MultiSelectOptionSet/index.ts +0 -2
  173. package/src/components/MultiSelectOptionSet/interfaces.ts +0 -14
  174. package/src/components/OptionSet/OptionSet.tsx +0 -67
  175. package/src/components/OptionSet/index.ts +0 -2
  176. package/src/components/OptionSet/interfaces.ts +0 -17
  177. package/src/components/TextField/TextField.tsx +0 -58
  178. package/src/components/TextField/hooks/useTextField.ts +0 -42
  179. package/src/components/TextField/index.ts +0 -2
  180. package/src/components/TextField/interfaces.ts +0 -20
  181. package/src/components/TwoOptions/TwoOptions.tsx +0 -43
  182. package/src/components/TwoOptions/index.ts +0 -2
  183. package/src/components/TwoOptions/interfaces.ts +0 -17
  184. package/src/hooks/index.ts +0 -1
  185. package/src/hooks/useComponent.ts +0 -83
  186. package/src/hooks/useFocusIn.ts +0 -23
  187. package/src/hooks/useInputBasedComponent.ts +0 -71
  188. package/src/hooks/useMouseOver.ts +0 -23
  189. package/src/index.tsx +0 -12
  190. package/src/interfaces/context.ts +0 -21
  191. package/src/interfaces/index.ts +0 -12
  192. package/src/interfaces/parameters.ts +0 -26
  193. package/src/interfaces/property.ts +0 -111
  194. package/src/sandbox/index.tsx +0 -137
  195. package/src/sandbox/mock/Context.ts +0 -18
  196. package/src/sandbox/mock/Formatting.ts +0 -186
  197. package/src/sandbox/mock/Mode.ts +0 -25
  198. package/src/sandbox/mock/UserSettings.ts +0 -31
  199. package/src/sandbox/mock/Utility.ts +0 -14
  200. package/src/sandbox/shared/durationList.tsx +0 -24
  201. package/src/sandbox/shared/multiSelectOptionList.tsx +0 -5
  202. package/src/sandbox/shared/optionList.tsx +0 -5
  203. package/src/stories/Introduction.stories.mdx +0 -122
  204. package/src/stories/assets/code-brackets.svg +0 -1
  205. package/src/stories/assets/colors.svg +0 -1
  206. package/src/stories/assets/comments.svg +0 -1
  207. package/src/stories/assets/direction.svg +0 -1
  208. package/src/stories/assets/flow.svg +0 -1
  209. package/src/stories/assets/plugin.svg +0 -1
  210. package/src/stories/assets/repo.svg +0 -1
  211. package/src/stories/assets/stackalt.svg +0 -1
  212. package/src/types/index.ts +0 -3
  213. package/src/utils/NumeralPCF.ts +0 -62
  214. package/tsconfig.json +0 -28
@@ -1,68 +0,0 @@
1
- import { ColDef, GridApi } from "@ag-grid-community/core";
2
- import { useEffect, useMemo, useRef, useState } from "react";
3
- import { IEntityRecord } from "../../../../interfaces";
4
- import { useGridController } from "../../../controllers/useGridController"
5
- import { useGridInstance } from "../../../hooks/useGridInstance";
6
- import { EditableCell } from "../../Cell/EditableCell/EditableCell";
7
- import { ReadOnlyCell } from "../../Cell/ReadOnlyCell/ReadOnlyCell";
8
- import { ColumnHeader } from "../../ColumnHeader/ColumnHeader";
9
- import { GlobalCheckBox } from "../../ColumnHeader/components/GlobalCheckbox/GlobalCheckbox";
10
- import { AgGrid } from "../model/AgGrid";
11
- import { ModuleRegistry } from '@ag-grid-community/core';
12
- import { ClientSideRowModelModule } from '@ag-grid-community/client-side-row-model';
13
- import { useDebounce } from 'use-debounce';
14
- import "@ag-grid-community/styles/ag-grid.css";
15
- import "@ag-grid-community/styles/ag-theme-balham.css";
16
- ModuleRegistry.registerModules([ClientSideRowModelModule]);
17
-
18
- interface IAgGridController {
19
- agColumns: ColDef[],
20
- records: IEntityRecord[],
21
- onGridReady: () => void;
22
- }
23
-
24
- export const useAgGridController = (gridApiRef: React.MutableRefObject<GridApi<ComponentFramework.PropertyHelper.DataSetApi.EntityRecord> | undefined>): IAgGridController => {
25
- const grid = useGridInstance();
26
- const agGridReadyRef = useRef<boolean>(false);
27
- const agGrid = useMemo(() => new AgGrid(grid, gridApiRef), [])
28
- const { columns, records } = useGridController();
29
- const [agColumns, setAgColumns] = useState<ColDef[]>([]);
30
- //this is to prevent AgGrid from throwing errors in some rerender edge cases - https://github.com/ag-grid/ag-grid/issues/6013
31
- const [agRecords] = useDebounce(records, 0);
32
-
33
- useEffect(() => {
34
- if (!agGridReadyRef.current) {
35
- return;
36
- }
37
- agGrid.selectRows();
38
- }, [grid.dataset.getSelectedRecordIds().join('')]);
39
-
40
-
41
- const onGridReady = () => {
42
- agGridReadyRef.current = true;
43
- agGrid.selectRows();
44
- }
45
- useEffect(() => {
46
- if (columns.length === 0) {
47
- return;
48
- }
49
- const _agColumns = agGrid.columns;
50
- for (const agColumn of _agColumns) {
51
- agColumn.cellRenderer = ReadOnlyCell;
52
- agColumn.cellEditor = EditableCell;
53
- agColumn.headerComponent = ColumnHeader;
54
-
55
- if (agColumn.field === '__checkbox') {
56
- agColumn.lockPosition = 'left';
57
- agColumn.headerComponent = GlobalCheckBox
58
- }
59
- }
60
- setAgColumns(_agColumns);
61
- }, [columns]);
62
-
63
- return {
64
- agColumns: agColumns,
65
- records: agRecords,
66
- onGridReady: onGridReady
67
- }
68
- }
@@ -1,100 +0,0 @@
1
- import { ColDef, GridApi, IRowNode } from "@ag-grid-community/core";
2
- import { Grid } from "../../../model/Grid";
3
- import { GridDependency } from "../../../model/GridDependency";
4
- import { DataType } from "../../../enums/DataType";
5
- import { IGridColumn } from "../../../interfaces/IGridColumn";
6
-
7
- export class AgGrid extends GridDependency {
8
- private _gridApiRef: React.MutableRefObject<GridApi<ComponentFramework.PropertyHelper.DataSetApi.EntityRecord> | undefined>
9
-
10
- constructor(grid: Grid, gridApiRef: React.MutableRefObject<GridApi<ComponentFramework.PropertyHelper.DataSetApi.EntityRecord> | undefined>) {
11
- super(grid);
12
- this._gridApiRef = gridApiRef;
13
- }
14
- public get columns() {
15
- const agColumns: ColDef[] = [];
16
- for (const column of this._grid.columns) {
17
- const agColumn: ColDef = {
18
- colId: column.key,
19
- field: column.key,
20
- headerName: column.displayName,
21
- initialWidth: column.width,
22
- sortable: column.isSortable,
23
- editable: column.isEditable,
24
- resizable: column.isResizable,
25
- suppressMovable: this._grid.props.parameters.ChangeEditorMode ? true : undefined,
26
- autoHeaderHeight: true,
27
- suppressSizeToFit: column.key === '__checkbox',
28
- cellClass: this._getCellClassName(column),
29
- valueFormatter: (p) => {
30
- return p.data.getFormattedValue(column.key)
31
- },
32
- valueGetter: (p) => {
33
- return p.data.getValue(column.key)
34
- },
35
- cellRendererParams: {
36
- baseColumn: column
37
- },
38
- cellEditorParams: {
39
- baseColumn: column,
40
- },
41
- headerComponentParams: {
42
- baseColumn: column
43
- },
44
- suppressKeyboardEvent: (params) => {
45
- if (params.event.key !== 'Enter' || params.api.getEditingCells().length === 0) {
46
- return false;
47
- }
48
- switch (column.dataType) {
49
- case DataType.DATE_AND_TIME_DATE_AND_TIME:
50
- case DataType.DATE_AND_TIME_DATE_ONLY:
51
- case DataType.LOOKUP_OWNER:
52
- case DataType.LOOKUP_SIMPLE:
53
- case DataType.MULTI_SELECT_OPTIONSET:
54
- case DataType.OPTIONSET:
55
- case DataType.TWO_OPTIONS:
56
- case DataType.WHOLE_DURATION: {
57
- return true;
58
- }
59
- }
60
- return false;
61
- }
62
- }
63
- agColumns.push(agColumn)
64
- }
65
- return agColumns;
66
- }
67
- public selectRows() {
68
- if (!this._gridApi) {
69
- return;
70
- }
71
- const nodesToSelect: IRowNode[] = [];
72
- this._gridApi.deselectAll();
73
- this._gridApi.forEachNode((node: IRowNode) => {
74
- if (this._grid.dataset.getSelectedRecordIds().includes(node.data.getRecordId())) {
75
- nodesToSelect.push(node);
76
- }
77
- });
78
- this._gridApi.setNodesSelected({
79
- nodes: nodesToSelect,
80
- newValue: true
81
- });
82
- this._gridApi.refreshCells({
83
- columns: ['__checkbox'],
84
- force: true
85
- })
86
- }
87
- private get _gridApi() {
88
- return this._gridApiRef.current;
89
- }
90
- private _getCellClassName(column: IGridColumn) {
91
- switch (column.dataType) {
92
- case DataType.CURRENCY:
93
- case DataType.DECIMAL:
94
- case DataType.WHOLE_NONE: {
95
- return 'talxis-cell-align-right';
96
- }
97
- }
98
- return 'talxis-cell-align-left';
99
- }
100
- }
@@ -1,72 +0,0 @@
1
- import { ITheme, mergeStyleSets } from "@fluentui/react";
2
-
3
- export const getGridStyles = (theme: ITheme, numOfRecords?: number) => {
4
- return mergeStyleSets({
5
- root: {
6
- height: '100%',
7
- display: 'flex',
8
- flexDirection: 'column',
9
- '--height-offset': '64px',
10
- ':has(.ag-body-horizontal-scroll-viewport[style*="height: 0px"])': {
11
- '--height-offset': '45px'
12
- } ,
13
- '--ag-borders': 'none !important',
14
- '.ag-root-wrapper': {
15
- maxHeight: '100%',
16
- '--ag-input-focus-border-color': 'transparent',
17
- borderBottom: `1px solid ${theme.semanticColors.bodyDivider}`,
18
- ':has(.ag-overlay:not(.ag-hidden) .TALXIS__grid__empty-records)': {
19
- minHeight: 270
20
- }
21
- },
22
- '.ag-root-wrapper.ag-layout-normal': {
23
- height: numOfRecords ? `calc(${numOfRecords} * 42px + var(--height-offset))` : undefined,
24
- },
25
- '.ag-body': {
26
- borderTop: `1px solid ${theme.semanticColors.bodyDivider}`
27
- },
28
- '.ag-header-viewport': {
29
- backgroundColor: `${theme.semanticColors.bodyBackground}`
30
- },
31
- '.ag-center-cols-container': {
32
- minWidth: '100%',
33
- },
34
- '.ag-layout-auto-height .ag-center-cols-clipper, .ag-layout-auto-height .ag-center-cols-container, .ag-layout-print .ag-center-cols-clipper, .ag-layout-print .ag-center-cols-container': {
35
- minHeight: '42px !important'
36
- },
37
- '.ag-header-cell': {
38
- paddingLeft: 0,
39
- paddingRight: 0,
40
- backgroundColor: `${theme.semanticColors.bodyBackground} !important`
41
- },
42
- '.ag-cell-inline-editing': {
43
- overflow: 'visible',
44
- top: -1,
45
- backgroundColor: 'transparent',
46
- 'input': {
47
- paddingLeft: 10
48
- },
49
- '.TALXIS__error-message__root': {
50
- display: 'none'
51
- }
52
- },
53
- '.talxis-cell-align-right': {
54
- '[class^="cellContent"]': {
55
- justifyContent: 'flex-end',
56
- },
57
- '.talxis-cell-text, input': {
58
- textAlign: 'right'
59
- },
60
- 'input': {
61
- paddingRight: 10
62
- }
63
- },
64
- '.ag-cell-focus:has([data-is-valid="false"])': {
65
- border: '1px solid red !important;'
66
- },
67
- '.TALXIS__combobox__root, [class*="TALXIS__textfield__root"], [class*="TALXIS__tag-picker__root"]': {
68
- padding: '0px !important'
69
- }
70
- }
71
- })
72
- }
@@ -1,32 +0,0 @@
1
- import * as React from 'react';
2
- import { useCommands } from './useCommands';
3
- import { CommandBar } from '@talxis/react-components/dist/components/CommandBar';
4
- import { commandStyles } from './styles';
5
- import { CommandBarButton } from '@fluentui/react';
6
-
7
- interface ICommands {
8
- record: ComponentFramework.PropertyHelper.DataSetApi.EntityRecord;
9
- }
10
-
11
- export const Commands = ({ record }: ICommands) => {
12
- const [items] = useCommands(record);
13
- if (!items) {
14
- return <></>
15
- }
16
- if (items?.length > 0) {
17
- return <CommandBar className={commandStyles.talxisRoot} overflowButtonProps={{
18
- styles: {
19
- root: commandStyles.button,
20
- rootHovered: commandStyles.button,
21
- rootPressed: commandStyles.button,
22
- rootExpanded: commandStyles.button
23
- }
24
- }} styles={{
25
- root: commandStyles.root,
26
-
27
- }} items={[]}
28
- farItems={items}
29
- />;
30
- }
31
- return <></>;
32
- };
@@ -1,17 +0,0 @@
1
- import React, { memo, useMemo } from 'react';
2
- import 'external-svg-loader';
3
- import { commandStyles } from './styles';
4
-
5
- interface IIcon {
6
- name: string
7
- }
8
-
9
- const IconComponent = ({ name }: IIcon) => {
10
- //@ts-ignore - types
11
- const src = !window.TALXIS?.Portal ? `https://${window.location.host}${window.Xrm.Utility.getGlobalContext().getWebResourceUrl(name)}` : name;
12
- return (
13
- <svg data-src={src} className={commandStyles.icon} />
14
- );
15
- };
16
-
17
- export const Icon = memo(IconComponent);
@@ -1,21 +0,0 @@
1
- import { mergeStyleSets } from "@fluentui/react";
2
-
3
- export const commandStyles = mergeStyleSets({
4
- root: {
5
- backgroundColor: 'transparent'
6
- },
7
- talxisRoot: {
8
- minWidth: 0,
9
- flexShrink: 1,
10
- flexGrow: 1
11
- },
12
- button: {
13
- backgroundColor: 'transparent',
14
- },
15
- icon: {
16
- width: 16,
17
- height: 16,
18
- marginLeft: 4,
19
- marginRight: 4,
20
- }
21
- });
@@ -1,53 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { ICommandBarItemProps } from "@fluentui/react";
3
- import { Icon } from './Icon';
4
- import React from "react";
5
- import { commandStyles } from "./styles";
6
- import { useGridInstance } from "../../../hooks/useGridInstance";
7
-
8
- export const useCommands = (record: ComponentFramework.PropertyHelper.DataSetApi.EntityRecord): [
9
- ICommandBarItemProps[] | null
10
- ] => {
11
-
12
- const dataset = useGridInstance().dataset
13
- const [commandBarItems, setCommandBarItems] = useState<ICommandBarItemProps[] | null>(null);
14
- useEffect(() => {
15
- (async () => {
16
- setCommandBarItems(await getCommandBarItems());
17
- })();
18
- }, []);
19
-
20
- const getCommandBarItems = async () => {
21
- const items: ICommandBarItemProps[] = [];
22
- if(!dataset.retrieveRecordCommand) {
23
- return []
24
- }
25
- const commands = await dataset.retrieveRecordCommand([record.getRecordId()]);
26
- for (const command of commands) {
27
- if (!command.shouldBeVisible) {
28
- continue;
29
- }
30
- items.push({
31
- key: command.commandButtonId,
32
- text: command.label,
33
- ["data-id"]: command.commandButtonId,
34
- ["data-command"]: command.commandId,
35
- buttonStyles: {
36
- root: commandStyles.button,
37
- rootHovered: commandStyles.button,
38
- rootPressed: commandStyles.button,
39
- },
40
- onClick: (e) => {
41
- e?.stopPropagation();
42
- command.execute();
43
- },
44
- onRenderIcon: command.icon?.includes('.svg') ? () => <Icon name={command.icon} /> : undefined,
45
- iconProps: command.icon ? {
46
- iconName: command.icon
47
- } : undefined
48
- });
49
- }
50
- return items;
51
- };
52
- return [commandBarItems];
53
- };
@@ -1,140 +0,0 @@
1
- import * as React from 'react';
2
- import { NumeralPCF } from '../../../../../../utils/NumeralPCF';
3
- import { DataType } from '../../../enums/DataType';
4
- import { useGridInstance } from '../../../hooks/useGridInstance';
5
- import { IGridColumn } from '../../../interfaces/IGridColumn';
6
- import { useRecordUpdateServiceController } from '../../../services/RecordUpdateService/controllers/useRecordUpdateServiceController';
7
- import { Component } from '../../Component/Component';
8
- import { ICellEditorParams } from '@ag-grid-community/core';
9
- import numeral from "numeral";
10
- import { IEntityRecord } from '../../../../interfaces';
11
-
12
- interface ICell extends ICellEditorParams {
13
- baseColumn: IGridColumn;
14
- data: ComponentFramework.PropertyHelper.DataSetApi.EntityRecord;
15
- }
16
-
17
- export const EditableCell = (props: ICell) => {
18
- const grid = useGridInstance();
19
- const column = props.baseColumn;
20
- const recordUpdateService = useRecordUpdateServiceController();
21
- const mountedRef = React.useRef(true);
22
- const hasBeenUpdatedRef = React.useRef<boolean>(false);
23
- const record: IEntityRecord = (() => {
24
- //this is so we can load the updated record values from state
25
- const updatedRecord = grid.recordUpdateService.record(props.data.getRecordId()).get() as any;
26
- return updatedRecord ?? props.data;
27
- })();
28
- const valueRef = React.useRef(record.getValue(column.key));
29
- const [value, setValue] = React.useState(valueRef.current);
30
-
31
- React.useEffect(() => {
32
- return () => {
33
- mountedRef.current = false;
34
- if (!hasBeenUpdatedRef.current) {
35
- return;
36
- }
37
- recordUpdateService.record(record.getRecordId()).setValue(column.key, getRecordValue(valueRef.current))
38
- }
39
- }, []);
40
-
41
- const getComponentValue = (value: any) => {
42
- //already is component value;
43
- if(hasBeenUpdatedRef.current) {
44
- return value;
45
- }
46
- switch(column.dataType) {
47
- case DataType.TWO_OPTIONS: {
48
- value = value === '1' ? true : false
49
- break;
50
- }
51
- case DataType.OPTIONSET: {
52
- value = value ? parseInt(value) : null;
53
- break;
54
-
55
- }
56
- case DataType.MULTI_SELECT_OPTIONSET: {
57
- value = value ? value.split(',').map((value: string) => parseInt(value)) : null;
58
- break;
59
- }
60
- case DataType.LOOKUP_SIMPLE:
61
- case DataType.LOOKUP_OWNER: {
62
- if(value && !Array.isArray(value)) {
63
- value = [value];
64
- }
65
- value = value?.map((x: any) => {
66
- return {
67
- entityType: x.etn,
68
- id: x.id.guid,
69
- name: x.name
70
- }
71
- })
72
- break;
73
- }
74
- }
75
- return value;
76
- }
77
- //this is just so the setValue API in Power Apps accepts the values that come from the components
78
- const getRecordValue = (value: any) => {
79
- switch (column.dataType) {
80
- case DataType.TWO_OPTIONS: {
81
- value = value === true ? '1' : '0';
82
- break;
83
- }
84
- case DataType.LOOKUP_SIMPLE:
85
- case DataType.LOOKUP_OWNER: {
86
- value = value?.map((x: any) => {
87
- return {
88
- entityName: x.entityType,
89
- name: x.name,
90
- id: x.id
91
- }
92
- })?.[0];
93
- break;
94
- }
95
- }
96
- return value;
97
- }
98
-
99
- const onNotifyOutputChanged = (value: any) => {
100
- valueRef.current = value;
101
- hasBeenUpdatedRef.current = true;
102
- if(!mountedRef.current) {
103
- recordUpdateService.record(record.getRecordId()).setValue(column.key, getRecordValue(valueRef.current))
104
- return;
105
- }
106
- switch(column.dataType) {
107
- case DataType.OPTIONSET:
108
- case DataType.DATE_AND_TIME_DATE_ONLY: {
109
- props.stopEditing();
110
- return;
111
- }
112
- case DataType.LOOKUP_OWNER:
113
- case DataType.LOOKUP_SIMPLE: {
114
- if(value?.length > 0) {
115
- props.stopEditing();
116
- return;
117
- }
118
- }
119
- }
120
- setValue(valueRef.current);
121
- }
122
-
123
- return <Component
124
- column={column}
125
- value={getComponentValue(value)}
126
- formattedValue={record.getFormattedValue(column.key)}
127
- onNotifyOutputChanged={onNotifyOutputChanged}
128
- additionalParameters={{
129
- AutoFocus: {
130
- raw: true
131
- },
132
- Height: {
133
- raw: 41
134
- },
135
- EnableNavigation: {
136
- raw: false
137
- }
138
- }}
139
- />
140
- }
@@ -1,176 +0,0 @@
1
- import * as React from 'react';
2
- import { ILinkProps } from '@fluentui/react/lib/components/Link/Link.types';
3
- import { Link } from '@fluentui/react/lib/components/Link/Link';
4
- import { Text } from '@fluentui/react/lib/Text';
5
- import { getReadOnlyCellStyles } from './styles';
6
- import { Commands } from '../Commands/Commands';
7
- import { Checkbox, Icon, TooltipHost, useTheme, Image } from '@fluentui/react';
8
- import { FileAttribute } from '@talxis/client-libraries';
9
- import { ReadOnlyOptionSet } from './ReadOnlyOptionSet/ReadOnlyOptionSet';
10
- import { IGridColumn } from '../../../interfaces/IGridColumn';
11
- import { DataType } from '../../../enums/DataType';
12
- import { useColumnValidationController } from '../../../../validation/controllers/useRecordValidationController';
13
- import { useGridInstance } from '../../../hooks/useGridInstance';
14
- import { useSelectionController } from '../../../../selection/controllers/useSelectionController';
15
- import { IEntityRecord } from '../../../../interfaces';
16
- import { ICellRendererParams } from '@ag-grid-community/core';
17
-
18
- interface ICellProps extends ICellRendererParams {
19
- baseColumn: IGridColumn;
20
- data: IEntityRecord;
21
- [key: string]: any;
22
- }
23
-
24
- export const ReadOnlyCell = (props: ICellProps) => {
25
- const grid = useGridInstance();
26
- const column = props.baseColumn;
27
- const record = props.data;
28
- const theme = useTheme();
29
- const styles = getReadOnlyCellStyles(theme);
30
- const tooltipId = React.useMemo(() => Math.random().toString(), []);
31
-
32
- const [isValid, errorMessage] = useColumnValidationController({
33
- column: column,
34
- record: record,
35
- })
36
-
37
- return (
38
- <TooltipHost
39
- id={tooltipId}
40
- content={!isValid && !grid.loading ? errorMessage : undefined}>
41
- <div className={styles.root} data-is-valid={isValid}>
42
- <div className={styles.cellContent}>
43
- <InternalReadOnlyCell {...props} />
44
- </div>
45
- {!isValid && !grid.loading && <Icon styles={{
46
- root: {
47
- color: theme.semanticColors.errorIcon
48
- }
49
- }} iconName='Error' />}
50
- </div>
51
- </TooltipHost>
52
- )
53
- };
54
-
55
- const InternalReadOnlyCell = (props: ICellProps) => {
56
- const grid = useGridInstance();
57
- const column = props.baseColumn;
58
- const theme = useTheme();
59
- const styles = getReadOnlyCellStyles(theme);
60
- const selection = useSelectionController();
61
- const record: IEntityRecord = (() => {
62
- //this is so we can load the updated record values from state
63
- const updatedRecord = grid.recordUpdateService.record(props.data.getRecordId()).get() as any;
64
- return updatedRecord ?? props.data;
65
- })();
66
- const formattedValue = record.getFormattedValue(column.key);
67
-
68
- const renderLink = (props: ILinkProps, formattedValue: string): JSX.Element => {
69
- switch(column.dataType) {
70
- case DataType.LOOKUP_OWNER:
71
- case DataType.LOOKUP_SIMPLE: {
72
- if(!grid.isNavigationEnabled) {
73
- return renderText();
74
- }
75
- }
76
- }
77
- return (
78
- <Link {...props} className={styles.link} title={formattedValue}>
79
- {formattedValue}
80
- </Link>
81
- );
82
- };
83
- const renderText = (): JSX.Element => {
84
- if (column.isPrimary && grid.isNavigationEnabled) {
85
- return renderLink({
86
- onClick: () => grid.openDatasetItem(record.getNamedReference())
87
- }, formattedValue);
88
- }
89
- return <Text className={`${styles.text} talxis-cell-text`} title={formattedValue}>{formattedValue}</Text>
90
- }
91
- const downloadFile = () => {
92
- const storage = new FileAttribute(grid.pcfContext.webAPI);
93
- const namedReference = record.getNamedReference();
94
- storage.downloadFileFromAttribute({
95
- entityName: namedReference.etn,
96
- recordId: record.getRecordId(),
97
- fileAttribute: column.key,
98
- }, true)
99
- }
100
-
101
- switch (column.dataType) {
102
- case DataType.SINGLE_LINE_EMAIL: {
103
- return renderLink({ href: `mailto:${formattedValue}` }, formattedValue);
104
- }
105
- case DataType.SINGLE_LINE_PHONE: {
106
- return renderLink({ href: `tel:${formattedValue}` }, formattedValue);
107
- }
108
- case DataType.SINGLE_LINE_URL: {
109
- return renderLink({
110
- href: formattedValue,
111
- target: '_blank',
112
- rel: 'noopener noreferrer'
113
- }, formattedValue);
114
- }
115
- case DataType.LOOKUP_SIMPLE:
116
- case DataType.LOOKUP_OWNER: {
117
- return renderLink({
118
- onClick: () => grid.openDatasetItem(record.getValue(column.key) as any)
119
- }, formattedValue);
120
- }
121
- case DataType.FILE: {
122
- if (!formattedValue) {
123
- return <></>
124
- }
125
- return (
126
- <div className={styles.fileWrapper}>
127
- <Icon iconName='Attach' />
128
- {
129
- renderLink({
130
- onClick: downloadFile
131
- }, 'Download')
132
- }
133
- </div>
134
- )
135
- }
136
- case DataType.IMAGE: {
137
- if (!formattedValue) {
138
- return <></>
139
- }
140
- return (
141
- <div className={styles.fileWrapper}>
142
- <Image className={styles.image} src={`data:image/png;base64,${formattedValue}`} />
143
- {
144
- renderLink({
145
- onClick: downloadFile
146
- }, 'Download')
147
- }
148
- </div>
149
- )
150
- }
151
- case DataType.OPTIONSET:
152
- case DataType.MULTI_SELECT_OPTIONSET:
153
- case DataType.TWO_OPTIONS: {
154
- return <ReadOnlyOptionSet
155
- column={column}
156
- record={record}
157
- defaultRender={renderText} />
158
- }
159
- default: {
160
- if(column.key === '__checkbox') {
161
- return <Checkbox
162
- checked={props.node.isSelected()}
163
- onChange={(e, checked) => {
164
- e?.stopPropagation()
165
- console.log(props.api.getSelectedNodes())
166
- selection.toggle(record, checked!)
167
- }} />
168
- }
169
- if(column.key === '__ribbon') {
170
- return <Commands record={record} />
171
- }
172
- return renderText()
173
- }
174
-
175
- }
176
- }