@gisce/react-ooui 1.2.0-rc.7 → 1.2.0-rc.71

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 (133) hide show
  1. package/dist/actionbar/FormActionBar.d.ts.map +1 -1
  2. package/dist/actionbar/TreeActionBar.d.ts.map +1 -1
  3. package/dist/common/DatePicker.d.ts +12 -0
  4. package/dist/common/DatePicker.d.ts.map +1 -1
  5. package/dist/context/ActionViewContext.d.ts +5 -1
  6. package/dist/context/ActionViewContext.d.ts.map +1 -1
  7. package/dist/context/ContentRootContext.d.ts.map +1 -1
  8. package/dist/context/FormContext.d.ts +4 -2
  9. package/dist/context/FormContext.d.ts.map +1 -1
  10. package/dist/helpers/formHelper.d.ts +5 -3
  11. package/dist/helpers/formHelper.d.ts.map +1 -1
  12. package/dist/helpers/iconMapper.d.ts +5 -1
  13. package/dist/helpers/iconMapper.d.ts.map +1 -1
  14. package/dist/helpers/one2manyHelper.d.ts +12 -4
  15. package/dist/helpers/one2manyHelper.d.ts.map +1 -1
  16. package/dist/helpers/searchHelper.d.ts +1 -1
  17. package/dist/helpers/searchHelper.d.ts.map +1 -1
  18. package/dist/helpers/treeHelper.d.ts +1 -1
  19. package/dist/helpers/treeHelper.d.ts.map +1 -1
  20. package/dist/hooks/useExport.d.ts +44 -0
  21. package/dist/hooks/useExport.d.ts.map +1 -0
  22. package/dist/index.d.ts +2 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/locales/ca_ES.d.ts +2 -0
  25. package/dist/locales/ca_ES.d.ts.map +1 -1
  26. package/dist/locales/en_US.d.ts +2 -0
  27. package/dist/locales/en_US.d.ts.map +1 -1
  28. package/dist/locales/es_ES.d.ts +2 -0
  29. package/dist/locales/es_ES.d.ts.map +1 -1
  30. package/dist/react-ooui.es.js +25403 -27411
  31. package/dist/react-ooui.es.js.map +1 -1
  32. package/dist/react-ooui.umd.js +46 -184
  33. package/dist/react-ooui.umd.js.map +1 -1
  34. package/dist/types/index.d.ts +1 -0
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/dist/views/RootView.d.ts.map +1 -1
  37. package/dist/views/actionViews/GraphActionView.d.ts.map +1 -1
  38. package/dist/views/actionViews/TreeActionView.d.ts.map +1 -1
  39. package/dist/widgets/WidgetFactory.d.ts.map +1 -1
  40. package/dist/widgets/base/Integer.d.ts.map +1 -1
  41. package/dist/widgets/base/Label.d.ts.map +1 -1
  42. package/dist/widgets/base/Reference.d.ts.map +1 -1
  43. package/dist/widgets/base/ReferenceTree.d.ts +8 -0
  44. package/dist/widgets/base/ReferenceTree.d.ts.map +1 -0
  45. package/dist/widgets/base/Separator.d.ts.map +1 -1
  46. package/dist/widgets/base/many2one/Many2one.d.ts.map +1 -1
  47. package/dist/widgets/base/many2one/Many2oneTree.d.ts +6 -0
  48. package/dist/widgets/base/many2one/Many2oneTree.d.ts.map +1 -0
  49. package/dist/widgets/base/one2many/One2manyInput.d.ts.map +1 -1
  50. package/dist/widgets/containers/Group.d.ts.map +1 -1
  51. package/dist/widgets/custom/MultiCheckbox.d.ts.map +1 -1
  52. package/dist/widgets/custom/Tag.d.ts +5 -0
  53. package/dist/widgets/custom/Tag.d.ts.map +1 -0
  54. package/dist/widgets/custom/Tags.d.ts.map +1 -1
  55. package/dist/widgets/custom/Timeline.d.ts.map +1 -1
  56. package/dist/widgets/modals/ExportModal.d.ts +2 -1
  57. package/dist/widgets/modals/ExportModal.d.ts.map +1 -1
  58. package/dist/widgets/views/Dashboard/Dashboard.d.ts.map +1 -1
  59. package/dist/widgets/views/Dashboard/DashboardTree.d.ts.map +1 -1
  60. package/dist/widgets/views/Form.d.ts.map +1 -1
  61. package/dist/widgets/views/Graph/GraphChart.d.ts.map +1 -1
  62. package/dist/widgets/views/Graph/GraphDefaults.d.ts +36 -0
  63. package/dist/widgets/views/Graph/GraphDefaults.d.ts.map +1 -1
  64. package/dist/widgets/views/SearchTree.d.ts.map +1 -1
  65. package/dist/widgets/views/Tree.d.ts +2 -0
  66. package/dist/widgets/views/Tree.d.ts.map +1 -1
  67. package/dist/widgets/views/searchFilter/SearchFilter.d.ts +1 -0
  68. package/dist/widgets/views/searchFilter/SearchFilter.d.ts.map +1 -1
  69. package/package.json +8 -7
  70. package/src/__tests__/iconMapper.test.ts +20 -5
  71. package/src/actionbar/ChangeViewButton.tsx +2 -2
  72. package/src/actionbar/FormActionBar.tsx +82 -11
  73. package/src/actionbar/TreeActionBar.tsx +23 -28
  74. package/src/common/DatePicker.tsx +4 -3
  75. package/src/context/ActionViewContext.tsx +7 -4
  76. package/src/context/ContentRootContext.tsx +15 -7
  77. package/src/context/FormContext.tsx +1 -4
  78. package/src/helpers/formHelper.ts +26 -5
  79. package/src/helpers/iconMapper.ts +134 -107
  80. package/src/helpers/one2manyHelper.ts +94 -39
  81. package/src/helpers/searchHelper.ts +8 -7
  82. package/src/helpers/treeHelper.ts +17 -5
  83. package/src/hooks/useExport.ts +439 -0
  84. package/src/index.ts +2 -0
  85. package/src/locales/ca_ES.tsx +2 -0
  86. package/src/locales/en_US.tsx +2 -0
  87. package/src/locales/es_ES.tsx +2 -0
  88. package/src/stories/Label.stories.tsx +7 -8
  89. package/src/stories/Separator.stories.tsx +33 -0
  90. package/src/stories/containers/Group.stories.tsx +24 -0
  91. package/src/stories/containers/Notebook.stories.tsx +27 -0
  92. package/src/stories/custom/Tag.stories.tsx +57 -0
  93. package/src/stories/mocks/models/crm_case.ts +7 -10
  94. package/src/stories/views/Tree.stories.jsx +5 -5
  95. package/src/types/index.ts +1 -0
  96. package/src/ui/FavouriteButton.tsx +4 -4
  97. package/src/views/RootView.tsx +7 -1
  98. package/src/views/actionViews/GraphActionView.tsx +1 -0
  99. package/src/views/actionViews/TreeActionView.tsx +10 -1
  100. package/src/widgets/WidgetFactory.tsx +3 -0
  101. package/src/widgets/base/Integer.tsx +1 -0
  102. package/src/widgets/base/Label.tsx +5 -9
  103. package/src/widgets/base/Reference.tsx +13 -3
  104. package/src/widgets/base/ReferenceTree.tsx +62 -0
  105. package/src/widgets/base/Separator.tsx +11 -3
  106. package/src/widgets/base/many2one/Many2one.tsx +10 -19
  107. package/src/widgets/base/many2one/Many2oneTree.tsx +18 -0
  108. package/src/widgets/base/one2many/One2manyInput.tsx +79 -23
  109. package/src/widgets/containers/Group.tsx +7 -4
  110. package/src/widgets/custom/ButtonGroup.tsx +1 -1
  111. package/src/widgets/custom/MultiCheckbox.tsx +1 -0
  112. package/src/widgets/custom/Tag.tsx +24 -0
  113. package/src/widgets/custom/Tags.tsx +27 -28
  114. package/src/widgets/custom/Timeline.tsx +9 -3
  115. package/src/widgets/modals/ExportModal.tsx +33 -134
  116. package/src/widgets/views/Dashboard/Dashboard.tsx +15 -4
  117. package/src/widgets/views/Dashboard/DashboardTree.tsx +1 -0
  118. package/src/widgets/views/Form.tsx +38 -31
  119. package/src/widgets/views/Graph/GraphChart.tsx +6 -1
  120. package/src/widgets/views/Graph/GraphDefaults.ts +113 -0
  121. package/src/widgets/views/Graph/GraphIndicator.tsx +17 -3
  122. package/src/widgets/views/SearchTree.tsx +3 -0
  123. package/src/widgets/views/Tree.tsx +111 -25
  124. package/src/widgets/views/searchFilter/SearchFilter.tsx +12 -6
  125. package/dist/helpers/icons/antd_icons.d.ts +0 -4
  126. package/dist/helpers/icons/antd_icons.d.ts.map +0 -1
  127. package/dist/helpers/icons/tabler_icons.d.ts +0 -4
  128. package/dist/helpers/icons/tabler_icons.d.ts.map +0 -1
  129. package/dist/ui/Fieldset.d.ts +0 -8
  130. package/dist/ui/Fieldset.d.ts.map +0 -1
  131. package/src/helpers/icons/antd_icons.ts +0 -1583
  132. package/src/helpers/icons/tabler_icons.ts +0 -5367
  133. package/src/ui/Fieldset.tsx +0 -31
