@qoretechnologies/reqraft 0.10.57 → 0.10.58-pr.129.g2af0cf5

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 (131) hide show
  1. package/design/FORM_ENGINE_COMPACT.md +23 -5
  2. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  3. package/dist/components/form/engine/CompactToolbar.js +2 -2
  4. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  5. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  6. package/dist/components/form/engine/FormEngine.js +71 -62
  7. package/dist/components/form/engine/FormEngine.js.map +1 -1
  8. package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
  9. package/dist/components/form/engine/OptionFieldMessages.js +6 -3
  10. package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
  11. package/dist/components/form/engine/readFirst.d.ts +16 -20
  12. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  13. package/dist/components/form/engine/readFirst.js +16 -49
  14. package/dist/components/form/engine/readFirst.js.map +1 -1
  15. package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -1
  16. package/dist/components/form/engine/variants/VariantCalmTable.js +1 -1
  17. package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -1
  18. package/dist/components/form/engine/variants/variantModel.d.ts.map +1 -1
  19. package/dist/components/form/engine/variants/variantModel.js +8 -3
  20. package/dist/components/form/engine/variants/variantModel.js.map +1 -1
  21. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  22. package/dist/components/form/expressions/builder/index.js +22 -13
  23. package/dist/components/form/expressions/builder/index.js.map +1 -1
  24. package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
  25. package/dist/components/form/fields/array/ArrayAuto.js +8 -0
  26. package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
  27. package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
  28. package/dist/components/form/fields/array/ArrayAutoField.js +8 -0
  29. package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
  30. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  31. package/dist/components/form/fields/auto/AutoFormField.js +4 -1
  32. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  33. package/dist/components/form/fields/binary/Binary.d.ts.map +1 -1
  34. package/dist/components/form/fields/binary/Binary.js +10 -0
  35. package/dist/components/form/fields/binary/Binary.js.map +1 -1
  36. package/dist/components/form/fields/emittedValues.d.ts +38 -0
  37. package/dist/components/form/fields/emittedValues.d.ts.map +1 -0
  38. package/dist/components/form/fields/emittedValues.js +67 -0
  39. package/dist/components/form/fields/emittedValues.js.map +1 -0
  40. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  41. package/dist/components/form/fields/long-string/LongString.js +24 -8
  42. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  43. package/dist/components/form/fields/number/Number.d.ts.map +1 -1
  44. package/dist/components/form/fields/number/Number.js +9 -0
  45. package/dist/components/form/fields/number/Number.js.map +1 -1
  46. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  47. package/dist/components/form/fields/rich-text/RichText.js +10 -0
  48. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  49. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  50. package/dist/components/form/fields/template/TemplateField.js +3 -1
  51. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  52. package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
  53. package/dist/components/smartEditor/useLspSession.js +8 -0
  54. package/dist/components/smartEditor/useLspSession.js.map +1 -1
  55. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts +21 -5
  56. package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -1
  57. package/dist/components/supportTicket/InterfaceReferenceTags.js +24 -8
  58. package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -1
  59. package/dist/components/supportTicket/ReferencePicker.d.ts +5 -4
  60. package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
  61. package/dist/components/supportTicket/ReferencePicker.js +27 -2
  62. package/dist/components/supportTicket/ReferencePicker.js.map +1 -1
  63. package/dist/components/supportTicket/meta.d.ts +16 -0
  64. package/dist/components/supportTicket/meta.d.ts.map +1 -1
  65. package/dist/components/supportTicket/meta.js +6 -1
  66. package/dist/components/supportTicket/meta.js.map +1 -1
  67. package/dist/components/supportTicket/useLoadedImages.d.ts +18 -0
  68. package/dist/components/supportTicket/useLoadedImages.d.ts.map +1 -0
  69. package/dist/components/supportTicket/useLoadedImages.js +72 -0
  70. package/dist/components/supportTicket/useLoadedImages.js.map +1 -0
  71. package/dist/components/ticketReferences/TicketReferences.d.ts +9 -5
  72. package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
  73. package/dist/components/ticketReferences/TicketReferences.js +22 -9
  74. package/dist/components/ticketReferences/TicketReferences.js.map +1 -1
  75. package/dist/components/ticketThread/TicketThread.d.ts +10 -6
  76. package/dist/components/ticketThread/TicketThread.d.ts.map +1 -1
  77. package/dist/components/ticketThread/TicketThread.js +2 -2
  78. package/dist/components/ticketThread/TicketThread.js.map +1 -1
  79. package/dist/helpers/allowedValues.d.ts +71 -0
  80. package/dist/helpers/allowedValues.d.ts.map +1 -0
  81. package/dist/helpers/allowedValues.js +183 -0
  82. package/dist/helpers/allowedValues.js.map +1 -0
  83. package/dist/helpers/common.d.ts +7 -0
  84. package/dist/helpers/common.d.ts.map +1 -1
  85. package/dist/helpers/common.js +16 -1
  86. package/dist/helpers/common.js.map +1 -1
  87. package/dist/helpers/expressions.d.ts +13 -0
  88. package/dist/helpers/expressions.d.ts.map +1 -1
  89. package/dist/helpers/expressions.js +23 -1
  90. package/dist/helpers/expressions.js.map +1 -1
  91. package/dist/helpers/validations.d.ts.map +1 -1
  92. package/dist/helpers/validations.js +14 -0
  93. package/dist/helpers/validations.js.map +1 -1
  94. package/dist/utils/fetch.d.ts +4 -0
  95. package/dist/utils/fetch.d.ts.map +1 -1
  96. package/dist/utils/fetch.js +6 -1
  97. package/dist/utils/fetch.js.map +1 -1
  98. package/package.json +1 -1
  99. package/src/components/form/engine/CompactToolbar.tsx +8 -3
  100. package/src/components/form/engine/FormEngine.stories.tsx +206 -13
  101. package/src/components/form/engine/FormEngine.tsx +70 -57
  102. package/src/components/form/engine/OptionFieldMessages.tsx +7 -5
  103. package/src/components/form/engine/readFirst.ts +19 -50
  104. package/src/components/form/engine/variants/VariantCalmTable.tsx +3 -1
  105. package/src/components/form/engine/variants/variantModel.ts +10 -3
  106. package/src/components/form/expressions/builder/index.tsx +15 -2
  107. package/src/components/form/fields/array/ArrayAuto.tsx +10 -1
  108. package/src/components/form/fields/array/ArrayAutoField.tsx +10 -1
  109. package/src/components/form/fields/auto/AutoFormField.tsx +4 -1
  110. package/src/components/form/fields/binary/Binary.tsx +10 -0
  111. package/src/components/form/fields/emittedValues.ts +62 -0
  112. package/src/components/form/fields/long-string/LongString.tsx +28 -8
  113. package/src/components/form/fields/number/Number.tsx +9 -0
  114. package/src/components/form/fields/rich-text/RichText.tsx +10 -0
  115. package/src/components/form/fields/template/TemplateField.tsx +4 -1
  116. package/src/components/smartEditor/useLspSession.ts +8 -0
  117. package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +86 -0
  118. package/src/components/supportTicket/InterfaceReferenceTags.tsx +44 -11
  119. package/src/components/supportTicket/ReferencePicker.stories.tsx +65 -0
  120. package/src/components/supportTicket/ReferencePicker.tsx +26 -5
  121. package/src/components/supportTicket/TicketReplyBox.stories.tsx +5 -2
  122. package/src/components/supportTicket/__fixtures__/kindMarks.ts +28 -0
  123. package/src/components/supportTicket/meta.ts +21 -0
  124. package/src/components/supportTicket/useLoadedImages.ts +73 -0
  125. package/src/components/ticketReferences/TicketReferences.tsx +27 -7
  126. package/src/components/ticketThread/TicketThread.tsx +11 -3
  127. package/src/helpers/allowedValues.ts +216 -0
  128. package/src/helpers/common.ts +14 -0
  129. package/src/helpers/expressions.ts +25 -0
  130. package/src/helpers/validations.ts +16 -0
  131. package/src/utils/fetch.ts +10 -1
