@journeyapps-labs/reactor-mod-data-browser 3.2.1 → 3.4.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.
Files changed (126) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/@types/actions/schema-model/ViewHasManyAction.d.ts +12 -0
  3. package/dist/@types/core/AbstractConnection.d.ts +12 -0
  4. package/dist/@types/core/SchemaModelDefinition.d.ts +12 -5
  5. package/dist/@types/core/query/StandardModelFields.d.ts +4 -0
  6. package/dist/@types/core/query/query-simple/SimpleQueryFilterState.d.ts +4 -6
  7. package/dist/@types/core/query/widgets/BelongsToDisplayWidget.d.ts +1 -0
  8. package/dist/@types/core/query/widgets/ColumnDisplayWidget.d.ts +1 -0
  9. package/dist/@types/core/query/widgets/IDCellDisplayWidget.d.ts +5 -0
  10. package/dist/@types/core/query/widgets/PeekRelationshipButton.d.ts +1 -0
  11. package/dist/@types/core/query/widgets/SmartBelongsToDisplayWidget.d.ts +2 -0
  12. package/dist/@types/core/query/widgets/SmartColumnWidget.d.ts +8 -3
  13. package/dist/@types/core/query/widgets/SmartFilterWidget.d.ts +6 -0
  14. package/dist/@types/core/types/ManualConnection.d.ts +1 -0
  15. package/dist/@types/entities/ConnectionEntityDefinition.d.ts +2 -1
  16. package/dist/@types/entities/SchemaModelObjectEntityDefinition.d.ts +2 -1
  17. package/dist/@types/forms/types/belongs-to-filter.d.ts +10 -0
  18. package/dist/@types/forms/types/shared/type-handler.d.ts +1 -0
  19. package/dist/@types/forms/types/shared/ui.d.ts +12 -0
  20. package/dist/@types/panels/query/QueryPanelFactory.d.ts +2 -2
  21. package/dist/DataBrowserModule.js +2 -0
  22. package/dist/DataBrowserModule.js.map +1 -1
  23. package/dist/actions/schema-model/ViewHasManyAction.js +112 -0
  24. package/dist/actions/schema-model/ViewHasManyAction.js.map +1 -0
  25. package/dist/core/AbstractConnection.js +58 -5
  26. package/dist/core/AbstractConnection.js.map +1 -1
  27. package/dist/core/SchemaModelDefinition.js +70 -12
  28. package/dist/core/SchemaModelDefinition.js.map +1 -1
  29. package/dist/core/query/StandardModelFields.js +3 -0
  30. package/dist/core/query/StandardModelFields.js.map +1 -1
  31. package/dist/core/query/query-simple/SimpleQueryColumns.js +37 -12
  32. package/dist/core/query/query-simple/SimpleQueryColumns.js.map +1 -1
  33. package/dist/core/query/query-simple/SimpleQueryFilterState.js +35 -7
  34. package/dist/core/query/query-simple/SimpleQueryFilterState.js.map +1 -1
  35. package/dist/core/query/query-simple/SimpleQuerySortState.js +0 -1
  36. package/dist/core/query/query-simple/SimpleQuerySortState.js.map +1 -1
  37. package/dist/core/query/widgets/BelongsToDisplayWidget.js +1 -1
  38. package/dist/core/query/widgets/BelongsToDisplayWidget.js.map +1 -1
  39. package/dist/core/query/widgets/ColumnDisplayWidget.js +13 -2
  40. package/dist/core/query/widgets/ColumnDisplayWidget.js.map +1 -1
  41. package/dist/core/query/widgets/IDCellDisplayWidget.js +33 -0
  42. package/dist/core/query/widgets/IDCellDisplayWidget.js.map +1 -0
  43. package/dist/core/query/widgets/PeekRelationshipButton.js +23 -16
  44. package/dist/core/query/widgets/PeekRelationshipButton.js.map +1 -1
  45. package/dist/core/query/widgets/SmartBelongsToDisplayWidget.js +1 -1
  46. package/dist/core/query/widgets/SmartBelongsToDisplayWidget.js.map +1 -1
  47. package/dist/core/query/widgets/SmartColumnWidget.js +7 -14
  48. package/dist/core/query/widgets/SmartColumnWidget.js.map +1 -1
  49. package/dist/core/query/widgets/SmartFilterWidget.js +10 -7
  50. package/dist/core/query/widgets/SmartFilterWidget.js.map +1 -1
  51. package/dist/core/types/ManualConnection.js +3 -0
  52. package/dist/core/types/ManualConnection.js.map +1 -1
  53. package/dist/entities/ConnectionEntityDefinition.js +29 -6
  54. package/dist/entities/ConnectionEntityDefinition.js.map +1 -1
  55. package/dist/entities/SchemaModelObjectEntityDefinition.js +15 -14
  56. package/dist/entities/SchemaModelObjectEntityDefinition.js.map +1 -1
  57. package/dist/forms/types/attachment-handler.js +1 -0
  58. package/dist/forms/types/attachment-handler.js.map +1 -1
  59. package/dist/forms/types/belongs-to-filter.js +57 -0
  60. package/dist/forms/types/belongs-to-filter.js.map +1 -0
  61. package/dist/forms/types/boolean-handler.js +34 -1
  62. package/dist/forms/types/boolean-handler.js.map +1 -1
  63. package/dist/forms/types/date-handler.js +1 -0
  64. package/dist/forms/types/date-handler.js.map +1 -1
  65. package/dist/forms/types/image-handler.js +1 -0
  66. package/dist/forms/types/image-handler.js.map +1 -1
  67. package/dist/forms/types/location-handler.js +1 -0
  68. package/dist/forms/types/location-handler.js.map +1 -1
  69. package/dist/forms/types/multiple-choice-handler.js +1 -0
  70. package/dist/forms/types/multiple-choice-handler.js.map +1 -1
  71. package/dist/forms/types/multiple-choice-integer-handler.js +1 -0
  72. package/dist/forms/types/multiple-choice-integer-handler.js.map +1 -1
  73. package/dist/forms/types/number-handler.js +3 -2
  74. package/dist/forms/types/number-handler.js.map +1 -1
  75. package/dist/forms/types/single-choice-handler.js +1 -0
  76. package/dist/forms/types/single-choice-handler.js.map +1 -1
  77. package/dist/forms/types/single-choice-integer-handler.js +1 -0
  78. package/dist/forms/types/single-choice-integer-handler.js.map +1 -1
  79. package/dist/forms/types/text-handler.js +1 -0
  80. package/dist/forms/types/text-handler.js.map +1 -1
  81. package/dist/panels/model-json/ModelJsonPanelWidget.js +4 -3
  82. package/dist/panels/model-json/ModelJsonPanelWidget.js.map +1 -1
  83. package/dist/panels/query/QueryPanelFactory.js.map +1 -1
  84. package/dist/panels/query/table-controls/FilterControlsWidget.js +1 -0
  85. package/dist/panels/query/table-controls/FilterControlsWidget.js.map +1 -1
  86. package/dist/stores/ConnectionStore.js +15 -3
  87. package/dist/stores/ConnectionStore.js.map +1 -1
  88. package/dist/tsconfig.tsbuildinfo +1 -1
  89. package/dist-module/bundle.js +51 -35
  90. package/dist-module/bundle.js.map +1 -1
  91. package/package.json +4 -4
  92. package/src/DataBrowserModule.ts +2 -0
  93. package/src/actions/schema-model/ViewHasManyAction.ts +114 -0
  94. package/src/core/AbstractConnection.ts +45 -2
  95. package/src/core/SchemaModelDefinition.ts +90 -14
  96. package/src/core/query/StandardModelFields.ts +8 -0
  97. package/src/core/query/query-simple/SimpleQueryColumns.tsx +50 -14
  98. package/src/core/query/query-simple/SimpleQueryFilterState.ts +42 -9
  99. package/src/core/query/query-simple/SimpleQuerySortState.ts +0 -1
  100. package/src/core/query/widgets/BelongsToDisplayWidget.tsx +2 -1
  101. package/src/core/query/widgets/ColumnDisplayWidget.tsx +17 -4
  102. package/src/core/query/widgets/IDCellDisplayWidget.tsx +46 -0
  103. package/src/core/query/widgets/PeekRelationshipButton.tsx +23 -16
  104. package/src/core/query/widgets/SmartBelongsToDisplayWidget.tsx +3 -0
  105. package/src/core/query/widgets/SmartColumnWidget.tsx +27 -23
  106. package/src/core/query/widgets/SmartFilterWidget.tsx +14 -5
  107. package/src/core/types/ManualConnection.ts +4 -0
  108. package/src/entities/ConnectionEntityDefinition.tsx +32 -4
  109. package/src/entities/SchemaModelObjectEntityDefinition.ts +17 -15
  110. package/src/forms/types/attachment-handler.tsx +1 -0
  111. package/src/forms/types/belongs-to-filter.tsx +84 -0
  112. package/src/forms/types/boolean-handler.tsx +46 -2
  113. package/src/forms/types/date-handler.tsx +1 -0
  114. package/src/forms/types/image-handler.tsx +1 -0
  115. package/src/forms/types/location-handler.tsx +1 -0
  116. package/src/forms/types/multiple-choice-handler.tsx +1 -0
  117. package/src/forms/types/multiple-choice-integer-handler.tsx +1 -0
  118. package/src/forms/types/number-handler.tsx +3 -2
  119. package/src/forms/types/shared/type-handler.ts +1 -0
  120. package/src/forms/types/single-choice-handler.tsx +1 -0
  121. package/src/forms/types/single-choice-integer-handler.tsx +1 -0
  122. package/src/forms/types/text-handler.tsx +1 -0
  123. package/src/panels/model-json/ModelJsonPanelWidget.tsx +8 -6
  124. package/src/panels/query/QueryPanelFactory.tsx +2 -2
  125. package/src/panels/query/table-controls/FilterControlsWidget.tsx +1 -0
  126. package/src/stores/ConnectionStore.ts +17 -6