@@ -61,6 +61,7 @@ function TreeActionBar(props: Props) {
61
61
  previousView,
62
62
  results,
63
63
  limit,
64
+ totalItems,
64
65
  } = useContext(ActionViewContext) as ActionViewContextType;
65
66
 
66
67
  const { parentContext = {}, treeExpandable, toolbar } = props;
@@ -162,9 +163,24 @@ function TreeActionBar(props: Props) {
162
163
  }
163
164
  }}
164
165
  />
166
+ {!treeExpandable && (
167
+ <ButtonWithBadge
168
+ icon={
169
+ <FilterOutlined
170
+ style={{ color: searchVisible ? "white" : undefined }}
171
+ />
172
+ }
173
+ tooltip={t("advanced_search")}
174
+ type={searchVisible ? "primary" : "default"}
175
+ onClick={() => {
176
+ setSearchVisible?.(!searchVisible);
177
+ }}
178
+ disabled={duplicatingItem || removingItem || treeIsLoading}
179
+ badgeNumber={searchParams?.length}
180
+ />
181
+ )}
165
182
  {separator()}
166
183
  <NewButton disabled={treeIsLoading} />
167
- {separator()}
168
184
  <ActionButton
169
185
  icon={<CopyOutlined />}
170
186
  tooltip={t("duplicate")}
