@gisce/react-ooui 1.2.7 → 1.2.8-rc.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.d.ts","sourceRoot":"","sources":["Tag.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAItC,eAAO,MAAM,GAAG,UAAW,WAAW,sBAMrC,CAAC;AAEF,eAAO,MAAM,QAAQ,UAAW,GAAG,6BASlC,CAAA"}
1
+ {"version":3,"file":"Tag.d.ts","sourceRoot":"","sources":["Tag.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAKtC,eAAO,MAAM,GAAG,UAAW,WAAW,sBAMrC,CAAC;AAEF,eAAO,MAAM,QAAQ,UAAW,GAAG,6BAiBlC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.d.ts","sourceRoot":"","sources":["Tree.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAKvE,OAAO,EAAE,QAAQ,EAAU,MAAM,SAAS,CAAC;AAuB3C,aAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,wBAAwB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf,CAAC;AAkHF,iBAAS,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CA4M9C;AAED,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Tree.d.ts","sourceRoot":"","sources":["Tree.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAKvE,OAAO,EAAE,QAAQ,EAAU,MAAM,SAAS,CAAC;AAwB3C,aAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC7C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,wBAAwB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf,CAAC;AA+GF,iBAAS,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CA2M9C;AAED,eAAe,IAAI,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gisce/react-ooui",
3
- "version": "1.2.7",
3
+ "version": "1.2.8-rc.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "src",
@@ -1,5 +1,5 @@
1
1
  import React, { useContext, useState } from "react";
2
- import { Space } from "antd";
2
+ import { Space, Spin } from "antd";
3
3
  import ChangeViewButton from "./ChangeViewButton";
4
4
  import {
5
5
  ActionViewContext,
@@ -151,6 +151,13 @@ function TreeActionBar(props: Props) {
151
151
 
152
152
  return (
153
153
  <Space wrap={true}>
154
+ {treeIsLoading && (
155
+ <>
156
+ <Spin />
157
+ {separator()}
158
+ {separator()}
159
+ </>
160
+ )}
154
161
  {treeExpandable ? null : (
155
162
  <>
156
163
  <SearchBar
@@ -248,6 +248,7 @@ export const transformPlainMany2Ones = ({
248
248
 
249
249
  export const colorFromString = (text: string) => {
250
250
  let hash = 0;
251
+ text = text.toString().padEnd(10, '0');
251
252
  for (let i = 0; i < text.length; i++) {
252
253
  hash = text.charCodeAt(i) + ((hash << 5) - hash);
253
254
  }
@@ -258,3 +259,47 @@ export const colorFromString = (text: string) => {
258
259
  }
259
260
  return hexColour;
260
261
  }
262
+
263
+ export const colorTextFromBackground = (color: string) => {
264
+ function getRGB(c: string): number {
265
+ return parseInt(c, 16) || parseInt(c)
266
+ }
267
+
268
+ function getsRGB(c: string ) {
269
+ return getRGB(c) / 255 <= 0.03928
270
+ ? getRGB(c) / 255 / 12.92
271
+ : Math.pow((getRGB(c) / 255 + 0.055) / 1.055, 2.4)
272
+ }
273
+
274
+ function getLuminance(hexColor: string) {
275
+ return (
276
+ 0.2126 * getsRGB(hexColor.substr(1, 2)) +
277
+ 0.7152 * getsRGB(hexColor.substr(3, 2)) +
278
+ 0.0722 * getsRGB(hexColor.substr(-2))
279
+ )
280
+ }
281
+
282
+ function getContrast(f: string, b: string) {
283
+ const L1 = getLuminance(f)
284
+ const L2 = getLuminance(b)
285
+ return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05)
286
+ }
287
+
288
+ function getTextColor(bgColor: string) {
289
+ const whiteContrast = getContrast(bgColor, '#ffffff')
290
+ const blackContrast = getContrast(bgColor, '#000000')
291
+
292
+ return whiteContrast > blackContrast ? '#ffffff' : '#000000'
293
+ }
294
+
295
+ return getTextColor(color);
296
+
297
+ }
298
+
299
+ export const colorsFromString = (text: string): any => {
300
+ const backgroundColor = colorFromString(text)
301
+ return {
302
+ backgroundColor,
303
+ textColor: colorTextFromBackground(backgroundColor)
304
+ }
305
+ }
@@ -278,6 +278,7 @@ export const useSearch = (opts: UseSearchOpts) => {
278
278
 
279
279
  const changeSort = useCallback(
280
280
  (newSorter: any) => {
281
+ if (JSON.stringify(newSorter) === JSON.stringify(sorter)) return;
281
282
  setSorter?.(newSorter);
282
283
  const sortedResults =
283
284
  newSorter !== undefined
@@ -2,7 +2,8 @@ import React from "react";
2
2
  import Field from "@/common/Field";
3
3
  import { WidgetProps } from "@/types";
4
4
  import { Tag as AntdTag } from 'antd';
5
- import { colorFromString } from "@/helpers/formHelper";
5
+ import { isPresetStatusColor } from 'antd/lib/_util/colors'
6
+ import { colorFromString, colorTextFromBackground } from "@/helpers/formHelper";
6
7
 
7
8
  export const Tag = (props: WidgetProps) => {
8
9
  return (
@@ -14,11 +15,19 @@ export const Tag = (props: WidgetProps) => {
14
15
 
15
16
  export const TagInput = (props: any) => {
16
17
  const {ooui, value} = props;
18
+ let formattedValue = value;
19
+ let colorValue = value;
20
+ if (ooui.selectionValues.size) {
21
+ formattedValue = ooui.selectionValues.get(value);
22
+ } else if (Array.isArray(value)) {
23
+ colorValue = value[0];
24
+ formattedValue = value[1];
25
+ }
17
26
  if (!value) {
18
27
  return null
19
28
  }
20
- const color = ooui.colors === "auto" ? colorFromString(value) : ooui.colors[value]
29
+ const color = ooui.colors === "auto" ? colorFromString(colorValue) : ooui.colors[colorValue] || colorFromString(colorValue);
21
30
  return (
22
- <AntdTag color={color}>{ooui.selectionValues.get(value)}</AntdTag>
31
+ <AntdTag color={color} style={isPresetStatusColor(color) ? {} : {color: colorTextFromBackground(color)}}>{formattedValue}</AntdTag>
23
32
  );
24
33
  }
@@ -181,9 +181,9 @@ function SearchTree(props: Props, ref: any) {
181
181
  setInitialFetchDone(true);
182
182
  } catch (error) {
183
183
  setInitialError(error);
184
+ setTreeIsLoading?.(false);
184
185
  } finally {
185
186
  setIsLoading(false);
186
- setTreeIsLoading?.(false);
187
187
  }
188
188
  };
189
189
 
@@ -24,6 +24,7 @@ import { Many2oneTree } from "../base/many2one/Many2oneTree";
24
24
  import { ReferenceTree } from "../base/ReferenceTree";
25
25
  import dayjs from "dayjs";
26
26
  import Avatar from "../custom/Avatar";
27
+ import { TagInput } from "../custom/Tag";
27
28
  import { DatePickerConfig } from "@/common/DatePicker";
28
29
 
29
30
  type Props = {
@@ -115,27 +116,21 @@ const imageComponent = (value: string): React.ReactElement => {
115
116
  };
116
117
 
117
118
  const TagComponent = (
118
- value: any,
119
+ value: any,
119
120
  key: string,
120
121
  ooui: any,
121
122
  context: any
122
123
  ): React.ReactElement => {
123
- return (
124
- <>
125
- {value ? <Tag color={ooui.colors[value]}>{ooui.selectionValues.get(value)}</Tag> : null}
126
- </>
127
- );
124
+ return <TagInput ooui={ooui} value={value} />
128
125
  };
129
126
 
130
127
  const SelectionComponent = (
131
- value: any,
128
+ value: any,
132
129
  key: string,
133
130
  ooui: any,
134
131
  context: any
135
132
  ): React.ReactElement => {
136
- return (
137
- <>{ooui.selectionValues.get(value)}</>
138
- );
133
+ return <>{ooui.selectionValues.get(value)}</>;
139
134
  };
140
135
 
141
136
  const referenceComponent = (
@@ -155,9 +150,12 @@ const referenceComponent = (
155
150
  );
156
151
  };
157
152
 
158
- const AvatarFn = (value: any, key:string, ooui: any, context: any): React.ReactElement => (
159
- <Avatar ooui={ooui} value={value} />
160
- )
153
+ const AvatarFn = (
154
+ value: any,
155
+ key: string,
156
+ ooui: any,
157
+ context: any
158
+ ): React.ReactElement => <Avatar ooui={ooui} value={value} />;
161
159
 
162
160
  function Tree(props: Props): React.ReactElement {
163
161
  const {
@@ -307,9 +305,7 @@ function Tree(props: Props): React.ReactElement {
307
305
  summary.push(`${sumField.label}: ${Math.round(total * 100) / 100}`);
308
306
  });
309
307
 
310
- return (
311
- <div className="p-1 pb-0 pl-2 mt-2 ">{summary.join(", ")}</div>
312
- );
308
+ return <div className="p-1 pb-0 pl-2 mt-2 ">{summary.join(", ")}</div>;
313
309
  }
314
310
 
315
311
  let dataTable;
@@ -332,11 +328,12 @@ function Tree(props: Props): React.ReactElement {
332
328
  ) : (
333
329
  <div>
334
330
  {pagination()}
331
+ {loading && <Spin className="pb-4" />}
335
332
  <GisceTable
336
333
  height={adjustedHeight!}
337
334
  columns={dataTable.columns}
338
335
  dataSource={items}
339
- loading={loading}
336
+ loading={false}
340
337
  loadingComponent={<Spin />}
341
338
  onRowStyle={(record: any) => {
342
339
  if (colorsForResults![record.id]) {