@@ -1,4 +1,4 @@
1
- import { NumberType, Variable } from '@journeyapps/db';
1
+ import { IntegerType, NumberType, Variable } from '@journeyapps/db';
2
2
  import { DialogStore2, FormInput, NumberInput, ioc } from '@journeyapps-labs/reactor-mod';
3
3
  import { TypeHandler } from './shared/type-handler';
4
4
  import { Condition, SimpleFilter, Statement, StatementMatch } from '../../core/query/filters';
@@ -68,7 +68,8 @@ class NumberFilterForm extends ConditionalFilterForm<number> {
68
68
  }
69
69
 
70
70
  export const numberHandler: TypeHandler = {
71
- matches: (type) => type instanceof NumberType,
71
+ matches: (type) => type instanceof NumberType || type instanceof IntegerType,
72
+ getTypeLabel: (type) => (type instanceof IntegerType ? 'Integer' : 'Number'),
72
73
  encode: async (value: number) => value,
73
74
  decode: async (value: number) => value,
74
75
  encodeToScalar: async (value: number) => value,
@@ -9,6 +9,7 @@ export type ScalarValue = string | number | boolean | null;
9
9
 
10
10
  export interface TypeHandler<T extends Type = Type, ENCODED = any, DECODED = any> {
11
11
  matches: (type: Type) => boolean;
12
+ getTypeLabel?: (type: T) => string;
12
13
  generateField: (event: { label: string; name: string; type: T }) => FormInput;
13
14
  generateDisplay: (event: {
14
15
  label: string;
@@ -6,6 +6,7 @@ import { Condition, SimpleFilter, Statement } from '../../core/query/filters';
6
6
 
7
7
  export const singleChoiceHandler: TypeHandler = {
8
8
  matches: (type) => type instanceof SingleChoiceType,
9
+ getTypeLabel: () => 'Single choice',
9
10
  encode: async (value: string) => value,
10
11
  decode: async (value: string) => value,
11
12
  encodeToScalar: async (value: string) => value,
@@ -6,6 +6,7 @@ import { Condition, SimpleFilter, Statement } from '../../core/query/filters';
6
6
 
7
7
  export const singleChoiceIntegerHandler: TypeHandler = {
8
8
  matches: (type) => type instanceof SingleChoiceIntegerType,
9
+ getTypeLabel: () => 'Single choice integer',
9
10
  encode: async (value: string) => parseInt(value),
10
11
  decode: async (value: number) => `${value}`,
11
12
  encodeToScalar: async (value: string) => value,
@@ -150,6 +150,7 @@ class TextFilterForm extends ConditionalFilterForm<string> {
150
150
  export const textHandler = (context: TypeHandlerContext): TypeHandler<TextType, string, string> => {
151
151
  return {
152
152
  matches: (type) => type instanceof TextType,
153
+ getTypeLabel: () => 'Text',
153
154
  encode: async (value: string) => value,
154
155
  decode: async (value: string) => value,
155
156
  encodeToScalar: async (value: string) => value,
@@ -1,9 +1,9 @@
1
1
  import * as React from 'react';
2
- import { useEffect, useState } from 'react';
2
+ import { JSX, useEffect, useState } from 'react';
3
3
  import { observer } from 'mobx-react';
4
4
  import styled from '@emotion/styled';
5
5
  import { BorderLayoutWidget, LoadingPanelWidget, PanelToolbarWidget } from '@journeyapps-labs/reactor-mod';
6
- import { saveFile, copyTextToClipboard } from '@journeyapps-labs/lib-reactor-utils';
6
+ import { copyTextToClipboard, saveFile } from '@journeyapps-labs/lib-reactor-utils';
7
7
  import { ModelJsonPanelModel } from './ModelJsonPanelFactory';
8
8
  import { SimpleEditorWidget } from '@journeyapps-labs/reactor-mod-editor';
9
9
 
@@ -25,7 +25,7 @@ namespace S {
25
25
  }
26
26
 
27
27
  export const ModelJsonPanelWidget: React.FC<QueryPanelWidgetProps> = observer((props) => {
28
- const [json, setJson] = useState(null);
28
+ const [json, setJson] = useState<string | null>(null);
29
29
 
30
30
  useEffect(() => {
31
31
  if (!props.model?.model?.data) {
@@ -39,8 +39,8 @@ export const ModelJsonPanelWidget: React.FC<QueryPanelWidgetProps> = observer((p
39
39
  }
40
40
  }, [props.model.model?.data]);
41
41
 
42
- let top = null;
43
- if (props.model.model) {
42
+ let top: JSX.Element;
43
+ if (props.model.model && json) {
44
44
  top = (
45
45
  <PanelToolbarWidget
46
46
  btns={[
@@ -67,6 +67,8 @@ export const ModelJsonPanelWidget: React.FC<QueryPanelWidgetProps> = observer((p
67
67
  label: 'ID',
68
68
  value: props.model?.id
69
69
  },
70
+
71
+ // @ts-ignore FIXME, this can take null
70
72
  props.model?.field
71
73
  ? {
72
74
  label: 'Field',
@@ -83,7 +85,7 @@ export const ModelJsonPanelWidget: React.FC<QueryPanelWidgetProps> = observer((p
83
85
  {() => {
84
86
  return (
85
87
  <BorderLayoutWidget top={top}>
86
- <S.SimpleEditor lang="application/json" path={`${props.model.model.id}`} text={json} />
88
+ <S.SimpleEditor lang="application/json" path={`${props.model.model.id}`} text={json!} />
87
89
  </BorderLayoutWidget>
88
90
  );
89
91
  }}
@@ -4,7 +4,7 @@ import { QueryPanelWidget } from './QueryPanelWidget';
4
4
  import { AbstractQuery } from '../../core/query/AbstractQuery';
5
5
  import { ConnectionStore } from '../../stores/ConnectionStore';
6
6
  import { observable } from 'mobx';
7
- import { WorkspaceModelFactoryEvent } from '@projectstorm/react-workspaces-core';
7
+ import { WorkspaceEngine, WorkspaceModelFactoryEvent } from '@projectstorm/react-workspaces-core';
8
8
  import { AbstractSerializableQuery } from '../../core/query/AbstractSerializableQuery';
9
9
  import { SavedQueryStore } from '../../stores/SavedQueryStore';
10
10
  import { AbstractConnection } from '../../core/AbstractConnection';
@@ -48,7 +48,7 @@ export class QueryPanelModel extends ReactorPanelModel {
48
48
  };
49
49
  }
50
50
 
51
- fromArray(data: ReturnType<this['toArray']>, engine) {
51
+ fromArray(data: ReturnType<this['toArray']>, engine: WorkspaceEngine) {
52
52
  super.fromArray(data, engine);
53
53
  this.current_page = data.current_page || 0;
54
54
  }
@@ -31,6 +31,7 @@ export const FilterControlsWidget: React.FC<FilterControlsWidgetProps> = (props)
31
31
  return {
32
32
  key: field.key,
33
33
  title: field.label,
34
+ group: field.group,
34
35
  action: async () => {
35
36
  await props.simpleQuery.filterState.setupFilterForField(field.key, event.nativeEvent as any);
36
37
  props.goToPage?.(0);
@@ -1,6 +1,6 @@
1
1
  import { AbstractStore, LocalStorageSerializer } from '@journeyapps-labs/reactor-mod';
2
2
  import { AbstractConnection, AbstractConnectionSerialized } from '../core/AbstractConnection';
3
- import { action, computed, observable, runInAction, when } from 'mobx';
3
+ import { computed, observable, runInAction, when } from 'mobx';
4
4
  import { AbstractConnectionFactory } from '../core/AbstractConnectionFactory';
5
5
  import { getDefaultConnectionColor } from '../core/connection-colors';
6
6
 
@@ -51,9 +51,18 @@ export class ConnectionStore extends AbstractStore<ConnectionStoreSerialized> {
51
51
  }
52
52
 
53
53
  async deserializeConnection(data: AbstractConnectionSerialized) {
54
- let conn = this._connectionFactories.get(data.factory).generateConnection();
54
+ let conn = this._connectionFactories.get(data.factory)?.generateConnection();
55
+ if (!conn) {
56
+ return null;
57
+ }
58
+
55
59
  conn.id = data.id;
56
- await conn._deSerialize(data.payload);
60
+ try {
61
+ await conn._deSerialize(data.payload);
62
+ } catch (ex) {
63
+ this.logger.error(`Failed to deserialize connection: [${conn.id}]`, ex);
64
+ return null;
65
+ }
57
66
  conn.color = data.color || getDefaultConnectionColor(conn.id);
58
67
  return conn;
59
68
  }
@@ -66,9 +75,11 @@ export class ConnectionStore extends AbstractStore<ConnectionStoreSerialized> {
66
75
  return this.deserializeConnection(connSer);
67
76
  })
68
77
  );
69
- connections.forEach((c) => {
70
- this.addConnection(c);
71
- });
78
+ connections
79
+ .filter((c) => !!c)
80
+ .forEach((c) => {
81
+ this.addConnection(c);
82
+ });
72
83
  });
73
84
  }
74
85