@@ -190,22 +206,6 @@ function TreeActionBar(props: Props) {
190
206
  {separator()}
191
207
  </>
192
208
  )}
193
- {!treeExpandable && (
194
- <ButtonWithBadge
195
- icon={
196
- <FilterOutlined
197
- style={{ color: searchVisible ? "white" : undefined }}
198
- />
199
- }
200
- tooltip={t("advanced_search")}
201
- type={searchVisible ? "primary" : "default"}
202
- onClick={() => {
203
- setSearchVisible?.(!searchVisible);
204
- }}
205
- disabled={duplicatingItem || removingItem || treeIsLoading}
206
- badgeNumber={searchParams?.length}
207
- />
208
- )}
209
209
  <ActionButton
210
210
  icon={<InfoCircleOutlined />}
211
211
  tooltip={t("showLogs")}
@@ -289,11 +289,11 @@ function TreeActionBar(props: Props) {
289
289
  width="1em"
290
290
  height="1em"
291
291
  viewBox="0 0 24 24"
292
- stroke-width="1.5"
292
+ strokeWidth="1.5"
293
293
  fill="none"
294
294
  stroke="currentColor"
295
- stroke-linecap="round"
296
- stroke-linejoin="round"
295
+ strokeLinecap="round"
296
+ strokeLinejoin="round"
297
297
  >
298
298
  <path stroke="none" d="M0 0h24v24H0z" fill="none" />
299
299
  <ellipse cx="12" cy="6" rx="8" ry="3" />
@@ -351,14 +351,9 @@ function TreeActionBar(props: Props) {
351
351
  searchParams || []
352
352
  )}
353
353
  limit={limit}
354
- totalRegisters={results?.length || 0}
355
- selectedRegistersToExport={
356
- selectedRowItems &&
357
- selectedRowItems.length &&
358
- selectedRowItems.length > 0
359
- ? selectedRowItems.length
360
- : undefined
361
- }
354
+ totalRegisters={totalItems || 0}
355
+ selectedRegistersToExport={selectedRowItems}
356
+ visibleRegisters={results?.length || 0}
362
357
  context={parentContext}
363
358
  />
364
359
  </Space>
@@ -11,18 +11,19 @@ type DatePickerProps = WidgetProps & {
11
11
  showTime?: boolean;
12
12
  };
13
13
 
