@headless-adminapp/fluent 1.1.4 → 1.1.7

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 (48) hide show
  1. package/DataGrid/TableCell/TableCellChoice.js +2 -30
  2. package/DataGrid/useTableColumns.js +41 -2
  3. package/PageEntityForm/PageEntityForm.js +8 -0
  4. package/PageEntityForm/SectionContainer.d.ts +2 -2
  5. package/PageEntityForm/SectionContainer.js +18 -4
  6. package/PageEntityForm/StandardControl.js +7 -2
  7. package/components/ChoiceBadge.d.ts +9 -0
  8. package/components/ChoiceBadge.js +29 -0
  9. package/components/LoginForm.d.ts +8 -0
  10. package/components/LoginForm.js +4 -4
  11. package/components/PageLogin.d.ts +5 -0
  12. package/components/PageLogin.js +2 -1
  13. package/form/controls/RegardingControl.d.ts +25 -0
  14. package/form/controls/RegardingControl.js +202 -0
  15. package/form/controls/SelectControl.d.ts +1 -1
  16. package/form/controls/SelectControl.js +1 -3
  17. package/form/controls/TextAreaControl.d.ts +3 -1
  18. package/form/controls/TextAreaControl.js +33 -8
  19. package/form/controls/useLookupData.d.ts +12 -2
  20. package/form/controls/useLookupData.js +71 -20
  21. package/form/layout/FormSection/FormSection.js +9 -2
  22. package/form/layout/FormTab/FormTab.js +1 -0
  23. package/form/layout/FormTab/FormTabColumn.js +1 -0
  24. package/package.json +2 -2
  25. package/App/NavigationContainer.d.ts +0 -10
  26. package/App/NavigationContainer.js +0 -68
  27. package/App/utils.d.ts +0 -14
  28. package/App/utils.js +0 -26
  29. package/Insights/CommandBarContainer.d.ts +0 -1
  30. package/Insights/CommandBarContainer.js +0 -18
  31. package/Insights/FilterBarContainer.d.ts +0 -1
  32. package/Insights/FilterBarContainer.js +0 -99
  33. package/Insights/hooks/useQueriesData.d.ts +0 -7
  34. package/Insights/hooks/useQueriesData.js +0 -89
  35. package/Insights/hooks/useWidgetDetail.d.ts +0 -10
  36. package/Insights/hooks/useWidgetDetail.js +0 -39
  37. package/PageCalendar/baseEventAttributes.d.ts +0 -35
  38. package/PageCalendar/baseEventAttributes.js +0 -38
  39. package/PageCalendar/context.d.ts +0 -20
  40. package/PageCalendar/context.js +0 -5
  41. package/PageCalendar/hooks/index.d.ts +0 -1
  42. package/PageCalendar/hooks/index.js +0 -17
  43. package/PageCalendar/hooks/useConfig.d.ts +0 -3
  44. package/PageCalendar/hooks/useConfig.js +0 -8
  45. package/PageInsights/PageInsights.d.ts +0 -7
  46. package/PageInsights/PageInsights.js +0 -31
  47. package/PageInsights/index.d.ts +0 -1
  48. package/PageInsights/index.js +0 -5
