@talxis/base-controls 1.2410.3 → 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.
- package/README.md +20 -11
- package/dist/components/DatasetControl/DatasetControl.d.ts +3 -0
- package/dist/components/DatasetControl/DatasetControl.js +63 -0
- package/dist/components/DatasetControl/DatasetControl.js.map +1 -0
- package/dist/components/DatasetControl/hooks/useRerender.d.ts +1 -0
- package/dist/components/DatasetControl/hooks/useRerender.js +9 -0
- package/dist/components/DatasetControl/hooks/useRerender.js.map +1 -0
- package/dist/components/DatasetControl/index.d.ts +2 -0
- package/dist/components/DatasetControl/index.js +2 -0
- package/dist/components/DatasetControl/index.js.map +1 -0
- package/dist/components/DatasetControl/interfaces.d.ts +10 -0
- package/dist/components/DatasetControl/styles.d.ts +8 -0
- package/dist/components/DatasetControl/styles.js +17 -0
- package/dist/components/DatasetControl/styles.js.map +1 -0
- package/dist/components/DatasetControl/translations.d.ts +10 -0
- package/dist/components/DatasetControl/translations.js +7 -0
- package/dist/components/DatasetControl/translations.js.map +1 -0
- package/dist/components/Decimal/Decimal.js +1 -1
- package/dist/components/Decimal/Decimal.js.map +1 -1
- package/dist/components/Duration/Duration.js +1 -1
- package/dist/components/Duration/Duration.js.map +1 -1
- package/dist/components/Grid/Grid.js +9 -2
- package/dist/components/Grid/Grid.js.map +1 -1
- package/dist/components/Grid/core/components/AgGrid/AgGrid.js +21 -46
- package/dist/components/Grid/core/components/AgGrid/AgGrid.js.map +1 -1
- package/dist/components/Grid/core/components/AgGrid/controllers/useAgGridController.d.ts +0 -1
- package/dist/components/Grid/core/components/AgGrid/controllers/useAgGridController.js +7 -7
- package/dist/components/Grid/core/components/AgGrid/controllers/useAgGridController.js.map +1 -1
- package/dist/components/Grid/core/components/AgGrid/model/AgGrid.d.ts +0 -2
- package/dist/components/Grid/core/components/AgGrid/model/AgGrid.js +0 -7
- package/dist/components/Grid/core/components/AgGrid/model/AgGrid.js.map +1 -1
- package/dist/components/Grid/core/components/AgGrid/styles.d.ts +1 -4
- package/dist/components/Grid/core/components/AgGrid/styles.js +6 -9
- package/dist/components/Grid/core/components/AgGrid/styles.js.map +1 -1
- package/dist/components/Grid/core/components/Cell/EditableCell/EditableCell.js +0 -2
- package/dist/components/Grid/core/components/Cell/EditableCell/EditableCell.js.map +1 -1
- package/dist/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyCell.js +16 -4
- package/dist/components/Grid/core/components/Cell/ReadOnlyCell/ReadOnlyCell.js.map +1 -1
- package/dist/components/Grid/core/components/Component/model/Component.js +7 -2
- package/dist/components/Grid/core/components/Component/model/Component.js.map +1 -1
- package/dist/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/RecordGrids.js +3 -0
- package/dist/components/Grid/core/components/Save/components/ChangeEditor/components/RecordGrids/RecordGrids.js.map +1 -1
- package/dist/components/Grid/core/constants.d.ts +1 -0
- package/dist/components/Grid/core/constants.js +4 -0
- package/dist/components/Grid/core/constants.js.map +1 -0
- package/dist/components/Grid/core/controllers/useGridController.d.ts +0 -2
- package/dist/components/Grid/core/controllers/useGridController.js +1 -17
- package/dist/components/Grid/core/controllers/useGridController.js.map +1 -1
- package/dist/components/Grid/core/model/Grid.d.ts +10 -3
- package/dist/components/Grid/core/model/Grid.js +45 -16
- package/dist/components/Grid/core/model/Grid.js.map +1 -1
- package/dist/components/Grid/core/services/KeyListener.d.ts +8 -0
- package/dist/components/Grid/core/services/KeyListener.js +22 -0
- package/dist/components/Grid/core/services/KeyListener.js.map +1 -0
- package/dist/components/Grid/core/services/RecordUpdateService/model/RecordUpdateService.js +2 -2
- package/dist/components/Grid/core/services/RecordUpdateService/model/RecordUpdateService.js.map +1 -1
- package/dist/components/Grid/filtering/controller/useColumnFilterConditionController.js.map +1 -1
- package/dist/components/Grid/interfaces.d.ts +2 -2
- package/dist/components/Grid/paging/components/Paging/Paging.js +7 -1
- package/dist/components/Grid/paging/components/Paging/Paging.js.map +1 -1
- package/dist/components/Grid/paging/controllers/usePagingController.d.ts +2 -1
- package/dist/components/Grid/paging/controllers/usePagingController.js +1 -0
- package/dist/components/Grid/paging/controllers/usePagingController.js.map +1 -1
- package/dist/components/Grid/paging/model/Paging.d.ts +2 -1
- package/dist/components/Grid/paging/model/Paging.js +22 -4
- package/dist/components/Grid/paging/model/Paging.js.map +1 -1
- package/dist/components/Grid/selection/controllers/useSelectionController.js +7 -3
- package/dist/components/Grid/selection/controllers/useSelectionController.js.map +1 -1
- package/dist/components/Grid/selection/model/Selection.d.ts +1 -1
- package/dist/components/Grid/selection/model/Selection.js +7 -4
- package/dist/components/Grid/selection/model/Selection.js.map +1 -1
- package/dist/components/Grid/sorting/Sorting.js +2 -3
- package/dist/components/Grid/sorting/Sorting.js.map +1 -1
- package/dist/components/Grid/translations.d.ts +4 -0
- package/dist/components/Grid/translations.js +2 -1
- package/dist/components/Grid/translations.js.map +1 -1
- package/dist/index.d.ts +24 -7
- package/dist/index.js +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/components/Grid/core/hooks/useRerender.js +0 -13
- package/dist/components/Grid/core/hooks/useRerender.js.map +0 -1
- package/dist/utils/Numeral.d.ts +0 -6
- package/dist/utils/Numeral.js +0 -64
- package/dist/utils/Numeral.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
# Running
|
|
1
|
+
# Running locally build package in PCF
|
|
2
2
|
|
|
3
3
|
1. Run `npm install` inside the root directory.
|
|
4
|
-
1.
|
|
5
|
-
1.
|
|
6
|
-
1.
|
|
4
|
+
1. Run `npm run build`.
|
|
5
|
+
1. Run `pnpm link --global`
|
|
6
|
+
1. Navigate to the PCF root directory
|
|
7
|
+
1. Run `pnpm link --global @talxis/base-controls`
|
|
8
|
+
1. Run `npm start watch`.
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
If you make any changes in the package and re-build it with `npm run build`, it will automatically re-build the PCF and show your changes.
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
# Running locally build package in Portal
|
|
13
|
+
|
|
14
|
+
1. Run `npm install` inside the root directory.
|
|
12
15
|
1. Run `npm run build`.
|
|
13
16
|
1. Run `npm link`.
|
|
14
|
-
1.
|
|
17
|
+
1. Navigate to the `Portal.Web.Frontend` directory.
|
|
15
18
|
1. Add the following prop in the `vite.config.mts` file under `defineConfig`:
|
|
16
19
|
|
|
17
20
|
```typescript
|
|
@@ -19,14 +22,20 @@ optimizeDeps: {
|
|
|
19
22
|
exclude: ['@talxis/base-controls']
|
|
20
23
|
}
|
|
21
24
|
```
|
|
22
|
-
7. Delete `node_modules`
|
|
23
25
|
8. Run `npm install`
|
|
24
26
|
9. Run `npm link @talxis/base-controls`
|
|
25
27
|
10. Run `npm start`
|
|
26
28
|
|
|
27
|
-
These steps only need to be done once. If you want to see any future changes you made in
|
|
29
|
+
These steps only need to be done once. If you want to see any future changes you made in the package, you need to run `npm run build` in package root directory and Portal will automatically reload with your changes applied.
|
|
28
30
|
|
|
29
31
|
**Don't forget to revert the `vite.config.mts` file to the original version before pushing any changes to the Portal repo!**
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
## Troubleshooting
|
|
34
|
+
|
|
35
|
+
If your PCF/Portal builds, but you get an `Hooks can only be called inside of the body of a function component` error during runtime, you need to link the version of React from your PCF/Portal to the package:
|
|
36
|
+
|
|
37
|
+
1. Navigate to the root directory.
|
|
38
|
+
2. Run `npm` link `<path-to-react> <path-to-react-dom>`
|
|
39
|
+
|
|
40
|
+
Easiest way to do this is drag the `react` and `react-dom` folders from your PCF/Portal `node_modules` folder into the terminal window where you write the `npm link` command.
|
|
32
41
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useRef, useMemo } from 'react';
|
|
3
|
+
import { ThemeProvider } from '@fluentui/react';
|
|
4
|
+
import { TextField } from '@talxis/react-components';
|
|
5
|
+
import { datasetControlTranslations } from './translations.js';
|
|
6
|
+
import { getDatasetControlStyles } from './styles.js';
|
|
7
|
+
import { useRerender } from './hooks/useRerender.js';
|
|
8
|
+
import { Grid } from '../Grid/Grid.js';
|
|
9
|
+
import { useControl } from '../../hooks/useControl.js';
|
|
10
|
+
|
|
11
|
+
const DatasetControl = (props) => {
|
|
12
|
+
const { labels, theme } = useControl('DatasetControl', props, datasetControlTranslations);
|
|
13
|
+
const [query, setQuery] = useState("");
|
|
14
|
+
const rerender = useRerender();
|
|
15
|
+
const dataset = props.parameters.Grid;
|
|
16
|
+
const injectedContextRef = useRef(props.context);
|
|
17
|
+
const styles = useMemo(() => getDatasetControlStyles(), []);
|
|
18
|
+
const onOverrideComponentProps = props.onOverrideComponentProps ?? ((props) => props);
|
|
19
|
+
//@ts-ignore - need to edit the types
|
|
20
|
+
dataset._setRenderer(() => rerender());
|
|
21
|
+
//we need to have a way to customize the init behavior from above
|
|
22
|
+
const componentProps = onOverrideComponentProps({
|
|
23
|
+
onDatasetInit: () => dataset.refresh()
|
|
24
|
+
});
|
|
25
|
+
useMemo(() => {
|
|
26
|
+
//@ts-ignore - need to edit the types
|
|
27
|
+
injectedContextRef.current = dataset.injectContext(props.context);
|
|
28
|
+
}, [props.context]);
|
|
29
|
+
useMemo(() => {
|
|
30
|
+
componentProps.onDatasetInit();
|
|
31
|
+
}, []);
|
|
32
|
+
const onSearch = (query) => {
|
|
33
|
+
//@ts-ignore - need to edit the types
|
|
34
|
+
dataset.setSearchQuery(query);
|
|
35
|
+
dataset.refresh();
|
|
36
|
+
};
|
|
37
|
+
return (jsxs(ThemeProvider, { theme: theme, applyTo: "none", className: styles.root, children: [props.parameters.EnableQuickFind?.raw &&
|
|
38
|
+
jsx(TextField, { className: styles.quickFind, value: query,
|
|
39
|
+
//@ts-ignore - displaycollectionanem is string
|
|
40
|
+
placeholder: `${labels.search()} ${dataset.getMetadata()?.DisplayCollectionName ?? labels.records()}...`, deleteButtonProps: query ? {
|
|
41
|
+
key: 'delete',
|
|
42
|
+
iconProps: {
|
|
43
|
+
iconName: 'Cancel'
|
|
44
|
+
},
|
|
45
|
+
onClick: () => {
|
|
46
|
+
setQuery("");
|
|
47
|
+
onSearch(undefined);
|
|
48
|
+
}
|
|
49
|
+
} : undefined, suffixItems: [{
|
|
50
|
+
key: 'search',
|
|
51
|
+
iconProps: {
|
|
52
|
+
iconName: 'Search'
|
|
53
|
+
},
|
|
54
|
+
onClick: () => onSearch(query)
|
|
55
|
+
}], onKeyUp: (e) => {
|
|
56
|
+
if (e.key === 'Enter') {
|
|
57
|
+
onSearch(query);
|
|
58
|
+
}
|
|
59
|
+
}, onChange: (e, newValue) => setQuery(newValue) }), jsx(Grid, { ...props, context: injectedContextRef.current })] }));
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export { DatasetControl };
|
|
63
|
+
//# sourceMappingURL=DatasetControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatasetControl.js","sources":["../../../src/components/DatasetControl/DatasetControl.tsx"],"sourcesContent":["import { useMemo, useRef, useState } from \"react\";\nimport { Grid } from \"../Grid\";\nimport { useControl } from \"../../hooks\";\nimport { ThemeProvider } from \"@fluentui/react\";\nimport { TextField } from \"@talxis/react-components\";\nimport { datasetControlTranslations } from \"./translations\";\nimport { getDatasetControlStyles } from \"./styles\";\nimport { IDatasetControl } from \"./interfaces\";\nimport { useRerender } from \"./hooks/useRerender\";\n\nexport const DatasetControl = (props: IDatasetControl) => {\n const { labels, theme } = useControl('DatasetControl', props, datasetControlTranslations);\n const [query, setQuery] = useState<string | undefined>(\"\");\n const rerender = useRerender();\n const dataset = props.parameters.Grid;\n const injectedContextRef = useRef(props.context);\n const styles = useMemo(() => getDatasetControlStyles(), []);\n const onOverrideComponentProps = props.onOverrideComponentProps ?? ((props) => props);\n //@ts-ignore - need to edit the types\n dataset._setRenderer(() => rerender());\n\n //we need to have a way to customize the init behavior from above\n const componentProps = onOverrideComponentProps({\n onDatasetInit: () => dataset.refresh()\n })\n\n useMemo(() => {\n //@ts-ignore - need to edit the types\n injectedContextRef.current = dataset.injectContext(props.context);\n }, [props.context]);\n\n useMemo(() => {\n componentProps.onDatasetInit();\n }, []);\n\n const onSearch = (query?: string) => {\n //@ts-ignore - need to edit the types\n dataset.setSearchQuery(query);\n dataset.refresh();\n }\n\n return (\n <ThemeProvider theme={theme} applyTo=\"none\" className={styles.root}>\n {props.parameters.EnableQuickFind?.raw &&\n <TextField\n className={styles.quickFind}\n value={query}\n //@ts-ignore - displaycollectionanem is string\n placeholder={`${labels.search()} ${dataset.getMetadata()?.DisplayCollectionName ?? labels.records()}...`}\n deleteButtonProps={query ? {\n key: 'delete',\n iconProps: {\n iconName: 'Cancel'\n },\n onClick: () => {\n setQuery(\"\");\n onSearch(undefined);\n }\n } : undefined}\n suffixItems={[{\n key: 'search',\n iconProps: {\n iconName: 'Search'\n },\n onClick: () => onSearch(query)\n }]}\n onKeyUp={(e) => {\n if (e.key === 'Enter') {\n onSearch(query);\n }\n }}\n onChange={(e, newValue) => setQuery(newValue)} />\n }\n <Grid {...props} context={injectedContextRef.current} />\n </ThemeProvider>\n )\n}"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useRerender: () => () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRerender.js","sources":["../../../../src/components/DatasetControl/hooks/useRerender.ts"],"sourcesContent":["import { useState } from \"react\"\n\nexport const useRerender = () => {\n const [_, toggle] = useState<boolean>(false);\n\n return () => toggle(!_);\n}"],"names":[],"mappings":";;AAEO,MAAM,WAAW,GAAG,MAAK;IAC5B,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAE7C,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ITranslation } from "../../hooks";
|
|
2
|
+
import { IControl, ITwoOptionsProperty } from "../../interfaces";
|
|
3
|
+
import { IGridOutputs, IGridParameters } from "../Grid";
|
|
4
|
+
import { gridTranslations } from "../Grid/translations";
|
|
5
|
+
import { datasetControlTranslations } from "./translations";
|
|
6
|
+
export interface IDatasetControl extends IControl<IGridParameters, IGridOutputs, Partial<ITranslation<typeof datasetControlTranslations & typeof gridTranslations>>, any & {
|
|
7
|
+
onDatasetInit: () => void;
|
|
8
|
+
}> {
|
|
9
|
+
EnableQuickFind?: Omit<ITwoOptionsProperty, 'attributes'>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { mergeStyleSets } from '@fluentui/react';
|
|
2
|
+
|
|
3
|
+
const getDatasetControlStyles = () => {
|
|
4
|
+
return mergeStyleSets({
|
|
5
|
+
root: {
|
|
6
|
+
display: 'flex',
|
|
7
|
+
flexDirection: 'column',
|
|
8
|
+
gap: 15
|
|
9
|
+
},
|
|
10
|
+
quickFind: {
|
|
11
|
+
//alignSelf: 'flex-end'
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { getDatasetControlStyles };
|
|
17
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sources":["../../../src/components/DatasetControl/styles.ts"],"sourcesContent":["import { mergeStyleSets } from \"@fluentui/react\"\n\nexport const getDatasetControlStyles = () => {\n return mergeStyleSets({\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 15\n },\n quickFind: {\n //alignSelf: 'flex-end'\n }\n });\n}"],"names":[],"mappings":";;AAEO,MAAM,uBAAuB,GAAG,MAAK;AACxC,IAAA,OAAO,cAAc,CAAC;AAClB,QAAA,IAAI,EAAE;AACF,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,aAAa,EAAE,QAAQ;AACvB,YAAA,GAAG,EAAE,EAAE;AACV,SAAA;AACD,QAAA,SAAS,EAAE;;AAEV,SAAA;AACJ,KAAA,CAAC,CAAC;AACP;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translations.js","sources":["../../../src/components/DatasetControl/translations.ts"],"sourcesContent":["export const datasetControlTranslations = {\n \"search\": { 1029: \"Vyhledat\", 1033: \"Search\" },\n \"records\": { 1029: \"záznamy\", 1033: \"records\" }\n};\n \n"],"names":[],"mappings":"AAAa,MAAA,0BAA0B,GAAG;IACtC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;;;;;"}
|
|
@@ -3,10 +3,10 @@ import { TextField } from '@talxis/react-components';
|
|
|
3
3
|
import { useInputBasedControl } from '../../hooks/useInputBasedControl.js';
|
|
4
4
|
import { useRef, useEffect, useMemo } from 'react';
|
|
5
5
|
import numeral from 'numeral';
|
|
6
|
-
import { Numeral } from '../../utils/Numeral.js';
|
|
7
6
|
import { CURRENCY_POSITIVE_PATTERN, CURRENCY_NEGATIVE_PATTERN, NUMBER_NEGATIVE_PATTERN } from '../../constants.js';
|
|
8
7
|
import { ThemeProvider } from '@fluentui/react';
|
|
9
8
|
import { ArrowButtons } from './components/ArrowButtons.js';
|
|
9
|
+
import { Numeral } from '@talxis/client-libraries';
|
|
10
10
|
|
|
11
11
|
const Decimal = (props) => {
|
|
12
12
|
const arrowButtonsRef = useRef(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Decimal.js","sources":["../../../src/components/Decimal/Decimal.tsx"],"sourcesContent":["import { TextField } from \"@talxis/react-components\";\nimport { useInputBasedControl } from \"../../hooks/useInputBasedControl\";\nimport { IDecimal, IDecimalOutputs, IDecimalParameters } from \"./interfaces\";\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport numeral from \"numeral\";\nimport { Numeral } from \"../../utils/Numeral\";\nimport { CURRENCY_NEGATIVE_PATTERN, CURRENCY_POSITIVE_PATTERN, NUMBER_NEGATIVE_PATTERN } from \"../../constants\";\nimport { ICommandBarItemProps, ThemeProvider } from \"@fluentui/react\";\nimport { ArrowButtons, IArrowButtons } from \"./components/ArrowButtons\";\n\nexport const Decimal = (props: IDecimal) => {\n const arrowButtonsRef = useRef<IArrowButtons>(null);\n const context = props.context;\n const parameters = props.parameters;\n const boundValue = parameters.value;\n const numberFormatting = context.userSettings.numberFormattingInfo;\n const onOverrideComponentProps = props.onOverrideComponentProps ?? ((props) => props);\n\n const formatter = (value: string | number | null): string | undefined | null => {\n if (typeof value === 'number') {\n if (props.parameters.value.type === 'Decimal') {\n return context.formatting.formatDecimal(value, boundValue.attributes?.Precision);\n }\n if (props.parameters.value.type === 'Currency') {\n //the layer above has information about the symbol, so we can use the formatted string\n if (props.parameters.value.formatted) {\n return props.parameters.value.formatted;\n }\n return context.formatting.formatCurrency(value, boundValue.attributes?.Precision);\n }\n return context.formatting.formatInteger(value);\n }\n return value;\n };\n\n const createNumberPattern = (pattern: string, numberPattern: string) => {\n return new RegExp(`^${escapeRegExp(pattern).replace('n', numberPattern)}$`.replace(/\\s/g, ''));\n };\n\n const createCurrencyPattern = (pattern: string, numberPattern: string) => {\n const escapedPattern = escapeRegExp(pattern);\n const escapedCurrencySymbolPattern = `(${escapeRegExp(numberFormatting.currencySymbol)})?`;\n const finalPattern = escapedPattern.replace('\\\\$', escapedCurrencySymbolPattern).replace('n', numberPattern);\n return new RegExp(`^${finalPattern.replace(/\\s/g, '')}$`);\n };\n\n const escapeRegExp = (string: string) => {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n\n const extractNumericPart = (value: any): number | undefined => {\n // Currency control just sends the string up and lets the framework decide whether the value is correct\n // It only tries to parse the number based on the current user format\n // This means that the value will also pass if the user inputs his own currency even though\n // the currency is different on the field\n if (typeof value === 'number') {\n return value\n }\n const str = value?.replace(/\\s/g, '');\n Numeral.decimal(numberFormatting);\n let positivePattern: any;\n let negativePattern: any;\n\n switch (props.parameters.value.type) {\n case 'Whole.None': {\n const numberPattern = `\\\\d{1,}(${numberFormatting.numberGroupSeparator}\\\\d{1,})*`;\n positivePattern = createNumberPattern('n', numberPattern);\n negativePattern = createNumberPattern(NUMBER_NEGATIVE_PATTERN[numberFormatting.numberNegativePattern], numberPattern);\n break;\n }\n case 'Decimal': {\n const numberPattern = `\\\\d{1,}(${numberFormatting.numberGroupSeparator}\\\\d{1,})*(\\\\${numberFormatting.numberDecimalSeparator}\\\\d+)?`;\n positivePattern = createNumberPattern('n', numberPattern);\n negativePattern = createNumberPattern(NUMBER_NEGATIVE_PATTERN[numberFormatting.numberNegativePattern], numberPattern);\n break;\n }\n case 'Currency': {\n Numeral.currency(numberFormatting);\n const numberPattern = `\\\\d{1,}(${numberFormatting.currencyGroupSeparator}\\\\d{1,})*(\\\\${numberFormatting.currencyDecimalSeparator}\\\\d+)?`;\n positivePattern = createCurrencyPattern(CURRENCY_POSITIVE_PATTERN[numberFormatting.currencyPositivePattern], numberPattern);\n negativePattern = createCurrencyPattern(CURRENCY_NEGATIVE_PATTERN[numberFormatting.currencyNegativePattern], numberPattern);\n break;\n }\n }\n if (positivePattern.test(str)) {\n return numeral(str).value() ?? undefined;\n }\n if (negativePattern.test(str)) {\n const value = numeral(str).value()!;\n if (value > 0) {\n return value * -1;\n }\n return value;\n }\n return value;\n };\n\n const { value, sizing, theme, setValue, onNotifyOutputChanged } = useInputBasedControl<string | undefined, IDecimalParameters, IDecimalOutputs, any>('Decimal', props, {\n formatter: formatter,\n valueExtractor: extractNumericPart\n });\n\n const getSuffixItems = (): ICommandBarItemProps[] | undefined => {\n if (context.mode.isControlDisabled || !parameters.EnableSpinButton?.raw) {\n return undefined;\n }\n return [\n {\n key: 'arrows',\n onRender: () => <ArrowButtons\n ref={arrowButtonsRef}\n onDecrement={() => makeStep('decrement')}\n onIncrement={() => makeStep('increment')} />\n }\n ]\n }\n\n const makeStep = (type: 'increment' | 'decrement') => {\n const value = boundValue.raw ?? 0;\n if (typeof value !== 'number') {\n return;\n }\n const precision = Math.pow(10, boundValue.attributes?.Precision ?? 0);\n const adjustment = type === 'increment' ? 1 : -1;\n const newValue = parseFloat(((value) + adjustment / precision).toFixed(boundValue.attributes?.Precision ?? 0));\n onNotifyOutputChanged({ value: newValue });\n\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (context.mode.isControlDisabled) {\n return;\n }\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n makeStep('decrement');\n arrowButtonsRef.current?.setActiveBtn('down');\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n makeStep('increment');\n arrowButtonsRef.current?.setActiveBtn('up');\n break;\n }\n }\n }\n\n const getInputMode = () => {\n switch (props.parameters.value.type) {\n case 'Whole.None': {\n return 'numeric';\n }\n case 'Decimal':\n case 'Currency': {\n return 'decimal';\n }\n }\n }\n useEffect(() => {\n if (boundValue.type === 'Currency') {\n setValue(boundValue.formatted);\n }\n }, [boundValue.formatted]);\n\n const componentProps = onOverrideComponentProps({\n hideErrorMessage: !parameters.ShowErrorMessage?.raw,\n readOnly: context.mode.isControlDisabled,\n inputMode: useMemo(() => getInputMode(), [props.parameters.value.type]),\n suffixItems: getSuffixItems(),\n autoFocus: parameters.AutoFocus?.raw,\n errorMessage: boundValue.errorMessage,\n styles: {\n fieldGroup: {\n height: sizing.height,\n width: sizing.width\n }\n },\n deleteButtonProps: parameters.EnableDeleteButton?.raw === true\n ? {\n key: \"delete\",\n showOnlyOnHover: true,\n iconProps: {\n iconName: \"Cancel\",\n },\n onClick: () => setValue(undefined),\n }\n : undefined,\n clickToCopyProps: parameters.EnableCopyButton?.raw === true\n ? {\n key: \"copy\",\n showOnlyOnHover: true,\n iconProps: {\n iconName: \"Copy\",\n },\n }\n : undefined,\n value: value ?? \"\",\n onBlur: (event) => {\n onNotifyOutputChanged({\n value: extractNumericPart(event.target.value)\n });\n },\n onChange: (e, value) => {\n setValue(value);\n },\n onKeyDown: onKeyDown,\n });\n return (\n <ThemeProvider theme={theme} applyTo=\"none\">\n <TextField {...componentProps} />\n </ThemeProvider>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Decimal.js","sources":["../../../src/components/Decimal/Decimal.tsx"],"sourcesContent":["import { TextField } from \"@talxis/react-components\";\nimport { useInputBasedControl } from \"../../hooks/useInputBasedControl\";\nimport { IDecimal, IDecimalOutputs, IDecimalParameters } from \"./interfaces\";\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport numeral from \"numeral\";\nimport { CURRENCY_NEGATIVE_PATTERN, CURRENCY_POSITIVE_PATTERN, NUMBER_NEGATIVE_PATTERN } from \"../../constants\";\nimport { ICommandBarItemProps, ThemeProvider } from \"@fluentui/react\";\nimport { ArrowButtons, IArrowButtons } from \"./components/ArrowButtons\";\nimport { Numeral } from \"@talxis/client-libraries\";\n\nexport const Decimal = (props: IDecimal) => {\n const arrowButtonsRef = useRef<IArrowButtons>(null);\n const context = props.context;\n const parameters = props.parameters;\n const boundValue = parameters.value;\n const numberFormatting = context.userSettings.numberFormattingInfo;\n const onOverrideComponentProps = props.onOverrideComponentProps ?? ((props) => props);\n\n const formatter = (value: string | number | null): string | undefined | null => {\n if (typeof value === 'number') {\n if (props.parameters.value.type === 'Decimal') {\n return context.formatting.formatDecimal(value, boundValue.attributes?.Precision);\n }\n if (props.parameters.value.type === 'Currency') {\n //the layer above has information about the symbol, so we can use the formatted string\n if (props.parameters.value.formatted) {\n return props.parameters.value.formatted;\n }\n return context.formatting.formatCurrency(value, boundValue.attributes?.Precision);\n }\n return context.formatting.formatInteger(value);\n }\n return value;\n };\n\n const createNumberPattern = (pattern: string, numberPattern: string) => {\n return new RegExp(`^${escapeRegExp(pattern).replace('n', numberPattern)}$`.replace(/\\s/g, ''));\n };\n\n const createCurrencyPattern = (pattern: string, numberPattern: string) => {\n const escapedPattern = escapeRegExp(pattern);\n const escapedCurrencySymbolPattern = `(${escapeRegExp(numberFormatting.currencySymbol)})?`;\n const finalPattern = escapedPattern.replace('\\\\$', escapedCurrencySymbolPattern).replace('n', numberPattern);\n return new RegExp(`^${finalPattern.replace(/\\s/g, '')}$`);\n };\n\n const escapeRegExp = (string: string) => {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n\n const extractNumericPart = (value: any): number | undefined => {\n // Currency control just sends the string up and lets the framework decide whether the value is correct\n // It only tries to parse the number based on the current user format\n // This means that the value will also pass if the user inputs his own currency even though\n // the currency is different on the field\n if (typeof value === 'number') {\n return value\n }\n const str = value?.replace(/\\s/g, '');\n Numeral.decimal(numberFormatting);\n let positivePattern: any;\n let negativePattern: any;\n\n switch (props.parameters.value.type) {\n case 'Whole.None': {\n const numberPattern = `\\\\d{1,}(${numberFormatting.numberGroupSeparator}\\\\d{1,})*`;\n positivePattern = createNumberPattern('n', numberPattern);\n negativePattern = createNumberPattern(NUMBER_NEGATIVE_PATTERN[numberFormatting.numberNegativePattern], numberPattern);\n break;\n }\n case 'Decimal': {\n const numberPattern = `\\\\d{1,}(${numberFormatting.numberGroupSeparator}\\\\d{1,})*(\\\\${numberFormatting.numberDecimalSeparator}\\\\d+)?`;\n positivePattern = createNumberPattern('n', numberPattern);\n negativePattern = createNumberPattern(NUMBER_NEGATIVE_PATTERN[numberFormatting.numberNegativePattern], numberPattern);\n break;\n }\n case 'Currency': {\n Numeral.currency(numberFormatting);\n const numberPattern = `\\\\d{1,}(${numberFormatting.currencyGroupSeparator}\\\\d{1,})*(\\\\${numberFormatting.currencyDecimalSeparator}\\\\d+)?`;\n positivePattern = createCurrencyPattern(CURRENCY_POSITIVE_PATTERN[numberFormatting.currencyPositivePattern], numberPattern);\n negativePattern = createCurrencyPattern(CURRENCY_NEGATIVE_PATTERN[numberFormatting.currencyNegativePattern], numberPattern);\n break;\n }\n }\n if (positivePattern.test(str)) {\n return numeral(str).value() ?? undefined;\n }\n if (negativePattern.test(str)) {\n const value = numeral(str).value()!;\n if (value > 0) {\n return value * -1;\n }\n return value;\n }\n return value;\n };\n\n const { value, sizing, theme, setValue, onNotifyOutputChanged } = useInputBasedControl<string | undefined, IDecimalParameters, IDecimalOutputs, any>('Decimal', props, {\n formatter: formatter,\n valueExtractor: extractNumericPart\n });\n\n const getSuffixItems = (): ICommandBarItemProps[] | undefined => {\n if (context.mode.isControlDisabled || !parameters.EnableSpinButton?.raw) {\n return undefined;\n }\n return [\n {\n key: 'arrows',\n onRender: () => <ArrowButtons\n ref={arrowButtonsRef}\n onDecrement={() => makeStep('decrement')}\n onIncrement={() => makeStep('increment')} />\n }\n ]\n }\n\n const makeStep = (type: 'increment' | 'decrement') => {\n const value = boundValue.raw ?? 0;\n if (typeof value !== 'number') {\n return;\n }\n const precision = Math.pow(10, boundValue.attributes?.Precision ?? 0);\n const adjustment = type === 'increment' ? 1 : -1;\n const newValue = parseFloat(((value) + adjustment / precision).toFixed(boundValue.attributes?.Precision ?? 0));\n onNotifyOutputChanged({ value: newValue });\n\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (context.mode.isControlDisabled) {\n return;\n }\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n makeStep('decrement');\n arrowButtonsRef.current?.setActiveBtn('down');\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n makeStep('increment');\n arrowButtonsRef.current?.setActiveBtn('up');\n break;\n }\n }\n }\n\n const getInputMode = () => {\n switch (props.parameters.value.type) {\n case 'Whole.None': {\n return 'numeric';\n }\n case 'Decimal':\n case 'Currency': {\n return 'decimal';\n }\n }\n }\n useEffect(() => {\n if (boundValue.type === 'Currency') {\n setValue(boundValue.formatted);\n }\n }, [boundValue.formatted]);\n\n const componentProps = onOverrideComponentProps({\n hideErrorMessage: !parameters.ShowErrorMessage?.raw,\n readOnly: context.mode.isControlDisabled,\n inputMode: useMemo(() => getInputMode(), [props.parameters.value.type]),\n suffixItems: getSuffixItems(),\n autoFocus: parameters.AutoFocus?.raw,\n errorMessage: boundValue.errorMessage,\n styles: {\n fieldGroup: {\n height: sizing.height,\n width: sizing.width\n }\n },\n deleteButtonProps: parameters.EnableDeleteButton?.raw === true\n ? {\n key: \"delete\",\n showOnlyOnHover: true,\n iconProps: {\n iconName: \"Cancel\",\n },\n onClick: () => setValue(undefined),\n }\n : undefined,\n clickToCopyProps: parameters.EnableCopyButton?.raw === true\n ? {\n key: \"copy\",\n showOnlyOnHover: true,\n iconProps: {\n iconName: \"Copy\",\n },\n }\n : undefined,\n value: value ?? \"\",\n onBlur: (event) => {\n onNotifyOutputChanged({\n value: extractNumericPart(event.target.value)\n });\n },\n onChange: (e, value) => {\n setValue(value);\n },\n onKeyDown: onKeyDown,\n });\n return (\n <ThemeProvider theme={theme} applyTo=\"none\">\n <TextField {...componentProps} />\n </ThemeProvider>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
|
|
@@ -4,10 +4,10 @@ import { useRef, useEffect } from 'react';
|
|
|
4
4
|
import { useInputBasedControl } from '../../hooks/useInputBasedControl.js';
|
|
5
5
|
import { ThemeProvider } from '@fluentui/react';
|
|
6
6
|
import numeral from 'numeral';
|
|
7
|
-
import { Numeral } from '../../utils/Numeral.js';
|
|
8
7
|
import { getDefaultDurationTranslations } from './translations.js';
|
|
9
8
|
import { durationOptions } from './durationOptions.js';
|
|
10
9
|
import humanizeDuration from 'humanize-duration';
|
|
10
|
+
import { Numeral } from '@talxis/client-libraries';
|
|
11
11
|
|
|
12
12
|
const Duration = (props) => {
|
|
13
13
|
const parameters = props.parameters;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Duration.js","sources":["../../../src/components/Duration/Duration.tsx"],"sourcesContent":["import { ComboBox } from \"@talxis/react-components\";\nimport React, { useEffect, useRef } from 'react';\nimport { useInputBasedControl } from '../../hooks/useInputBasedControl';\nimport { IDuration, IDurationOutputs, IDurationParameters } from './interfaces';\nimport { IComboBox, IComboBoxOption, ThemeProvider } from '@fluentui/react';\nimport numeral from \"numeral\";\nimport { Numeral } from '../../utils/Numeral';\nimport { getDefaultDurationTranslations } from './translations';\nimport { durationOptions } from \"./durationOptions\";\nimport humanizeDuration, { Unit } from \"humanize-duration\";\n\nexport const Duration = (props: IDuration) => {\n const parameters = props.parameters;\n const boundValue = parameters.value;\n const componentRef = useRef<IComboBox>(null);\n const context = props.context;\n const formattingInfo = context.userSettings;\n //@ts-ignore - locale is part of UserSettings\n const language = formattingInfo.locale;\n const numberFormatting = context.userSettings.numberFormattingInfo;\n\n const formatter = (value: number | null) => {\n //all duration formatting should happen here\n if (typeof value === 'number') {\n const durationInMilliseconds = value * 60000;\n const units: Unit[] = value < 60 ? ['m'] : value >= 1440 ? ['d'] : ['h'];\n const options = {\n units: units,\n maxDecimalPoints: 2,\n language: language.slice(0, language.indexOf(\"-\")),\n decimal: context.userSettings.numberFormattingInfo.numberDecimalSeparator,\n fallbacks: [\"en\"]\n };\n return humanizeDuration(durationInMilliseconds, options);\n }\n return value;\n };\n\n const valueExtractor = (str: string | null): number | undefined | string => {\n //extraction of number of minutes from formatted string should happen here\n // parsing because labels are string that represent array of strings\n const minuteLabels = JSON.parse(labels.minute());\n const minutesLabels = JSON.parse(labels.minutes());\n const hourLabels = JSON.parse(labels.hour());\n const hoursLabels = JSON.parse(labels.hours());\n const dayLabels = JSON.parse(labels.day());\n const daysLabels = JSON.parse(labels.days());\n const minuteRegex = new RegExp(\"^(\" + minuteLabels.join('|') + \")\\\\s|\\\\s(\" + minuteLabels.join('|') + \")$|^(\" + minutesLabels.join('|') + \")\\\\s|\\\\s(\" + minutesLabels.join('|') + \")$\", \"i\");\n const hourRegex = new RegExp(\"^(\" + hourLabels.join('|') + \")\\\\s|\\\\s(\" + hourLabels.join('|') + \")$|^(\" + hoursLabels.join('|') + \")\\\\s|\\\\s(\" + hoursLabels.join('|') + \")$\", \"i\");\n const dayRegex = new RegExp(\"^(\" + dayLabels.join('|') + \")\\\\s|\\\\s(\" + dayLabels.join('|') + \")$|^(\" + daysLabels.join('|') + \")\\\\s|\\\\s(\" + daysLabels.join('|') + \")$\", \"i\");\n\n if (str && str.trim()) {\n let input = str.trim().toLowerCase();\n let unit = 'minute';\n\n if (minuteRegex.test(input)) {\n input = input.replace(minuteRegex, \"\").trim();\n } else if (hourRegex.test(input)) {\n input = input.replace(hourRegex, \"\").trim();\n unit = 'hour';\n } else if (dayRegex.test(input)) {\n input = input.replace(dayRegex, \"\").trim();\n unit = 'day';\n }\n const parsedNumber = parseNumber(input);\n if (parsedNumber && !isNaN(parsedNumber)) {\n return getDurationInMinutes(parsedNumber, unit);\n }\n return str;\n }\n return undefined;\n };\n\n const parseNumber = (input: string): number | undefined => {\n Numeral.decimal(numberFormatting);\n return numeral(input).value() ?? undefined;\n };\n\n const getDurationInMinutes = (value: number, unit: string): number => {\n switch (unit) {\n case 'hour':\n return 60 * value;\n case 'day':\n return 60 * value * 24;\n case 'minute':\n default:\n return value;\n }\n };\n\n const presetOptions = (): IComboBoxOption[] => {\n const formattedOptions = durationOptions.map(option => ({\n key: option.Value.toString(),\n text: formatter(parseInt(option.Label)) ?? \"\",\n }));\n return formattedOptions;\n };\n\n const comboBoxOptions: IComboBoxOption[] = presetOptions();\n\n const { value, labels, sizing, setValue, onNotifyOutputChanged, theme } = useInputBasedControl<string | null, IDurationParameters, IDurationOutputs, Required<IDuration>['translations']>('Duration', props, {\n formatter: formatter,\n valueExtractor: valueExtractor,\n defaultTranslations: getDefaultDurationTranslations(),\n });\n\n useEffect(() => {\n if (parameters.AutoFocus?.raw) {\n componentRef.current?.focus(true);\n }\n }, []);\n\n return (\n <ThemeProvider theme={theme} applyTo=\"none\">\n <ComboBox\n componentRef={componentRef}\n options={comboBoxOptions}\n hideErrorMessage={!parameters.ShowErrorMessage?.raw}\n allowFreeInput={true}\n autoComplete='on'\n autofill={parameters.AutoFocus?.raw === true ? {\n autoFocus: true\n } : undefined}\n readOnly={context.mode.isControlDisabled}\n useComboBoxAsMenuWidth\n errorMessage={boundValue.errorMessage}\n text={value ?? ''}\n styles={{\n root: {\n height: sizing.height,\n width: sizing.width,\n display: 'flex',\n alignItems: 'center',\n },\n callout: {\n height: 300\n }\n }}\n onInputValueChange={(text) => {\n setValue(text ?? '');\n }}\n onBlur={(event) => {\n onNotifyOutputChanged({\n //any is needed here because we can return string in case of error values\n value: valueExtractor(value) as any\n });\n }}\n onChange={(e, value) => {\n onNotifyOutputChanged({\n //any is needed here because we can return string in case of error values\n value: valueExtractor(value?.text ?? '') as any\n });\n }}\n />\n </ThemeProvider>\n );\n};"],"names":["_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Duration.js","sources":["../../../src/components/Duration/Duration.tsx"],"sourcesContent":["import { ComboBox } from \"@talxis/react-components\";\nimport React, { useEffect, useRef } from 'react';\nimport { useInputBasedControl } from '../../hooks/useInputBasedControl';\nimport { IDuration, IDurationOutputs, IDurationParameters } from './interfaces';\nimport { IComboBox, IComboBoxOption, ThemeProvider } from '@fluentui/react';\nimport numeral from \"numeral\";\nimport { getDefaultDurationTranslations } from './translations';\nimport { durationOptions } from \"./durationOptions\";\nimport humanizeDuration, { Unit } from \"humanize-duration\";\nimport { Numeral } from \"@talxis/client-libraries\";\n\nexport const Duration = (props: IDuration) => {\n const parameters = props.parameters;\n const boundValue = parameters.value;\n const componentRef = useRef<IComboBox>(null);\n const context = props.context;\n const formattingInfo = context.userSettings;\n //@ts-ignore - locale is part of UserSettings\n const language = formattingInfo.locale;\n const numberFormatting = context.userSettings.numberFormattingInfo;\n\n const formatter = (value: number | null) => {\n //all duration formatting should happen here\n if (typeof value === 'number') {\n const durationInMilliseconds = value * 60000;\n const units: Unit[] = value < 60 ? ['m'] : value >= 1440 ? ['d'] : ['h'];\n const options = {\n units: units,\n maxDecimalPoints: 2,\n language: language.slice(0, language.indexOf(\"-\")),\n decimal: context.userSettings.numberFormattingInfo.numberDecimalSeparator,\n fallbacks: [\"en\"]\n };\n return humanizeDuration(durationInMilliseconds, options);\n }\n return value;\n };\n\n const valueExtractor = (str: string | null): number | undefined | string => {\n //extraction of number of minutes from formatted string should happen here\n // parsing because labels are string that represent array of strings\n const minuteLabels = JSON.parse(labels.minute());\n const minutesLabels = JSON.parse(labels.minutes());\n const hourLabels = JSON.parse(labels.hour());\n const hoursLabels = JSON.parse(labels.hours());\n const dayLabels = JSON.parse(labels.day());\n const daysLabels = JSON.parse(labels.days());\n const minuteRegex = new RegExp(\"^(\" + minuteLabels.join('|') + \")\\\\s|\\\\s(\" + minuteLabels.join('|') + \")$|^(\" + minutesLabels.join('|') + \")\\\\s|\\\\s(\" + minutesLabels.join('|') + \")$\", \"i\");\n const hourRegex = new RegExp(\"^(\" + hourLabels.join('|') + \")\\\\s|\\\\s(\" + hourLabels.join('|') + \")$|^(\" + hoursLabels.join('|') + \")\\\\s|\\\\s(\" + hoursLabels.join('|') + \")$\", \"i\");\n const dayRegex = new RegExp(\"^(\" + dayLabels.join('|') + \")\\\\s|\\\\s(\" + dayLabels.join('|') + \")$|^(\" + daysLabels.join('|') + \")\\\\s|\\\\s(\" + daysLabels.join('|') + \")$\", \"i\");\n\n if (str && str.trim()) {\n let input = str.trim().toLowerCase();\n let unit = 'minute';\n\n if (minuteRegex.test(input)) {\n input = input.replace(minuteRegex, \"\").trim();\n } else if (hourRegex.test(input)) {\n input = input.replace(hourRegex, \"\").trim();\n unit = 'hour';\n } else if (dayRegex.test(input)) {\n input = input.replace(dayRegex, \"\").trim();\n unit = 'day';\n }\n const parsedNumber = parseNumber(input);\n if (parsedNumber && !isNaN(parsedNumber)) {\n return getDurationInMinutes(parsedNumber, unit);\n }\n return str;\n }\n return undefined;\n };\n\n const parseNumber = (input: string): number | undefined => {\n Numeral.decimal(numberFormatting);\n return numeral(input).value() ?? undefined;\n };\n\n const getDurationInMinutes = (value: number, unit: string): number => {\n switch (unit) {\n case 'hour':\n return 60 * value;\n case 'day':\n return 60 * value * 24;\n case 'minute':\n default:\n return value;\n }\n };\n\n const presetOptions = (): IComboBoxOption[] => {\n const formattedOptions = durationOptions.map(option => ({\n key: option.Value.toString(),\n text: formatter(parseInt(option.Label)) ?? \"\",\n }));\n return formattedOptions;\n };\n\n const comboBoxOptions: IComboBoxOption[] = presetOptions();\n\n const { value, labels, sizing, setValue, onNotifyOutputChanged, theme } = useInputBasedControl<string | null, IDurationParameters, IDurationOutputs, Required<IDuration>['translations']>('Duration', props, {\n formatter: formatter,\n valueExtractor: valueExtractor,\n defaultTranslations: getDefaultDurationTranslations(),\n });\n\n useEffect(() => {\n if (parameters.AutoFocus?.raw) {\n componentRef.current?.focus(true);\n }\n }, []);\n\n return (\n <ThemeProvider theme={theme} applyTo=\"none\">\n <ComboBox\n componentRef={componentRef}\n options={comboBoxOptions}\n hideErrorMessage={!parameters.ShowErrorMessage?.raw}\n allowFreeInput={true}\n autoComplete='on'\n autofill={parameters.AutoFocus?.raw === true ? {\n autoFocus: true\n } : undefined}\n readOnly={context.mode.isControlDisabled}\n useComboBoxAsMenuWidth\n errorMessage={boundValue.errorMessage}\n text={value ?? ''}\n styles={{\n root: {\n height: sizing.height,\n width: sizing.width,\n display: 'flex',\n alignItems: 'center',\n },\n callout: {\n height: 300\n }\n }}\n onInputValueChange={(text) => {\n setValue(text ?? '');\n }}\n onBlur={(event) => {\n onNotifyOutputChanged({\n //any is needed here because we can return string in case of error values\n value: valueExtractor(value) as any\n });\n }}\n onChange={(e, value) => {\n onNotifyOutputChanged({\n //any is needed here because we can return string in case of error values\n value: valueExtractor(value?.text ?? '') as any\n });\n }}\n />\n </ThemeProvider>\n );\n};"],"names":["_jsx"],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useMemo } from 'react';
|
|
2
|
+
import { useMemo, useEffect } from 'react';
|
|
3
3
|
import { Grid as Grid$1 } from './core/model/Grid.js';
|
|
4
4
|
import { AgGrid } from './core/components/AgGrid/AgGrid.js';
|
|
5
5
|
import { gridTranslations } from './translations.js';
|
|
6
6
|
import { GridContext } from './GridContext.js';
|
|
7
7
|
import { mergeStyleSets, ThemeProvider } from '@fluentui/react';
|
|
8
|
+
import { KeyHoldListener } from './core/services/KeyListener.js';
|
|
8
9
|
import { useControlTheme } from '../../hooks/useControlTheme.js';
|
|
9
10
|
import { useControl } from '../../hooks/useControl.js';
|
|
10
11
|
|
|
@@ -16,13 +17,19 @@ const styles = mergeStyleSets({
|
|
|
16
17
|
});
|
|
17
18
|
const Grid = (props) => {
|
|
18
19
|
const { labels } = useControl('Grid', props, gridTranslations);
|
|
20
|
+
const keyHoldListener = useMemo(() => new KeyHoldListener(), []);
|
|
19
21
|
const providerValue = useMemo(() => {
|
|
20
22
|
return {
|
|
21
|
-
gridInstance: new Grid$1(props, labels)
|
|
23
|
+
gridInstance: new Grid$1(props, labels, keyHoldListener)
|
|
22
24
|
};
|
|
23
25
|
}, []);
|
|
24
26
|
providerValue.gridInstance.updateDependencies(props);
|
|
25
27
|
const theme = useControlTheme(props.context.fluentDesignLanguage);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
return () => {
|
|
30
|
+
keyHoldListener.destroy();
|
|
31
|
+
};
|
|
32
|
+
}, []);
|
|
26
33
|
return (jsx(GridContext.Provider, { value: providerValue, children: jsx(ThemeProvider, { className: `talxis__gridControl ${styles.root}`, theme: theme, applyTo: 'none', children: jsx(AgGrid, {}) }) }));
|
|
27
34
|
};
|
|
28
35
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Grid.js","sources":["../../../src/components/Grid/Grid.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useControl, useControlTheme } from \"../../hooks\"\nimport { IGridContext } from \"./core/interfaces/IGridContext\";\nimport { Grid as GridModel } from \"./core/model/Grid\";\nimport { IGrid } from \"./interfaces\";\nimport { AgGrid } from './core/components/AgGrid/AgGrid';\nimport React from 'react';\nimport { gridTranslations } from './translations';\nimport { GridContext } from \"./GridContext\";\nimport { mergeStyleSets, ThemeProvider } from \"@fluentui/react\";\n\nconst styles = mergeStyleSets({\n root: {\n displayName: 'talxis__gridControl',\n height: '100%'\n }\n});\n\nexport const Grid = (props: IGrid) => {\n const { labels } = useControl('Grid', props, gridTranslations);\n const providerValue: IGridContext = useMemo(() => {\n return {\n gridInstance: new GridModel(props, labels)\n }\n }, [])\n providerValue.gridInstance.updateDependencies(props);\n const theme = useControlTheme(props.context.fluentDesignLanguage);\n return (\n <GridContext.Provider value={providerValue}>\n <ThemeProvider className={`talxis__gridControl ${styles.root}`} theme={theme} applyTo='none'>\n <AgGrid />\n </ThemeProvider>\n </GridContext.Provider>\n )\n}"],"names":["GridModel","_jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Grid.js","sources":["../../../src/components/Grid/Grid.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport { useControl, useControlTheme } from \"../../hooks\"\nimport { IGridContext } from \"./core/interfaces/IGridContext\";\nimport { Grid as GridModel } from \"./core/model/Grid\";\nimport { IGrid } from \"./interfaces\";\nimport { AgGrid } from './core/components/AgGrid/AgGrid';\nimport React from 'react';\nimport { gridTranslations } from './translations';\nimport { GridContext } from \"./GridContext\";\nimport { mergeStyleSets, ThemeProvider } from \"@fluentui/react\";\nimport { KeyHoldListener } from \"./core/services/KeyListener\";\n\nconst styles = mergeStyleSets({\n root: {\n displayName: 'talxis__gridControl',\n height: '100%'\n }\n});\n\nexport const Grid = (props: IGrid) => {\n const { labels } = useControl('Grid', props, gridTranslations);\n const keyHoldListener = useMemo(() => new KeyHoldListener(), []);\n const providerValue: IGridContext = useMemo(() => {\n return {\n gridInstance: new GridModel(props, labels, keyHoldListener)\n }\n }, [])\n providerValue.gridInstance.updateDependencies(props);\n const theme = useControlTheme(props.context.fluentDesignLanguage);\n\n useEffect(() => {\n return () => {\n keyHoldListener.destroy();\n }\n }, []);\n return (\n <GridContext.Provider value={providerValue}>\n <ThemeProvider className={`talxis__gridControl ${styles.root}`} theme={theme} applyTo='none'>\n <AgGrid />\n </ThemeProvider>\n </GridContext.Provider>\n )\n}"],"names":["GridModel","_jsx"],"mappings":";;;;;;;;;;;AAYA,MAAM,MAAM,GAAG,cAAc,CAAC;AAC1B,IAAA,IAAI,EAAE;AACF,QAAA,WAAW,EAAE,qBAAqB;AAClC,QAAA,MAAM,EAAE,MAAM;AACjB,KAAA;AACJ,CAAA,CAAC,CAAC;AAEU,MAAA,IAAI,GAAG,CAAC,KAAY,KAAI;AACjC,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAC/D,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,IAAI,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;AACjE,IAAA,MAAM,aAAa,GAAiB,OAAO,CAAC,MAAK;QAC7C,OAAO;YACH,YAAY,EAAE,IAAIA,MAAS,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC;SAC9D,CAAA;KACJ,EAAE,EAAE,CAAC,CAAA;AACN,IAAA,aAAa,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAElE,SAAS,CAAC,MAAK;AACX,QAAA,OAAO,MAAK;YACR,eAAe,CAAC,OAAO,EAAE,CAAC;AAC9B,SAAC,CAAA;KACJ,EAAE,EAAE,CAAC,CAAC;AACP,IAAA,QACIC,GAAA,CAAC,WAAW,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,aAAa,YACtCA,GAAC,CAAA,aAAa,EAAC,EAAA,SAAS,EAAE,CAAuB,oBAAA,EAAA,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAC,MAAM,EAAA,QAAA,EACxFA,IAAC,MAAM,EAAA,EAAA,CAAG,EACE,CAAA,EAAA,CACG,EAC1B;AACL;;;;"}
|
|
@@ -11,6 +11,7 @@ import { EmptyRecords } from './components/EmptyRecordsOverlay/EmptyRecords.js';
|
|
|
11
11
|
import { Save } from '../Save/Save.js';
|
|
12
12
|
import { LoadingOverlay } from './components/LoadingOverlay/LoadingOverlay.js';
|
|
13
13
|
import { usePagingController } from '../../../paging/controllers/usePagingController.js';
|
|
14
|
+
import { ROW_HEIGHT } from '../../constants.js';
|
|
14
15
|
|
|
15
16
|
const AgGrid = () => {
|
|
16
17
|
const grid = useGridInstance();
|
|
@@ -18,10 +19,10 @@ const AgGrid = () => {
|
|
|
18
19
|
const gridApiRef = useRef();
|
|
19
20
|
const containerRef = useRef(null);
|
|
20
21
|
const theme = useTheme();
|
|
21
|
-
let { agColumns,
|
|
22
|
+
let { agColumns, stateRef, getTotalColumnsWidth, onGridReady } = useAgGridController(gridApiRef);
|
|
22
23
|
const pagingController = usePagingController();
|
|
23
|
-
const styles = getGridStyles(theme,
|
|
24
|
-
useRef();
|
|
24
|
+
const styles = getGridStyles(theme, grid.height);
|
|
25
|
+
const resizeTimeOutRef = useRef();
|
|
25
26
|
const getAvailableWidth = () => {
|
|
26
27
|
const rootWrapper = containerRef.current?.querySelector('.ag-root-wrapper');
|
|
27
28
|
return rootWrapper?.clientWidth ?? 0;
|
|
@@ -33,78 +34,52 @@ const AgGrid = () => {
|
|
|
33
34
|
}
|
|
34
35
|
};
|
|
35
36
|
const updateColumnOrder = async (e) => {
|
|
36
|
-
|
|
37
|
-
return true;
|
|
38
|
-
});
|
|
39
|
-
if (!columOrder) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
//@ts-ignore - typings
|
|
43
|
-
grid.pcfContext.factory.fireEvent('__updateColumnOrder', columOrder);
|
|
44
|
-
/* //@ts-ignore - typings
|
|
45
|
-
if (!window.TALXIS?.Portal) {
|
|
46
|
-
//column order from Grid currently not supported in Power Apps
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if(e.type === 'gridOptionsChanged') {
|
|
37
|
+
if (e.type === 'gridOptionsChanged') {
|
|
50
38
|
return;
|
|
51
39
|
}
|
|
52
40
|
const sortedIds = e.api.getState().columnOrder?.orderedColIds;
|
|
53
41
|
if (!sortedIds) {
|
|
54
42
|
return;
|
|
55
43
|
}
|
|
56
|
-
const idIndexMap = new Map
|
|
44
|
+
const idIndexMap = new Map();
|
|
57
45
|
sortedIds.forEach((id, index) => {
|
|
58
46
|
idIndexMap.set(id, index);
|
|
59
47
|
});
|
|
60
|
-
|
|
61
48
|
const orderedColumns = [...grid.dataset.columns].sort((a, b) => {
|
|
62
|
-
const aIndex = idIndexMap.has(a.name) ? idIndexMap.get(a.name)
|
|
63
|
-
const bIndex = idIndexMap.has(b.name) ? idIndexMap.get(b.name)
|
|
49
|
+
const aIndex = idIndexMap.has(a.name) ? idIndexMap.get(a.name) : sortedIds.length;
|
|
50
|
+
const bIndex = idIndexMap.has(b.name) ? idIndexMap.get(b.name) : sortedIds.length;
|
|
64
51
|
return aIndex - bIndex;
|
|
65
52
|
});
|
|
66
|
-
//@ts-ignore
|
|
67
|
-
grid.
|
|
68
|
-
|
|
69
|
-
//@ts-ignore - portal accepts metadata
|
|
70
|
-
await grid.dataset.addColumn!(col.name, col.alias, col)
|
|
71
|
-
}
|
|
72
|
-
grid.pcfContext.factory.requestRender(); */
|
|
53
|
+
//@ts-ignore
|
|
54
|
+
grid.dataset.setColumns?.(orderedColumns);
|
|
55
|
+
grid.dataset.paging.loadExactPage(grid.paging.pageNumber);
|
|
73
56
|
};
|
|
74
57
|
const updateColumnVisualSizeFactor = async (e) => {
|
|
75
|
-
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
//@ts-ignore - typings
|
|
79
|
-
if (!window.TALXIS?.Portal) {
|
|
80
|
-
//column order from Grid currently not supported in Power Apps
|
|
58
|
+
if (e.source !== 'uiColumnResized') {
|
|
81
59
|
return;
|
|
82
60
|
}
|
|
83
|
-
clearTimeout(resizeTimeOutRef.current)
|
|
61
|
+
clearTimeout(resizeTimeOutRef.current);
|
|
84
62
|
resizeTimeOutRef.current = setTimeout(async () => {
|
|
85
63
|
const resizedColumnKey = grid.dataset.columns.find(x => x.name === e.column?.getId())?.name;
|
|
86
64
|
if (!resizedColumnKey) {
|
|
87
65
|
return;
|
|
88
66
|
}
|
|
89
67
|
const columns = grid.dataset.columns;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (col.name === resizedColumnKey) {
|
|
94
|
-
col.visualSizeFactor = e.column?.getActualWidth()!
|
|
68
|
+
for (let i = 0; i < columns.length; i++) {
|
|
69
|
+
if (columns[i].name === resizedColumnKey) {
|
|
70
|
+
columns[i].visualSizeFactor = e.column?.getActualWidth();
|
|
95
71
|
}
|
|
96
|
-
//@ts-ignore - portal accepts metadata
|
|
97
|
-
await grid.dataset.addColumn!(col.name, col.alias, col);
|
|
98
72
|
}
|
|
99
|
-
|
|
100
|
-
|
|
73
|
+
//@ts-ignore
|
|
74
|
+
grid.dataset.setColumns?.(columns);
|
|
75
|
+
}, 200);
|
|
101
76
|
};
|
|
102
77
|
return (jsx("div", { ref: containerRef, className: `${styles.root} ag-theme-balham`, children: agColumns.length > 0 &&
|
|
103
78
|
jsxs(Fragment, { children: [((grid.isEditable && grid.parameters.ChangeEditorMode?.raw !== 'edit') || grid.parameters.ChangeEditorMode?.raw === 'read') &&
|
|
104
79
|
jsx(Save, {}), grid.error &&
|
|
105
80
|
jsx(MessageBar, { messageBarType: MessageBarType.error, children: jsx("span", { dangerouslySetInnerHTML: {
|
|
106
81
|
__html: grid.errorMessage
|
|
107
|
-
} }) }), jsx(AgGridReact, { animateRows: true, rowSelection: grid.selection.type, noRowsOverlayComponent: EmptyRecords, loadingOverlayComponent: LoadingOverlay, suppressDragLeaveHidesColumns: true, onColumnResized: (e) => updateColumnVisualSizeFactor(), onColumnMoved: (e) => {
|
|
82
|
+
} }) }), jsx(AgGridReact, { animateRows: true, rowSelection: grid.selection.type, noRowsOverlayComponent: Object.keys(grid.dataset.sortedRecordIds.length === 0) && !grid.loading ? EmptyRecords : undefined, loadingOverlayComponent: grid.loading ? LoadingOverlay : undefined, suppressDragLeaveHidesColumns: true, onColumnResized: (e) => updateColumnVisualSizeFactor(e), onColumnMoved: (e) => {
|
|
108
83
|
if (e.finished) {
|
|
109
84
|
updateColumnOrder(e);
|
|
110
85
|
}
|
|
@@ -135,7 +110,7 @@ const AgGrid = () => {
|
|
|
135
110
|
}, initialState: stateRef.current, onStateUpdated: (e) => stateRef.current = {
|
|
136
111
|
...stateRef.current,
|
|
137
112
|
...e.state
|
|
138
|
-
}, rowHeight:
|
|
113
|
+
}, rowHeight: ROW_HEIGHT, columnDefs: agColumns, rowData: grid.records }), pagingController.isEnabled &&
|
|
139
114
|
jsx(Paging, {})] }) }));
|
|
140
115
|
};
|
|
141
116
|
|