14
- const DatePickerConfig = {
14
+ export const DatePickerConfig = {
15
15
  date: {
16
16
  placeholder: "__/__/____",
17
- dateDisplayFormat: "YYYY-MM-DD",
17
+ dateDisplayFormat: "DD/MM/YYYY",
18
18
  dateInternalFormat: "YYYY-MM-DD",
19
19
  },
20
20
  time: {
21
21
  placeholder: "__/__/____ __:__:__",
22
- dateDisplayFormat: "YYYY-MM-DD HH:mm:ss",
22
+ dateDisplayFormat: "DD/MM/YYYY HH:mm:ss",
23
23
  dateInternalFormat: "YYYY-MM-DD HH:mm:ss",
24
24
  },
25
25
  };
26
+
26
27
  const DatePicker = (props: DatePickerProps) => {
27
28
  const { ooui, showTime = false } = props;
28
29
  const { required } = ooui;
@@ -11,7 +11,7 @@ export type ActionViewContextType = {
11
11
  setFormIsSaving?: (value: boolean) => void;
12
12
  formHasChanges?: boolean;
13
13
  setFormHasChanges?: (value: boolean) => void;
14
- onFormSave?: () => void;
14
+ onFormSave?: () => Promise<{ succeed: boolean; id: number }>;
15
15
  formRef?: any;
16
16
  searchTreeRef?: any;
17
17
  onNewClicked: () => void;
@@ -53,6 +53,7 @@ export type ActionViewContextType = {
53
53
  setSearchValues?: (value: any) => void;
54
54
  limit?: number;
55
55
  setLimit?: (value: number) => void;
56
+ setTitle?: (value: string) => void;
56
57
  };
57
58
 
58
59
  export const ActionViewContext =
@@ -66,7 +67,7 @@ const ActionViewProvider = (props: ActionViewProviderProps): any => {
66
67
  const {
67
68
  children,
68
69
  currentView,
69
- title,
70
+ title: titleProps,
70
71
  setCurrentView,
71
72
  availableViews,
72
73
  formRef,
@@ -106,6 +107,7 @@ const ActionViewProvider = (props: ActionViewProviderProps): any => {
106
107
  const [limit, setLimit] = useState<number>(
107
108
  limitProps !== undefined ? limitProps : DEFAULT_SEARCH_LIMIT
108
109
  );
110
+ const [title, setTitle] = useState<string>(titleProps);
109
111
 
110
112
  useEffect(() => {
111
113
  if (results && results.length > 0 && !currentItemIndex) {
@@ -139,8 +141,8 @@ const ActionViewProvider = (props: ActionViewProviderProps): any => {
139
141
  }
140
142
  }, [currentView]);
141
143
 
142
- const callOnFormSave = () => {
143
- (formRef.current as any)?.submitForm();
144
+ const callOnFormSave = async () => {
145
+ return await (formRef.current as any)?.submitForm();
144
146
  };
145
147
 
146
148
  return (
@@ -196,6 +198,7 @@ const ActionViewProvider = (props: ActionViewProviderProps): any => {
196
198
  setSearchValues,
197
199
  limit,
198
200
  setLimit,
201
+ setTitle,
199
202
  }}
200
203
  >
201
204
  {children}
@@ -43,15 +43,20 @@ type ActionModalOpts = {
43
43
  actionData?: any;
44
44
  };
45
45
 
46
- export const ContentRootContext = React.createContext<ContentRootContextType | null>(
47
- null
48
- );
46
+ export const ContentRootContext =
47
+ React.createContext<ContentRootContextType | null>(null);
49
48
 
50
49
  type ContentRootProviderProps = {
51
50
  children: React.ReactNode;
52
51
  globalValues?: any;
53
52
  };
54
53
 
54
+ const callRefreshValues = async (fns: any[]) => {
55
+ for (let i = 0; i < fns.length; i++) {
56
+ await fns?.[i]?.();
57
+ }
58
+ };
59
+
55
60
  const ContentRootProvider = (
56
61
  props: ContentRootProviderProps,
57
62
  ref: any
@@ -64,7 +69,7 @@ const ContentRootProvider = (
64
69
  TabManagerContext
65
70
  ) as TabManagerContextType;
66
71
  const { openAction } = tabManagerContext || {};
67
- const onRefreshParentValues = useRef<any>();
72
+ const onRefreshParentValues = useRef<any>([]);
68
73
  const { t } = useContext(LocaleContext) as LocaleContextType;
69
74
 
70
75
  useImperativeHandle(ref, () => ({
@@ -167,7 +172,7 @@ const ContentRootProvider = (
167
172
  onRefreshParentValues?: any;
168
173
  }) {
169
174
  const { type } = actionData;
170
- onRefreshParentValues.current = onRefreshParentValuesFn;
175
+ onRefreshParentValues.current.push(onRefreshParentValuesFn);
171
176
 
172
177
  if (type === "ir.actions.report.xml") {
173
178
  return await generateReport({
@@ -230,6 +235,7 @@ const ContentRootProvider = (
230
235
  fields,
231
236
  values: { ...values, ...globalValues },
232
237
  }),
238
+ fields,
233
239
  context: mergedContext,
234
240
  });
235
241
  }
@@ -347,7 +353,8 @@ const ContentRootProvider = (
347
353
  }
348
354
 
349
355
  async function onFormModalSucceed() {
350
- onRefreshParentValues.current?.();
356
+ callRefreshValues(onRefreshParentValues.current);
357
+ onRefreshParentValues.current = [];
351
358
  setActionModalVisible(false);
352
359
  setActionModalOptions({
353
360
  domain: undefined,
@@ -386,7 +393,8 @@ const ContentRootProvider = (
386
393
  visible={actionModalVisible}
387
394
  onSubmitSucceed={onFormModalSucceed}
388
395
  onCancel={() => {
389
- onRefreshParentValues.current?.();
396
+ callRefreshValues(onRefreshParentValues.current);
397
+ onRefreshParentValues.current = [];
390
398
  setActionModalVisible(false);
391
399
  setActionModalOptions({
392
400
  domain: undefined,
@@ -18,11 +18,10 @@ export type FormContextType = {
18
18
  getValues: () => Promise<any>;
19
19
  getPlainValues: () => { [key: string]: any };
20
20
  getFields: () => Promise<any>;
21
- setOriginalValue: (field: string, value: any) => void;
22
21
  domain: any[];
23
22
  submitForm?: (options?: {
24
23
  callOnSubmitSucceed?: boolean;
25
- }) => Promise<boolean>;
24
+ }) => Promise<{ succeed: boolean; id: number }>;
26
25
  fetchValues?: () => void;
27
26
  formHasChanges?: () => boolean;
28
27
  elementHasLostFocus?: () => void;
@@ -45,7 +44,6 @@ const FormProvider = (props: FormProviderProps): any => {
45
44
  getContext,
46
45
  getValues,
47
46
  getPlainValues,
48
- setOriginalValue,
49
47
  domain,
50
48
  submitForm,
51
49
  fetchValues,
@@ -67,7 +65,6 @@ const FormProvider = (props: FormProviderProps): any => {
67
65
  getFieldValue,
68
66
  executeButtonAction,
69
67
  getContext,
70
- setOriginalValue,
71
68
  submitForm,
72
69
  fetchValues,
73
70
  formHasChanges,
@@ -1,4 +1,5 @@
1
1
  import { One2manyItem } from "@/widgets/base/one2many/One2manyInput";
2
+ import { Form as FormOoui } from "@gisce/ooui";
2
3
 
3
4
  const filteredValues = (values: any, fields: any) => {
4
5
  if (!fields) {
@@ -100,15 +101,16 @@ export const getTouchedValues = ({
100
101
 
101
102
  export const checkFieldsType = ({
102
103
  changedFields,
103
- fields,
104
+ formOoui,
104
105
  types,
105
106
  }: {
106
107
  changedFields: string[];
107
- fields: any;
108
+ formOoui: FormOoui;
108
109
  types: string[];
109
110
  }) => {
110
111
  const valuesChecked = changedFields.map((key) => {
111
- return types.includes(fields[key]?.type);
112
+ const fieldType = formOoui?.findById(key)?.type!;
113
+ return types.includes(fieldType);
112
114
  });
113
115
  return valuesChecked.some((i) => i === true);
114
116
  };
@@ -152,16 +154,35 @@ export const getValuesForDomain = (domain: any[]) => {
152
154
  export const getOnChangePayload = ({
153
155
  onChangeFieldActionArgs,
154
156
  values,
157
+ parentValues = {},
155
158
  }: {
156
159
  onChangeFieldActionArgs: any[];
157
160
  values: any;
161
+ parentValues?: any;
158
162
  }) => {
159
163
  const payload: any = {};
160
164
  onChangeFieldActionArgs.forEach((arg: string) => {
161
- if (values[arg]) {
165
+ const splittedArg = arg.split("");
166
+
167
+ if (arg === "True") {
168
+ payload[arg] = true;
169
+ } else if (arg === "False") {
170
+ payload[arg] = false;
171
+ } else if (values[arg]) {
162
172
  payload[arg] = values[arg];
163
- } else if (arg[0] === "'") {
173
+ } else if (
174
+ splittedArg[0] === "'" &&
175
+ splittedArg[splittedArg.length - 1] === "'" &&
176
+ splittedArg.filter((i: string) => i === "'").length === 2
177
+ ) {
164
178
  payload[arg] = arg.replace(/'/g, "");
179
+ } else if (splittedArg.includes("'")) {
180
+ // This is a string with a variable in it.
181
+ // TODO: pending implement.
182
+ payload[arg] = arg;
183
+ } else if (arg.indexOf("parent.") !== -1) {
184
+ const parentKey = arg.replace("parent.", "");
185
+ payload[arg] = parentValues[parentKey] || false;
165
186
  } else {
166
187
  payload[arg] = false;
167
188
  }
@@ -1,112 +1,120 @@
1
1
  import React from "react";
2
+ import * as AntIcons from "@ant-design/icons";
3
+ import * as TablerIcons from "@tabler/icons-react";
2
4
  import Icon from "@ant-design/icons";
3
- import { AntIcons as Icons } from "./icons/antd_icons";
4
- import { TablerIcons } from "./icons/tabler_icons";
5
5
 
6
- const iconMapping: { [key: string]: React.ElementType } = {
7
- "terp-purchase": Icons.ShoppingCartOutlined,
8
- "terp-graph": Icons.PieChartOutlined,
9
- "terp-crm": Icons.ContactsOutlined,
10
- "terp-hr": TablerIcons.IconFriends,
11
- "terp-account": TablerIcons.IconBuildingBank,
12
- "terp-project": TablerIcons.IconChecklist,
13
- "terp-administration": TablerIcons.IconAdjustments,
14
- "terp-partner": Icons.TeamOutlined,
15
- "terp-mrp": Icons.BuildOutlined,
16
- "terp-product": Icons.ShoppingOutlined,
17
- STOCK_JUSTIFY_FILL: Icons.UnorderedListOutlined,
18
- STOCK_INDENT: TablerIcons.IconIndentIncrease,
19
- STOCK_HELP: Icons.QuestionOutlined,
20
- STOCK_GO_UP: Icons.ArrowUpOutlined,
21
- STOCK_SORT_DESCENDING: Icons.SortDescendingOutlined,
22
- STOCK_ADD: Icons.PlusOutlined,
23
- STOCK_GOTO_LAST: Icons.FastForwardOutlined,
24
- STOCK_FIND: Icons.SearchOutlined,
25
- STOCK_PROPERTIES: Icons.ControlOutlined,
26
- STOCK_DIALOG_INFO: Icons.InfoOutlined,
27
- STOCK_FLOPPY: Icons.UsbOutlined,
28
- STOCK_JUSTIFY_CENTER: Icons.AlignCenterOutlined,
29
- STOCK_GO_BACK: Icons.ArrowLeftOutlined,
30
- STOCK_UNDERLINE: Icons.UnderlineOutlined,
31
- STOCK_BOLD: Icons.BoldOutlined,
32
- STOCK_APPLY: Icons.CheckOutlined,
33
- STOCK_ZOOM_OUT: Icons.ZoomOutOutlined,
34
- STOCK_STRIKETHROUGH: Icons.StrikethroughOutlined,
35
- STOCK_MEDIA_REWIND: Icons.BackwardOutlined,
36
- STOCK_PRINT: Icons.PrinterOutlined,
37
- STOCK_NO: Icons.CloseOutlined,
38
- STOCK_GOTO_FIRST: Icons.FastBackwardOutlined,
39
- STOCK_CLOSE: Icons.CloseOutlined,
40
- STOCK_REMOVE: Icons.MinusOutlined,
41
- STOCK_CUT: Icons.ScissorOutlined,
42
- STOCK_DIALOG_AUTHENTICATION: Icons.SafetyOutlined,
43
- STOCK_ZOOM_FIT: Icons.ExpandOutlined,
44
- STOCK_JUMP_TO: Icons.SelectOutlined,
45
- STOCK_HARDDISK: Icons.HddOutlined,
46
- STOCK_SAVE_AS: Icons.SaveOutlined,
47
- STOCK_UNDO: Icons.UndoOutlined,
48
- STOCK_JUSTIFY_RIGHT: Icons.AlignRightOutlined,
49
- STOCK_DIALOG_ERROR: Icons.CloseCircleOutlined,
50
- STOCK_INDEX: Icons.ProfileOutlined,
51
- STOCK_GOTO_BOTTOM: Icons.VerticalAlignBottomOutlined,
52
- STOCK_MEDIA_NEXT: Icons.StepForwardOutlined,
53
- STOCK_REDO: Icons.RedoOutlined,
54
- STOCK_COPY: Icons.CopyOutlined,
55
- STOCK_MEDIA_PAUSE: Icons.PauseOutlined,
56
- STOCK_GO_FORWARD: Icons.ArrowRightOutlined,
57
- STOCK_UNDELETE: Icons.UndoOutlined,
58
- STOCK_EXECUTE: Icons.SettingOutlined,
59
- STOCK_SAVE: Icons.SaveOutlined,
60
- STOCK_DIALOG_QUESTION: Icons.QuestionCircleOutlined,
61
- STOCK_SORT_ASCENDING: Icons.SortAscendingOutlined,
62
- STOCK_REFRESH: Icons.ReloadOutlined,
63
- STOCK_MEDIA_FORWARD: Icons.ForwardOutlined,
64
- STOCK_STOP: Icons.BorderOutlined,
65
- STOCK_PRINT_PREVIEW: Icons.PrinterOutlined,
66
- STOCK_HOME: Icons.HomeOutlined,
67
- STOCK_PASTE: Icons.CarryOutOutlined,
68
- STOCK_ZOOM_100: Icons.ZoomInOutlined,
69
- STOCK_FIND_AND_REPLACE: Icons.FileSearchOutlined,
70
- STOCK_DIALOG_WARNING: Icons.WarningOutlined,
71
- STOCK_ZOOM_IN: Icons.ZoomInOutlined,
72
- STOCK_CONVERT: Icons.ExportOutlined,
73
- STOCK_ITALIC: Icons.ItalicOutlined,
74
- STOCK_YES: Icons.CheckOutlined,
75
- STOCK_MEDIA_PLAY: Icons.PlayCircleOutlined,
76
- STOCK_MEDIA_RECORD: Icons.VideoCameraOutlined,
77
- STOCK_MEDIA_PREVIOUS: Icons.StepBackwardOutlined,
78
- STOCK_NEW: Icons.FileAddOutlined,
79
- STOCK_CANCEL: Icons.CloseOutlined,
80
- STOCK_DISCONNECT: Icons.ApiOutlined,
81
- STOCK_JUSTIFY_LEFT: Icons.AlignLeftOutlined,
82
- STOCK_FILE: Icons.FileOutlined,
83
- STOCK_QUIT: Icons.LogoutOutlined,
84
- STOCK_EDIT: Icons.EditOutlined,
85
- STOCK_CONNECT: Icons.ApiOutlined,
86
- STOCK_GO_DOWN: Icons.CaretDownOutlined,
87
- STOCK_NETWORK: Icons.ApartmentOutlined,
88
- STOCK_OK: Icons.CheckOutlined,
89
- STOCK_GOTO_TOP: Icons.VerticalAlignTopOutlined,
90
- STOCK_ABOUT: Icons.StarOutlined,
91
- STOCK_COLOR_PICKER: Icons.AimOutlined,
92
- STOCK_SELECT_FONT: Icons.FontSizeOutlined,
93
- STOCK_DELETE: Icons.DeleteOutlined,
94
- STOCK_DND: Icons.FileTextOutlined,
95
- STOCK_CLEAR: Icons.CloseSquareOutlined,
96
- STOCK_UNINDENT: Icons.AlignLeftOutlined,
97
- STOCK_PREFERENCES: Icons.SettingOutlined,
6
+ type TablerKey = keyof typeof TablerIcons;
7
+ type AntKey = keyof typeof AntIcons;
8
+
9
+ const iconMapping: { [key: string]: string } = {
10
+ "terp-purchase": "ShoppingCart",
11
+ "terp-graph": "PieChart",
12
+ "terp-crm": "Contacts",
13
+ "terp-hr": "Friends",
14
+ "terp-account": "BuildingBank",
15
+ "terp-project": "Checklist",
16
+ "terp-administration": "Adjustments",
17
+ "terp-partner": "Team",
18
+ "terp-mrp": "Build",
19
+ "terp-product": "Shopping",
20
+ STOCK_JUSTIFY_FILL: "UnorderedList",
21
+ STOCK_INDENT: "IndentIncrease",
22
+ STOCK_HELP: "Question",
23
+ STOCK_GO_UP: "ArrowUp",
24
+ STOCK_SORT_DESCENDING: "SortDescending",
25
+ STOCK_ADD: "Plus",
26
+ STOCK_GOTO_LAST: "FastForward",
27
+ STOCK_FIND: "Search",
28
+ STOCK_PROPERTIES: "Control",
29
+ STOCK_DIALOG_INFO: "Info",
30
+ STOCK_FLOPPY: "Usb",
31
+ STOCK_JUSTIFY_CENTER: "AlignCenter",
32
+ STOCK_GO_BACK: "ArrowLeft",
33
+ STOCK_UNDERLINE: "Underline",
34
+ STOCK_BOLD: "Bold",
35
+ STOCK_APPLY: "Check",
36
+ STOCK_ZOOM_OUT: "ZoomOut",
37
+ STOCK_STRIKETHROUGH: "Strikethrough",
38
+ STOCK_MEDIA_REWIND: "Backward",
39
+ STOCK_PRINT: "Printer",
40
+ STOCK_NO: "Close",
41
+ STOCK_GOTO_FIRST: "FastBackward",
42
+ STOCK_CLOSE: "Close",
43
+ STOCK_REMOVE: "Minus",
44
+ STOCK_CUT: "Scissor",
45
+ STOCK_DIALOG_AUTHENTICATION: "Safety",
46
+ STOCK_ZOOM_FIT: "Expand",
47
+ STOCK_JUMP_TO: "Select",
48
+ STOCK_HARDDISK: "Hdd",
49
+ STOCK_SAVE_AS: "Save",
50
+ STOCK_UNDO: "Undo",
51
+ STOCK_JUSTIFY_RIGHT: "AlignRight",
52
+ STOCK_DIALOG_ERROR: "CloseCircle",
53
+ STOCK_INDEX: "Profile",
54
+ STOCK_GOTO_BOTTOM: "VerticalAlignBottom",
55
+ STOCK_MEDIA_NEXT: "StepForward",
56
+ STOCK_REDO: "Redo",
57
+ STOCK_COPY: "Copy",
58
+ STOCK_MEDIA_PAUSE: "Pause",
59
+ STOCK_GO_FORWARD: "ArrowRight",
60
+ STOCK_UNDELETE: "Undo",
61
+ STOCK_EXECUTE: "Setting",
62
+ STOCK_SAVE: "Save",
63
+ STOCK_DIALOG_QUESTION: "QuestionCircle",
64
+ STOCK_SORT_ASCENDING: "SortAscending",
65
+ STOCK_REFRESH: "Reload",
66
+ STOCK_MEDIA_FORWARD: "Forward",
67
+ STOCK_STOP: "Border",
68
+ STOCK_PRINT_PREVIEW: "Printer",
69
+ STOCK_HOME: "Home",
70
+ STOCK_PASTE: "CarryOut",
71
+ STOCK_ZOOM_100: "ZoomIn",
72
+ STOCK_FIND_AND_REPLACE: "FileSearch",
73
+ STOCK_DIALOG_WARNING: "Warning",
74
+ STOCK_ZOOM_IN: "ZoomIn",
75
+ STOCK_CONVERT: "Export",
76
+ STOCK_ITALIC: "Italic",
77
+ STOCK_YES: "Check",
78
+ STOCK_MEDIA_PLAY: "PlayCircle",
79
+ STOCK_MEDIA_RECORD: "VideoCamera",
80
+ STOCK_MEDIA_PREVIOUS: "StepBackward",
81
+ STOCK_NEW: "FileAdd",
82
+ STOCK_CANCEL: "Close",
83
+ STOCK_DISCONNECT: "Api",
84
+ STOCK_JUSTIFY_LEFT: "AlignLeft",
85
+ STOCK_FILE: "File",
86
+ STOCK_QUIT: "Logout",
87
+ STOCK_EDIT: "Edit",
88
+ STOCK_CONNECT: "Api",
89
+ STOCK_GO_DOWN: "CaretDown",
90
+ STOCK_NETWORK: "Apartment",
91
+ STOCK_OK: "Check",
92
+ STOCK_GOTO_TOP: "VerticalAlignTop",
93
+ STOCK_ABOUT: "Star",
94
+ STOCK_COLOR_PICKER: "Aim",
95
+ STOCK_SELECT_FONT: "FontSize",
96
+ STOCK_DELETE: "Delete",
97
+ STOCK_DND: "FileText",
98
+ STOCK_CLEAR: "CloseSquare",
99
+ STOCK_UNINDENT: "AlignLeft",
100
+ STOCK_PREFERENCES: "Setting",
98
101
  };
99
102
 
100
- export default (key: string): React.ElementType | undefined => {
103
+ export default (key: string, className?: any) => {
101
104
  if (key.indexOf("gtk-") !== -1) {
102
- const rootIcon = key.replace("gtk-", "").replace("-", "_");
103
- const newKey = `STOCK_${rootIcon.toUpperCase()}`;
104
- return iconMapping[newKey];
105
+ const rootIcon = key.replace("gtk-", "").replace(/\-/g, "_");
106
+ key = `STOCK_${rootIcon.toUpperCase()}`;
105
107
  }
108
+
106
109
  if (iconMapping.hasOwnProperty(key)) {
107
- return iconMapping[key];
110
+ return getIconForKey(iconMapping[key], className);
108
111
  }
109
- const IconCamelCase = `${key
112
+
113
+ return getIconForKey(key, className);
114
+ };
115
+
116
+ function toCamelCase(key: string): string {
117
+ return `${key
110
118
  .split("-")
111
119
  .map((word) =>
112
120
  word.replace(
@@ -115,18 +123,37 @@ export default (key: string): React.ElementType | undefined => {
115
123
  )
116
124
  )
117
125
  .join("")}`;
126
+ }
127
+
128
+ function getIconForKey(key: string, className?: any) {
129
+ let IconCamelCase = key.charAt(0).toUpperCase() + key.slice(1); // Capitalize first letter
130
+ if (IconCamelCase.indexOf("-") !== -1) {
131
+ IconCamelCase = toCamelCase(IconCamelCase);
132
+ }
118
133
 
119
- const antKey = `${IconCamelCase}Outlined`;
120
- if (Icons.hasOwnProperty(antKey)) {
121
- return Icons[antKey];
134
+ const antKey: AntKey = `${IconCamelCase}Outlined` as any;
135
+ if (AntIcons[antKey]) {
136
+ return () =>
137
+ React.createElement(AntIcons[antKey] as any, {
138
+ className,
139
+ });
122
140
  }
123
141
 
124
- const tablerKey = `Icon${IconCamelCase}`;
125
- if (TablerIcons.hasOwnProperty(tablerKey)) {
142
+ const tablerKey: TablerKey = `Icon${IconCamelCase}` as any;
143
+ if (TablerIcons[tablerKey]) {
144
+ const TablerIcon = () =>
145
+ React.createElement(TablerIcons[tablerKey] as any, {
146
+ fill: "transparent",
147
+ height: 17,
148
+ width: 17,
149
+ });
126
150
  const CustomIcon = () =>
127
- React.createElement(Icon, { component: TablerIcons[tablerKey] });
151
+ React.createElement(Icon, {
152
+ component: TablerIcon,
153
+ className,
154
+ });
128
155
  return CustomIcon;
129
156
  }
130
157
 
131
158
  return undefined;
132
- };
159
+ }