@@ -3,14 +3,39 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TextAreaControl = TextAreaControl;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_components_1 = require("@fluentui/react-components");
6
- function TextAreaControl({ value, onChange, id, name, placeholder, onBlur, onFocus, disabled, readOnly, rows = 5, textTransform, }) {
7
- return ((0, jsx_runtime_1.jsx)(react_components_1.Textarea, { placeholder: placeholder, id: id, appearance: "filled-darker", name: name, value: value || '', onChange: (e) => {
8
- textTransform === 'uppercase'
9
- ? onChange?.(e.target.value.toUpperCase())
10
- : textTransform === 'lowercase'
11
- ? onChange?.(e.target.value.toLowerCase())
12
- : onChange?.(e.target.value);
13
- }, onBlur: () => onBlur?.(), onFocus: () => onFocus?.(),
6
+ const react_1 = require("react");
7
+ const DEFAULT_MAX_HEIGHT = 260;
8
+ function TextAreaControl({ value, onChange, id, name, placeholder, onBlur, onFocus, disabled, readOnly, rows = 5, textTransform, autoHeight, maxHeight, }) {
9
+ const textAreaRef = (0, react_1.useRef)(null);
10
+ (0, react_1.useEffect)(() => {
11
+ const textarea = textAreaRef.current;
12
+ if (!textarea)
13
+ return;
14
+ if (autoHeight) {
15
+ textarea.style.height = 'auto';
16
+ textarea.style.height = textarea.scrollHeight + 'px';
17
+ textarea.style.maxHeight = maxHeight
18
+ ? `${maxHeight}px`
19
+ : textarea.scrollHeight + 'px';
20
+ }
21
+ else {
22
+ textarea.style.height = '';
23
+ textarea.style.maxHeight = maxHeight
24
+ ? `${maxHeight}px`
25
+ : `${DEFAULT_MAX_HEIGHT}px`;
26
+ }
27
+ }, [value, autoHeight, maxHeight]);
28
+ const handleInput = (e, data) => {
29
+ let newValue = data.value;
30
+ if (textTransform === 'uppercase') {
31
+ newValue = newValue.toUpperCase();
32
+ }
33
+ else if (textTransform === 'lowercase') {
34
+ newValue = newValue.toLowerCase();
35
+ }
36
+ onChange?.(newValue);
37
+ };
38
+ return ((0, jsx_runtime_1.jsx)(react_components_1.Textarea, { ref: textAreaRef, placeholder: placeholder, id: id, appearance: "filled-darker", name: name, value: value ?? '', onChange: handleInput, onBlur: () => onBlur?.(), onFocus: () => onFocus?.(),
14
39
  // error={error}
15
40
  readOnly: disabled || readOnly, rows: rows }));
16
41
  }
@@ -1,6 +1,6 @@
1
1
  import { ViewExperience } from '@headless-adminapp/core/experience/view';
2
2
  import { InferredSchemaType, Schema, SchemaAttributes } from '@headless-adminapp/core/schema';
3
- import { IDataService } from '@headless-adminapp/core/transport';
3
+ import { IDataService, RetriveRecordsResult } from '@headless-adminapp/core/transport';
4
4
  interface UseLookupDataOptions {
5
5
  dataService: IDataService;
6
6
  searchText?: string;
@@ -9,9 +9,19 @@ interface UseLookupDataOptions {
9
9
  enabled?: boolean;
10
10
  }
11
11
  export declare function useLookupData<S extends SchemaAttributes = SchemaAttributes>({ schema, view, searchText, dataService, enabled, }: UseLookupDataOptions): {
12
- data: import("@headless-adminapp/core/transport").RetriveRecordsResult<InferredSchemaType<S>> | undefined;
12
+ data: RetriveRecordsResult<InferredSchemaType<S>> | undefined;
13
13
  isLoading: boolean;
14
14
  };
15
+ interface UseLookupsDataOptions {
16
+ dataService: IDataService;
17
+ searchText?: string;
18
+ enabled?: boolean;
19
+ items: Array<{
20
+ schema: Schema;
21
+ view: ViewExperience | null | undefined;
22
+ }>;
23
+ }
24
+ export declare function useLookupDatas<T = unknown>({ dataService, searchText, enabled, items, }: UseLookupsDataOptions): import("@tanstack/react-query").UseQueryResult[];
15
25
  export declare function useGetLookupView(logicalName: string, viewId?: string): {
16
26
  isLoading: boolean;
17
27
  view: import("@headless-adminapp/core/experience/view").View<SchemaAttributes> | undefined;
@@ -1,26 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useLookupData = useLookupData;
4
+ exports.useLookupDatas = useLookupDatas;
4
5
  exports.useGetLookupView = useGetLookupView;
5
6
  const hooks_1 = require("@headless-adminapp/app/hooks");
6
7
  const hooks_2 = require("@headless-adminapp/app/metadata/hooks");
7
8
  const react_query_1 = require("@tanstack/react-query");
8
9
  const react_1 = require("react");
9
- function useLookupData({ schema, view, searchText, dataService, enabled, }) {
10
- const [search] = (0, hooks_1.useDebouncedValue)(searchText, 500);
11
- const columns = (0, react_1.useMemo)(() => {
12
- if (!view?.card) {
13
- return [schema.primaryAttribute];
14
- }
15
- return Array.from(new Set([
16
- view.card.primaryColumn,
17
- view.card.avatarColumn,
18
- ...(view.card.secondaryColumns ?? [])
19
- .filter((x) => !x.expandedKey)
20
- .map((x) => x.name),
21
- ])).filter(Boolean);
22
- }, [schema.primaryAttribute, view?.card]);
23
- const expand = (0, react_1.useMemo)(() => (view?.card?.secondaryColumns || [])
10
+ function extractColumns(schema, view) {
11
+ if (!view?.card) {
12
+ return [schema.primaryAttribute];
13
+ }
14
+ return Array.from(new Set([
15
+ view.card.primaryColumn,
16
+ view.card.avatarColumn,
17
+ ...(view.card.secondaryColumns ?? [])
18
+ .filter((x) => !x.expandedKey)
19
+ .map((x) => x.name),
20
+ ])).filter(Boolean);
21
+ }
22
+ function extractExpand(view) {
23
+ return (view?.card?.secondaryColumns || [])
24
24
  .filter((x) => x.expandedKey)
25
25
  .reduce((acc, x) => {
26
26
  if (!acc[x.name]) {
@@ -30,17 +30,31 @@ function useLookupData({ schema, view, searchText, dataService, enabled, }) {
30
30
  acc[x.name].push(x.expandedKey);
31
31
  }
32
32
  return acc;
33
- }, {}), [view?.card?.secondaryColumns]);
34
- const queryKey = (0, react_1.useMemo)(() => [
35
- 'data',
36
- 'retriveLookupRecords',
33
+ }, {});
34
+ }
35
+ function getKey({ schema, view, columns, expand, search, }) {
36
+ return [
37
+ columns,
38
+ expand,
37
39
  schema.logicalName,
38
40
  search,
39
41
  view?.filter,
40
42
  view?.defaultSorting,
43
+ ];
44
+ }
45
+ function useLookupData({ schema, view, searchText, dataService, enabled, }) {
46
+ const [search] = (0, hooks_1.useDebouncedValue)(searchText, 500);
47
+ const columns = (0, react_1.useMemo)(() => {
48
+ return extractColumns(schema, view);
49
+ }, [schema, view]);
50
+ const expand = (0, react_1.useMemo)(() => extractExpand(view), [view?.card?.secondaryColumns]);
51
+ const queryKey = (0, react_1.useMemo)(() => getKey({
41
52
  columns,
42
53
  expand,
43
- ], [
54
+ schema,
55
+ search,
56
+ view,
57
+ }), [
44
58
  columns,
45
59
  expand,
46
60
  schema.logicalName,
@@ -71,6 +85,43 @@ function useLookupData({ schema, view, searchText, dataService, enabled, }) {
71
85
  isLoading: isFetching,
72
86
  };
73
87
  }
88
+ function useLookupDatas({ dataService, searchText, enabled, items, }) {
89
+ const [search] = (0, hooks_1.useDebouncedValue)(searchText, 500);
90
+ const queries = (0, react_1.useMemo)(() => {
91
+ return items.map((item) => {
92
+ const columns = extractColumns(item.schema, item.view);
93
+ const expand = extractExpand(item.view);
94
+ const queryKey = getKey({
95
+ schema: item.schema,
96
+ view: item.view,
97
+ columns,
98
+ expand,
99
+ search,
100
+ });
101
+ return {
102
+ queryKey: queryKey,
103
+ queryFn: async () => {
104
+ const result = await dataService.retriveRecords({
105
+ logicalName: item.schema.logicalName,
106
+ search,
107
+ columns,
108
+ expand,
109
+ filter: item.view?.filter ?? null,
110
+ skip: 0,
111
+ limit: 5,
112
+ sort: item.view?.defaultSorting,
113
+ });
114
+ return result;
115
+ },
116
+ placeholderData: react_query_1.keepPreviousData,
117
+ enabled: !!item.view && (enabled ?? false),
118
+ };
119
+ });
120
+ }, [items, search, dataService, enabled]);
121
+ return (0, react_query_1.useQueries)({
122
+ queries,
123
+ });
124
+ }
74
125
  function useGetLookupView(logicalName, viewId) {
75
126
  const { experienceStore } = (0, hooks_2.useMetadata)();
76
127
  const { isPending, data, error } = (0, react_query_1.useQuery)({
@@ -11,7 +11,7 @@ const FormSectionLoading_1 = require("./FormSectionLoading");
11
11
  function determineItemCount(availableWidth, itemWidth, gap, padding) {
12
12
  return Math.floor((availableWidth + gap - 2 * padding) / (itemWidth + gap));
13
13
  }
14
- const FormSection = ({ title, children, columnCount, labelPosition, noPadding, hideLabel }) => {
14
+ const FormSection = ({ title, children, columnCount, labelPosition, noPadding, hideLabel, fullHeight, }) => {
15
15
  // const columnCount = 2;
16
16
  const divRef = (0, react_1.useRef)(null);
17
17
  const divSize = (0, hooks_1.useElementSize)(divRef, 100);
@@ -64,7 +64,14 @@ const FormSection = ({ title, children, columnCount, labelPosition, noPadding, h
64
64
  boxShadow: react_components_1.tokens.shadow2,
65
65
  borderRadius: react_components_1.tokens.borderRadiusMedium,
66
66
  background: react_components_1.tokens.colorNeutralBackground1,
67
- }, children: (0, jsx_runtime_1.jsxs)("div", { children: [!hideLabel && !!title && ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: {
67
+ display: 'flex',
68
+ flexDirection: 'column',
69
+ flex: fullHeight ? 1 : undefined,
70
+ }, children: (0, jsx_runtime_1.jsxs)("div", { style: {
71
+ display: 'flex',
72
+ flexDirection: 'column',
73
+ flex: fullHeight ? 1 : undefined,
74
+ }, children: [!hideLabel && !!title && ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: {
68
75
  display: 'flex',
69
76
  paddingInline: 16,
70
77
  paddingBlock: 8,
@@ -77,6 +77,7 @@ const FormTabInternal = ({ children, value, fullHeight, columnCount, columnWidth
77
77
  gridRowGap: 12,
78
78
  gridColumnGap: 12,
79
79
  gridTemplateColumns: template,
80
+ flex: 1,
80
81
  }, children: children }) }));
81
82
  };
82
83
  exports.FormTab.Column = FormTabColumn_1.FormTabColumn;
@@ -10,6 +10,7 @@ const FormTabColumn = ({ children, span: _span, }) => {
10
10
  flexDirection: 'column',
11
11
  width: '100%',
12
12
  gap: react_components_1.tokens.spacingVerticalM,
13
+ minHeight: '100%',
13
14
  }, children: children }) }));
14
15
  };
15
16
  exports.FormTabColumn = FormTabColumn;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@headless-adminapp/fluent",
3
- "version": "1.1.4",
3
+ "version": "1.1.7",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -50,5 +50,5 @@
50
50
  "uuid": "11.0.3",
51
51
  "yup": "^1.4.0"
52
52
  },
53
- "gitHead": "c672cac064915ef436c61692cc8aa18e3faf82c5"
53
+ "gitHead": "e5d75e8b5da3f818064090455eefd3cb27b5a2ce"
54
54
  }
@@ -1,10 +0,0 @@
1
- import { DrawerProps } from '@fluentui/react-components';
2
- import { FC } from 'react';
3
- type DrawerType = Required<DrawerProps>['type'];
4
- interface NavigationContainerProps {
5
- open: boolean;
6
- type: DrawerType;
7
- onOpenChange: (open: boolean) => void;
8
- }
9
- export declare const NavigationContainer: FC<NavigationContainerProps>;
10
- export {};
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NavigationContainer = void 0;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_components_1 = require("@fluentui/react-components");
6
- const react_nav_preview_1 = require("@fluentui/react-nav-preview");
7
- const app_1 = require("@headless-adminapp/app/app");
8
- const locale_1 = require("@headless-adminapp/app/locale");
9
- const hooks_1 = require("@headless-adminapp/app/route/hooks");
10
- const icons_1 = require("@headless-adminapp/icons");
11
- const react_1 = require("react");
12
- const utils_1 = require("./utils");
13
- const useStyles = (0, react_components_1.makeStyles)({
14
- root: {
15
- overflow: 'hidden',
16
- display: 'flex',
17
- flexShrink: 0,
18
- boxShadow: react_components_1.tokens.shadow4,
19
- zIndex: 1,
20
- },
21
- content: {
22
- flex: '1',
23
- padding: '16px',
24
- display: 'grid',
25
- justifyContent: 'flex-start',
26
- alignItems: 'flex-start',
27
- },
28
- field: {
29
- display: 'flex',
30
- marginTop: '4px',
31
- marginLeft: '8px',
32
- flexDirection: 'column',
33
- gridRowGap: react_components_1.tokens.spacingVerticalS,
34
- },
35
- });
36
- const NavigationContainer = ({ open, type, onOpenChange, }) => {
37
- const styles = useStyles();
38
- const { appExperience: app } = (0, app_1.useAppContext)();
39
- return ((0, jsx_runtime_1.jsx)("div", { className: styles.root, children: (0, jsx_runtime_1.jsx)(react_nav_preview_1.NavDrawer, { selectedValue: "active", open: open, type: type, onOpenChange: (value, data) => onOpenChange(data.open), children: (0, jsx_runtime_1.jsx)(react_nav_preview_1.NavDrawerBody, { style: {
40
- paddingTop: 8,
41
- // borderRight: `1px solid ${tokens.colorNeutralStroke1}`,
42
- }, children: app.navItems.map((area) => ((0, jsx_runtime_1.jsx)(react_1.Fragment, { children: area.groups.map((group) => ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [!group.hideLabel && ((0, jsx_runtime_1.jsx)(react_nav_preview_1.NavSectionHeader, { children: group.label })), group.items.map((item, index) => ((0, jsx_runtime_1.jsx)(Test, { item: item, drawerType: type, onOpenChange: onOpenChange }, (item.label ?? '') + String(index))))] }, group.label))) }, area.label))) }) }) }));
43
- };
44
- exports.NavigationContainer = NavigationContainer;
45
- const Test = ({ item, onOpenChange, drawerType }) => {
46
- const { schemaMetadataDic } = (0, app_1.useAppContext)();
47
- const router = (0, hooks_1.useRouter)();
48
- const pathname = (0, hooks_1.usePathname)();
49
- const selectedPath = pathname;
50
- const { language } = (0, locale_1.useLocale)();
51
- const isRouteActive = (0, hooks_1.useIsRouteActive)();
52
- const routeResolver = (0, hooks_1.useRouteResolver)();
53
- const navItem = (0, utils_1.transformNavPageItem)({
54
- item,
55
- schemaMetadataDic: schemaMetadataDic,
56
- language,
57
- routeResolver,
58
- });
59
- const Icon = navItem.icon ?? icons_1.Icons.Entity ?? icons_1.IconPlaceholder;
60
- const isActive = isRouteActive(selectedPath, item);
61
- return ((0, jsx_runtime_1.jsx)(react_nav_preview_1.NavItem, { href: navItem.link, onClick: (event) => {
62
- if (drawerType === 'overlay') {
63
- onOpenChange(false);
64
- }
65
- event.preventDefault();
66
- router.push(navItem.link);
67
- }, icon: (0, jsx_runtime_1.jsx)(Icon, { size: 20, filled: isActive, color: isActive ? 'var(--colorNeutralForeground2BrandSelected)' : undefined }), value: isActive ? 'active' : '', children: navItem.label }));
68
- };
package/App/utils.d.ts DELETED
@@ -1,14 +0,0 @@
1
- import { InternalRouteResolver } from '@headless-adminapp/app/route/context';
2
- import { NavPageItem } from '@headless-adminapp/core/experience/app';
3
- import { SchemaExperienceMetadata } from '@headless-adminapp/core/experience/schema';
4
- export declare function transformNavPageItem({ item, schemaMetadataDic: schemaMetadataObject, language, routeResolver, }: {
5
- item: NavPageItem;
6
- schemaMetadataDic: Record<string, SchemaExperienceMetadata>;
7
- language: string;
8
- routeResolver: InternalRouteResolver;
9
- }): {
10
- label: string | undefined;
11
- icon: import("@headless-adminapp/icons").Icon | undefined;
12
- link: string;
13
- isExternal: boolean;
14
- };
package/App/utils.js DELETED
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.transformNavPageItem = transformNavPageItem;
4
- function transformNavPageItem({ item, schemaMetadataDic: schemaMetadataObject, language, routeResolver, }) {
5
- let icon = item.icon;
6
- let label = item.localizedLabel?.[language] ?? item.label;
7
- let link = routeResolver(item);
8
- if (item.type === 'entityview') {
9
- const metadata = schemaMetadataObject?.[item.logicalName];
10
- if (metadata) {
11
- if (!label) {
12
- label =
13
- metadata.localizedPluralLabels?.[language] ?? metadata.pluralLabel;
14
- }
15
- if (!icon) {
16
- icon = metadata.icon;
17
- }
18
- }
19
- }
20
- return {
21
- label,
22
- icon,
23
- link,
24
- isExternal: item.type === 'external',
25
- };
26
- }
@@ -1 +0,0 @@
1
- export declare function CommandBarContainer(): import("react/jsx-runtime").JSX.Element;
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CommandBarContainer = CommandBarContainer;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const command_1 = require("@headless-adminapp/app/command");
6
- const hooks_1 = require("@headless-adminapp/app/command/hooks");
7
- const insights_1 = require("@headless-adminapp/app/insights");
8
- const mutable_1 = require("@headless-adminapp/app/mutable");
9
- const OverflowCommandBar_1 = require("../OverflowCommandBar");
10
- function CommandBarContainer() {
11
- const baseCommandHandleContext = (0, hooks_1.useBaseCommandHandlerContext)();
12
- const insightExpereince = (0, mutable_1.useContextSelector)(insights_1.InsightsContext, (x) => x.config);
13
- const transformedCommands = (0, command_1.useCommands)([insightExpereince.commands], {
14
- ...baseCommandHandleContext,
15
- primaryControl: {},
16
- });
17
- return ((0, jsx_runtime_1.jsx)("div", { style: { flex: 1, flexShrink: 0, overflow: 'hidden' }, children: (0, jsx_runtime_1.jsx)(OverflowCommandBar_1.OverflowCommandBar, { commands: transformedCommands }) }));
18
- }
@@ -1 +0,0 @@
1
- export declare function FilterBarContainer(): import("react/jsx-runtime").JSX.Element;
@@ -1,99 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FilterBarContainer = FilterBarContainer;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_components_1 = require("@fluentui/react-components");
6
- const hooks_1 = require("@headless-adminapp/app/dialog/hooks");
7
- const insights_1 = require("@headless-adminapp/app/insights");
8
- const mutable_1 = require("@headless-adminapp/app/mutable");
9
- const utils_1 = require("@headless-adminapp/app/utils");
10
- const icons_1 = require("@headless-adminapp/icons");
11
- const OverflowCommandBar_1 = require("../OverflowCommandBar");
12
- function FilterBarContainer() {
13
- const openPromptDialog = (0, hooks_1.useOpenPromptDialog)();
14
- const insightsState = (0, mutable_1.useContextSelector)(insights_1.InsightsContext, (state) => state);
15
- const insightExpereince = insightsState.config;
16
- const setValue = (0, mutable_1.useContextSetValue)(insights_1.InsightsContext);
17
- const handleOpenPromptDialog = async () => {
18
- const attributes = insightExpereince.filters.reduce((acc, item) => {
19
- acc[item.logicalName] =
20
- insightsState.config.filterAttributes[item.logicalName];
21
- return acc;
22
- }, {});
23
- const defaultValues = insightExpereince.filters.reduce((acc, item) => {
24
- acc[item.logicalName] = insightsState.filterValues[item.logicalName];
25
- return acc;
26
- }, {});
27
- const result = await openPromptDialog({
28
- attributes,
29
- defaultValues,
30
- title: 'Modify filter',
31
- allowDismiss: true,
32
- });
33
- if (!result) {
34
- return;
35
- }
36
- setValue({
37
- filterValues: result,
38
- });
39
- };
40
- const filterCommandItems = insightExpereince.filters
41
- .map((item) => {
42
- const logicalName = item.logicalName;
43
- const value = insightsState.filterValues[logicalName];
44
- const attribute = insightsState.config.filterAttributes[logicalName];
45
- if (!item.showInFilterBar) {
46
- return null;
47
- }
48
- if (!attribute || !value) {
49
- return null;
50
- }
51
- if (item.allowQuickFilter) {
52
- return {
53
- type: 'button',
54
- Icon: item.Icon,
55
- text: (0, utils_1.getAttributeFormattedValue)(attribute, value, { maxCount: 2 }),
56
- onClick: async () => {
57
- const result = await openPromptDialog({
58
- allowDismiss: true,
59
- attributes: {
60
- [logicalName]: attribute,
61
- },
62
- defaultValues: {
63
- [logicalName]: value,
64
- },
65
- title: item.quickFilterTitle ?? attribute.label,
66
- });
67
- if (!result) {
68
- return;
69
- }
70
- setValue({
71
- filterValues: {
72
- ...insightsState.filterValues,
73
- [logicalName]: result[logicalName],
74
- },
75
- });
76
- },
77
- };
78
- }
79
- return {
80
- type: 'label',
81
- Icon: item.Icon,
82
- text: (item.beforeContent ?? '') +
83
- (0, utils_1.getAttributeFormattedValue)(attribute, value, { maxCount: 2 }),
84
- };
85
- })
86
- .filter(Boolean);
87
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
88
- display: 'flex',
89
- flex: 1,
90
- flexShrink: 0,
91
- alignItems: 'center',
92
- overflow: 'hidden',
93
- }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
94
- display: 'flex',
95
- flex: 1,
96
- overflow: 'hidden',
97
- flexShrink: 0,
98
- }, children: (0, jsx_runtime_1.jsx)(OverflowCommandBar_1.OverflowCommandBar, { commands: [filterCommandItems], align: "end", beforeDivider: true }) }), insightExpereince.filters.length > 0 && ((0, jsx_runtime_1.jsx)(react_components_1.Button, { appearance: "primary", icon: (0, jsx_runtime_1.jsx)(icons_1.Icons.Filter, { size: 16 }), onClick: handleOpenPromptDialog, style: { flexShrink: 0, marginInline: 8 }, children: "Filter" }))] }));
99
- }
@@ -1,7 +0,0 @@
1
- import { DataSetItemAllowFunction } from '@headless-adminapp/core/experience/insights';
2
- export declare function useQueriesData(queries: DataSetItemAllowFunction[]): {
3
- isPending: boolean;
4
- isFetching: boolean;
5
- dataset: any[];
6
- refetch: () => Promise<import("@tanstack/react-query").QueryObserverResult<any, Error>>[];
7
- };
@@ -1,89 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.useQueriesData = useQueriesData;
7
- const insights_1 = require("@headless-adminapp/app/insights");
8
- const mutable_1 = require("@headless-adminapp/app/mutable");
9
- const transport_1 = require("@headless-adminapp/app/transport");
10
- const widget_1 = require("@headless-adminapp/app/widget");
11
- const transport_2 = require("@headless-adminapp/core/transport");
12
- const react_query_1 = require("@tanstack/react-query");
13
- const dayjs_1 = __importDefault(require("dayjs"));
14
- const react_1 = require("react");
15
- function useQueriesData(queries) {
16
- const dataService = (0, transport_1.useDataService)();
17
- const insightsState = (0, mutable_1.useContextSelector)(insights_1.InsightsContext, (state) => state);
18
- const widgetState = (0, mutable_1.useContextSelector)(widget_1.WidgetContext, (state) => state);
19
- const resolvedQueries = (0, react_1.useMemo)(() => {
20
- return queries.map((item) => {
21
- if (typeof item === 'function') {
22
- return item(insightsState, widgetState);
23
- }
24
- return item;
25
- });
26
- }, [queries, insightsState, widgetState]);
27
- const result = (0, react_query_1.useQueries)({
28
- queries: resolvedQueries.map((item) => ({
29
- queryKey: ['insights', 'aggregate', item],
30
- queryFn: async () => {
31
- if (item.type === 'constant') {
32
- return item.value;
33
- }
34
- if (item.type === 'function') {
35
- return item.value(insightsState, widgetState);
36
- }
37
- if (item.type === 'customAction') {
38
- return dataService.customAction(item.value.actionName, item.value.payload);
39
- }
40
- const query = item.value;
41
- const data = await dataService.retriveAggregate(query);
42
- const transformedData = transformAggregateData(data, query);
43
- return transformedData;
44
- },
45
- })),
46
- });
47
- const isPending = result.some((r) => r.isPending);
48
- const isFetching = result.some((r) => r.isFetching);
49
- const refetch = () => result.map((r) => r.refetch());
50
- const data = (0, react_1.useMemo)(() => {
51
- return result.map((r) => r.data);
52
- }, [result]);
53
- return { isPending, isFetching, dataset: data, refetch };
54
- }
55
- function transformAggregateData(data, query) {
56
- const transformedData = data;
57
- Object.entries(query.attributes).forEach(([key, attribute]) => {
58
- const transformer = getAttributeValueTransformer(attribute);
59
- if (transformer) {
60
- transformedData.forEach((item) => {
61
- item[key] = transformer(item[key]);
62
- });
63
- }
64
- });
65
- return transformedData;
66
- }
67
- function getAttributeValueTransformer(attribute) {
68
- let transformer = undefined;
69
- if (attribute.type === 'date') {
70
- if (attribute.format) {
71
- transformer = (value) => (0, dayjs_1.default)(value, attribute.format)
72
- .toDate()
73
- .getTime();
74
- }
75
- else if (attribute.value.type === 'function') {
76
- if (attribute.value.value === transport_2.AggregateAttributeFunction.YearMonth) {
77
- transformer = (value) => (0, dayjs_1.default)(value, 'YYYY-MM')
78
- .toDate()
79
- .getTime();
80
- }
81
- }
82
- else {
83
- transformer = (value) => (0, dayjs_1.default)(value)
84
- .toDate()
85
- .getTime();
86
- }
87
- }
88
- return transformer;
89
- }
@@ -1,10 +0,0 @@
1
- import { WidgetContentExperience, WidgetExperience } from '@headless-adminapp/core/experience/insights';
2
- import { SchemaAttributes } from '@headless-adminapp/core/schema';
3
- export declare function useWidgetDetail<T extends WidgetContentExperience>(widgetContent: T): {
4
- isPending: boolean;
5
- isFetching: boolean;
6
- dataset: unknown[];
7
- refetch: () => Promise<import("@tanstack/react-query").QueryObserverResult<unknown, Error>>[];
8
- widget: WidgetExperience<SchemaAttributes, T>;
9
- transformedCommands: import("@headless-adminapp/app/command").CommandItemState[][];
10
- };
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useWidgetDetail = useWidgetDetail;
4
- const command_1 = require("@headless-adminapp/app/command");
5
- const hooks_1 = require("@headless-adminapp/app/command/hooks");
6
- const mutable_1 = require("@headless-adminapp/app/mutable");
7
- const widget_1 = require("@headless-adminapp/app/widget");
8
- const react_1 = require("react");
9
- const useQueriesData_1 = require("./useQueriesData");
10
- function useWidgetDetail(widgetContent) {
11
- const widgetState = (0, mutable_1.useContextSelector)(widget_1.WidgetContext, (state) => state);
12
- const widget = widgetState.widget;
13
- const widgetSetValue = (0, mutable_1.useContextSetValue)(widget_1.WidgetContext);
14
- const { dataset, isPending, isFetching, refetch } = (0, useQueriesData_1.useQueriesData)(widget.dataset);
15
- const baseCommandHandleContext = (0, hooks_1.useBaseCommandHandlerContext)();
16
- const updateStateValue = (0, react_1.useCallback)(
17
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
- (value) => {
19
- widgetSetValue((state) => ({
20
- ...state,
21
- data: { ...state.data, ...value },
22
- }));
23
- }, [widgetSetValue]);
24
- const transformedCommands = (0, command_1.useCommands)([widgetContent.commands], {
25
- ...baseCommandHandleContext,
26
- primaryControl: {
27
- refresh: refetch,
28
- updateStateValue,
29
- },
30
- });
31
- return {
32
- isPending,
33
- isFetching,
34
- dataset,
35
- refetch,
36
- widget,
37
- transformedCommands,
38
- };
39
- }