@@ -100,3 +100,28 @@ export const areQorusTypesCompatible = (
100
100
  // If none of the types are compatible return false
101
101
  return false;
102
102
  };
103
+
104
+ /**
105
+ * Whether an operation is offered where its result must be of `returnType`: a condition (`bool`) is
106
+ * built from the operations that give true or false, not from every operation the server has.
107
+ *
108
+ * Only a condition narrows the list. Any other type keeps every operation: a value of one type is often
109
+ * made from an operation that gives another (text from rich text, a number from an int), and the
110
+ * mismatch message after the choice says when it does not fit. An operation whose result is known
111
+ * only once it is built (`any`, or the type of its first argument) is offered everywhere.
112
+ */
113
+ export const expressionFitsReturnType = (
114
+ returnType: string | string[] | undefined,
115
+ expression: { ui_return_type?: string; return_type_first_arg?: boolean }
116
+ ): boolean => {
117
+ const types = isArray(returnType) ? returnType : returnType ? [returnType] : [];
118
+ const condition = types.length > 0 && types.every((type) => /^\*?(bool|boolean)$/.test(type));
119
+ if (!condition) {
120
+ return true;
121
+ }
122
+ const result = expression.ui_return_type;
123
+ if (expression.return_type_first_arg || !result || result === 'any' || result === 'auto') {
124
+ return true;
125
+ }
126
+ return /^\*?(bool|boolean)$/.test(result);
127
+ };
@@ -16,6 +16,7 @@ import { isOptionInterfaceUiType } from './optionUiTypes';
16
16
  import { getListElementValue, getOptionsFromRequiredGroups } from './options';
17
17
  import { IProviderType, TVariableActionValue, maybeBuildOptionProvider } from './providerValue';
18
18
  import { getTemplateKey, getTemplateValue, isValueTemplate } from './templates';
19
+ import { getUnlistedChoiceReason } from './allowedValues';
19
20
 
20
21
  /** The five cron fields, in order, as a schedule hash may name them. */
21
22
  const CRON_FIELDS: [string, string][] = [
@@ -309,6 +310,21 @@ export const _validateField = (
309
310
  }
310
311
  }
311
312
 
313
+ // A value that is not one of the field's fixed choices is INVALID — never
314
+ // erased. The form used to drop such a value when the choices arrived, and
315
+ // three times the dropped value was a real one (a document naming a choice,
316
+ // a bare-declared choice, a value whose choices had not loaded yet) that the
317
+ // emptied form then saved. Keeping it and saying why it cannot be submitted
318
+ // leaves the author to decide. Templates and expression values returned
319
+ // above; `allowed_values: []` and creatable choices are not judged. An
320
+ // `expression` is never judged either: the expression branch above recurses
321
+ // here with the field's schema (choices included) and the AST as the value.
322
+ const unlistedChoiceReason =
323
+ type === 'expression' ? undefined : getUnlistedChoiceReason(value, field);
324
+ if (unlistedChoiceReason) {
325
+ return invalidResult(unlistedChoiceReason);
326
+ }
327
+
312
328
  // An interface type names another Qorus object by its name, so a non-empty
313
329
  // string is the whole contract. `connection` is the exception: it carries
314
330
  // enablement and authentication state of its own, checked below.
@@ -12,6 +12,10 @@ export interface IReqraftFetchResponse<T> {
12
12
  data: T;
13
13
  ok: boolean;
14
14
  code?: number;
15
+ /**
16
+ * Set on every non-ok response: the HTTP reason phrase, or `HTTP <status>`
17
+ * when there is none (always the case over HTTP/2).
18
+ */
15
19
  error?: any;
16
20
  /**
17
21
  * The parsed error body on a non-ok response, when the server sent JSON.
@@ -335,7 +339,12 @@ export async function query<T>({
335
339
  data: requestData.data,
336
340
  ok: false,
337
341
  code: requestData.status,
338
- error: requestData.statusText,
342
+ // Never empty: HTTP/2 has no reason phrase, so `statusText` is always ''
343
+ // there, and an empty `error` reads as "no error" to every caller that
344
+ // tests it for truthiness - `useFetch` consumers then saw a failed request
345
+ // as one still loading, forever (a 403 left a dashboard panel on its
346
+ // skeleton).
347
+ error: requestData.statusText || `HTTP ${requestData.status}`,
339
348
  // Only when the body really was JSON: `data` is `{}` for a non-JSON body,
340
349
  // and an empty object masquerading as a parsed error tells a caller
341
350
  // nothing while looking like it did.