@zohodesk/library-platform 1.0.2-exp.1.1 → 1.0.2-exp.1.2

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 (78) hide show
  1. package/es/bc/zlist/Constants.js +1 -0
  2. package/es/cc/action-icon/Properties.js +6 -46
  3. package/es/cc/component/properties/slotName.js +1 -0
  4. package/es/cc/fields/coloured-multi-select/Events.js +3 -0
  5. package/es/cc/fields/coloured-multi-select/Model.js +18 -0
  6. package/es/cc/fields/coloured-multi-select/Properties.js +37 -0
  7. package/es/cc/fields/coloured-pick-list/Events.js +3 -0
  8. package/es/cc/fields/coloured-pick-list/Model.js +16 -0
  9. package/es/cc/fields/coloured-pick-list/Properties.js +37 -0
  10. package/es/cc/fields/field/Types.js +2 -0
  11. package/es/cc/fields/index.js +2 -0
  12. package/es/cc/fields/multi-select/Model.js +2 -0
  13. package/es/cc/fields/multi-select/Properties.js +2 -4
  14. package/es/cc/fields/pick-list/Model.js +1 -3
  15. package/es/cc/fields/pick-list/Properties.js +1 -3
  16. package/es/cc/table-column-sort/Constants.js +1 -0
  17. package/es/cc/table-column-sort/Properties.js +30 -0
  18. package/es/cc/table-column-sort/index.js +3 -0
  19. package/es/cc/table-connected/constants/Events.js +2 -0
  20. package/es/cc/table-list/Properties.js +38 -27
  21. package/es/desk-frameworks/table-connected/frameworks/EventHandlersFactory.js +17 -6
  22. package/es/desk-frameworks/table-connected/frameworks/TableConnectedView.js +2 -0
  23. package/es/library/behaviours/table-column-resizer/domain/entities/Constants.js +1 -1
  24. package/es/library/custom-component/frameworks/ui/CreateCustomComponent.js +28 -6
  25. package/es/library/custom-component/frameworks/ui/CreateSlotComponent.js +77 -22
  26. package/es/library/dot/components/action-location/frameworks/ui/ActionComponentMapping.js +4 -4
  27. package/es/library/dot/components/table-list/adapters/presenters/TableTranslator.js +4 -9
  28. package/es/library/dot/components/table-list/frameworks/ui/EventHandlersFactory.js +1 -3
  29. package/es/library/dot/components/table-list/frameworks/ui/TableList.js +1 -2
  30. package/es/library/dot/components/table-list/frameworks/ui/TableListView.js +6 -2
  31. package/es/library/dot/components/table-list/frameworks/ui/css/TableList.module.css +3 -0
  32. package/es/library/dot/components/table-list/frameworks/ui/sub-components/ErrorState.js +28 -0
  33. package/es/library/dot/components/table-list/frameworks/ui/sub-components/header/HeaderData.js +3 -10
  34. package/es/library/dot/components/table-list/frameworks/ui/sub-components/header/Headers.js +1 -3
  35. package/es/library/dot/legacy-to-new-arch/action-icon/frameworks/ui/ActionIcon.js +4 -20
  36. package/es/library/dot/legacy-to-new-arch/action-icon/frameworks/ui/ActionIconView.js +4 -84
  37. package/es/library/dot/legacy-to-new-arch/table-column-sort/frameworks/ui/TableColumnSort.js +11 -0
  38. package/es/library/dot/legacy-to-new-arch/table-column-sort/frameworks/ui/TableColumnSortView.js +44 -0
  39. package/es/library/dot/legacy-to-new-arch/table-column-sort/frameworks/ui/css/TableColumnSort.module.css +10 -0
  40. package/es/library/dot/legacy-to-new-arch/table-field-components/coloured-multiselect-field/frameworks/ui/ColouredMultiSelectField.js +12 -0
  41. package/es/library/dot/legacy-to-new-arch/table-field-components/coloured-multiselect-field/frameworks/ui/ColouredMultiSelectFieldView.js +23 -0
  42. package/es/library/dot/legacy-to-new-arch/table-field-components/coloured-picklist-field/frameworks/ui/ColouredPickListField.js +14 -0
  43. package/es/library/dot/legacy-to-new-arch/table-field-components/coloured-picklist-field/frameworks/ui/ColouredPickListFieldView.js +33 -0
  44. package/es/library/dot/legacy-to-new-arch/table-field-components/index.js +4 -0
  45. package/es/platform/client-actions/components/row-actions-renderer/frameworks/ui/RowActionsRenderer.module.css +2 -2
  46. package/es/platform/data-source/http-template/getAvailableFields.js +62 -0
  47. package/es/platform/zdata-source/domain/entities/APITemplate.js +3 -2
  48. package/es/platform/zhttp/applications/usecases/FetchUseCase.js +1 -1
  49. package/es/platform/zlist/adapters/controllers/RecordSuccessCallbackController.js +28 -0
  50. package/es/platform/zlist/adapters/controllers/SortController.js +1 -3
  51. package/es/platform/zlist/adapters/gateways/Repository.js +12 -2
  52. package/es/platform/zlist/adapters/gateways/Service.js +4 -0
  53. package/es/platform/zlist/adapters/presenters/Presenters.js +26 -0
  54. package/es/platform/zlist/adapters/presenters/TableTranslator.js +11 -2
  55. package/es/platform/zlist/adapters/presenters/translators/Header.js +28 -3
  56. package/es/platform/zlist/adapters/presenters/translators/HeadersTranslator.js +3 -2
  57. package/es/platform/zlist/adapters/presenters/translators/fields/MultiSelectFieldTranslator.js +28 -8
  58. package/es/platform/zlist/adapters/presenters/translators/fields/PickListFieldTranslator.js +28 -2
  59. package/es/platform/zlist/adapters/presenters/utils/DefaultClientActions.js +54 -0
  60. package/es/platform/zlist/applications/interfaces/output/IPresenter.js +1 -0
  61. package/es/platform/zlist/applications/usecases/AbstractUseCase.js +4 -2
  62. package/es/platform/zlist/applications/usecases/RecordSuccessCallbackUsecase.js +24 -0
  63. package/es/platform/zlist/applications/usecases/SortUseCase.js +9 -3
  64. package/es/platform/zlist/domain/entities/List.js +32 -8
  65. package/es/platform/zlist/domain/entities/SortBy.js +58 -0
  66. package/es/platform/zlist/domain/entities/interfaces/ISortBy.js +1 -0
  67. package/es/platform/zlist/domain/entities/interfaces/ListModel.js +1 -0
  68. package/es/platform/zlist/domain/entities/interfaces/Properties.js +6 -1
  69. package/es/platform/zlist/frameworks/EventHandlersFactory.js +9 -4
  70. package/es/platform/zlist/frameworks/ZListBehaviourFactory.js +7 -1
  71. package/es/platform/zrecord/adapters/controllers/ActionExecutorController.js +2 -1
  72. package/es/platform/zrecord/adapters/controllers/RefetchController.js +2 -1
  73. package/es/platform/zrecord/applications/usecases/ExecuteActionUseCase.js +3 -2
  74. package/es/platform/zrecord/applications/usecases/RefetchUseCase.js +3 -2
  75. package/es/platform/zrecord/domain/entities/RecordsManager.js +4 -3
  76. package/package.json +11 -11
  77. package/es/library/dot/components/table-list/frameworks/ui/sub-components/header/HeaderText.js +0 -34
  78. package/es/library/dot/legacy-to-new-arch/action-icon/frameworks/ui/css/ActionIcon.module.css +0 -3
@@ -1,11 +1,73 @@
1
+ async function getValidJsonResArray(res, key) {
2
+ if (res.status === 204) {
3
+ return null;
4
+ }
5
+
6
+ if (res.ok) {
7
+ const json = await res.json();
8
+ return json[key] || [];
9
+ }
10
+
11
+ throw new Error(`Error: ${res.status} ${res.statusText}`);
12
+ }
13
+
1
14
  let getAvailableFields = {
2
15
  name: 'availableFields',
3
16
  api: '/{{servicePrefix}}/{{orgName}}/api/v1/views/availableFields',
4
17
  parameters: `{
18
+ "servicePrefix": "{{servicePrefix}}",
19
+ "orgName": "{{orgName}}",
5
20
  "departmentId":"{{departmentId}}",
6
21
  "module":"{{moduleName}}"
7
22
  }`,
8
23
  type: 'GET',
24
+ getResponse: async _ref => {
25
+ let {
26
+ params,
27
+ payload,
28
+ headers
29
+ } = _ref;
30
+
31
+ try {
32
+ const {
33
+ servicePrefix,
34
+ orgName,
35
+ departmentId,
36
+ moduleName
37
+ } = params;
38
+ const availableFieldsUrl = `/${servicePrefix}/${orgName}/api/v1/views/availableFields?departmentId=${departmentId}&module=${moduleName}`;
39
+ const res = await fetch(availableFieldsUrl, {
40
+ method: 'GET',
41
+ headers
42
+ });
43
+ const availableFields = await getValidJsonResArray(res, 'fields');
44
+ const organizationFieldsUrl = `/${servicePrefix}/${orgName}/api/v1/organizationFields?departmentId=${departmentId}&module=${moduleName}`;
45
+ const ores = await fetch(organizationFieldsUrl, {
46
+ method: 'GET',
47
+ headers
48
+ });
49
+ const organizationFields = await getValidJsonResArray(ores, 'data');
50
+ return {
51
+ fields: availableFields.map(field => {
52
+ const organizationField = organizationFields.find(orgField => orgField.apiName === field.name);
53
+
54
+ if (!organizationField) {
55
+ return field;
56
+ }
57
+
58
+ return { ...field,
59
+ pickListValues: organizationField.pickListValues,
60
+ subType: organizationField.subType
61
+ };
62
+ })
63
+ };
64
+ } catch (error) {
65
+ throw {
66
+ error,
67
+ message: 'Error fetching available fields'
68
+ };
69
+ }
70
+ },
9
71
  transformer: res => res.fields,
10
72
  properties: {
11
73
  moduleName: {
@@ -67,12 +67,13 @@ class APITemplate {
67
67
  };
68
68
 
69
69
  if (this.getResponseInTemplate) {
70
- apiDetails.getResponse = () => {
70
+ apiDetails.getResponse = headers => {
71
71
  const payload = JSON.parse(this.getPayloadString(obj));
72
72
  const params = JSON.parse(this.getParameter(obj));
73
73
  return this.getResponseInTemplate({
74
74
  payload,
75
- params
75
+ params,
76
+ headers
76
77
  });
77
78
  };
78
79
  }
@@ -33,7 +33,7 @@ class FetchUseCase extends AbstractUseCase {
33
33
  try {
34
34
  // NOTE: getResponse is hacky solution to get the data using function call instead of fetch, So any handling added to here needs to be added to fetch and vise versa
35
35
  if (typeof getResponse === 'function') {
36
- const data = await getResponse();
36
+ const data = await getResponse(headers);
37
37
 
38
38
  if (data === undefined) {
39
39
  dispatch({
@@ -0,0 +1,28 @@
1
+ import AbstractController from "./AbstractController";
2
+
3
+ class RecordSuccessCallbackController extends AbstractController {
4
+ handle(event) {
5
+ const {
6
+ state,
7
+ updateState,
8
+ dispatch,
9
+ action
10
+ } = event;
11
+ const {
12
+ payload,
13
+ metaData
14
+ } = action;
15
+ const {
16
+ recordSuccessCallbackUseCase
17
+ } = this.service;
18
+ recordSuccessCallbackUseCase.updateDependency(state, updateState);
19
+ recordSuccessCallbackUseCase.execute({
20
+ dispatch,
21
+ payload,
22
+ metaData
23
+ });
24
+ }
25
+
26
+ }
27
+
28
+ export default RecordSuccessCallbackController;
@@ -11,9 +11,7 @@ class SortController extends AbstractController {
11
11
  action,
12
12
  dispatch
13
13
  } = event;
14
- const {
15
- sortBy
16
- } = action.payload;
14
+ const sortBy = action.payload;
17
15
  sortUseCase.updateDependency(state, updateState);
18
16
  sortUseCase.execute({
19
17
  sortBy,
@@ -1,6 +1,7 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
 
3
3
  import ListFactory from "../../applications/entities-factory/ListFactory";
4
+ import SortBy from "../../domain/entities/SortBy";
4
5
 
5
6
  class Repository {
6
7
  constructor() {
@@ -13,13 +14,15 @@ class Repository {
13
14
 
14
15
  getList() {
15
16
  const {
16
- sortBy,
17
17
  departmentId,
18
18
  viewId,
19
19
  moduleName,
20
20
  query,
21
21
  context
22
22
  } = this.state.properties;
23
+ const {
24
+ sortBy
25
+ } = this.getZListState();
23
26
  const list = ListFactory.createList({
24
27
  context,
25
28
  query: {
@@ -28,12 +31,19 @@ class Repository {
28
31
  moduleName,
29
32
  ...query
30
33
  },
31
- sortBy,
34
+ sortBy: new SortBy(sortBy.id, sortBy.name, sortBy.order),
32
35
  limit: 50
33
36
  });
34
37
  return list;
35
38
  }
36
39
 
40
+ getZListState() {
41
+ const {
42
+ zlist
43
+ } = this.state.behaviours;
44
+ return zlist;
45
+ }
46
+
37
47
  }
38
48
 
39
49
  export default Repository;
@@ -12,6 +12,7 @@ import RecordExecuteSucceededUseCase from "../../applications/usecases/RecordExe
12
12
  import RecordExecuteFailedUseCase from "../../applications/usecases/RecordExecuteFailedUseCase";
13
13
  import UpdateSuccessUseCase from "../../applications/usecases/UpdateSuccessUseCase";
14
14
  import DeleteSuccessUseCase from "../../applications/usecases/DeleteSuccessUseCase";
15
+ import RecordSuccessCallbackUsecase from "../../applications/usecases/RecordSuccessCallbackUsecase";
15
16
 
16
17
  class Service {
17
18
  constructor(dependencies) {
@@ -31,6 +32,8 @@ class Service {
31
32
 
32
33
  _defineProperty(this, "recordExecuteSucceededUseCase", void 0);
33
34
 
35
+ _defineProperty(this, "recordSuccessCallbackUseCase", void 0);
36
+
34
37
  _defineProperty(this, "recordExecuteFailedUseCase", void 0);
35
38
 
36
39
  _defineProperty(this, "sortUseCase", void 0);
@@ -49,6 +52,7 @@ class Service {
49
52
  this.deleteMultipleRecordUseCase = new DeleteMultipleRecordUseCase(this.dependencies);
50
53
  this.deleteSingleRecordUseCase = new DeleteSingleRecordUseCase(this.dependencies);
51
54
  this.recordExecuteSucceededUseCase = new RecordExecuteSucceededUseCase(this.dependencies);
55
+ this.recordSuccessCallbackUseCase = new RecordSuccessCallbackUsecase(this.dependencies);
52
56
  this.recordExecuteFailedUseCase = new RecordExecuteFailedUseCase(this.dependencies);
53
57
  this.recordUpdateUseCase = new RecordUpdateUseCase(this.dependencies);
54
58
  this.updateSuccessUseCase = new UpdateSuccessUseCase(this.dependencies);
@@ -0,0 +1,26 @@
1
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+
3
+ class Presenter {
4
+ constructor() {
5
+ _defineProperty(this, "updateState", void 0);
6
+
7
+ _defineProperty(this, "state", void 0);
8
+ }
9
+
10
+ updateDependencies(state, updateState) {
11
+ this.updateState = updateState;
12
+ this.state = state;
13
+ }
14
+
15
+ updateView(zlist) {
16
+ this.state = { ...this.state,
17
+ behaviours: { ...this.state.behaviours,
18
+ zlist
19
+ }
20
+ };
21
+ this.updateState(this.state);
22
+ }
23
+
24
+ }
25
+
26
+ export default Presenter;
@@ -7,7 +7,9 @@ import RowCursor from "../../../../cc/table-list/data-types/RowCursor";
7
7
  import { TableListConstants } from "../../../../cc/table-list";
8
8
  import { ResizerStateTranslator } from "./translators/ResizerStateTranslator";
9
9
  import { calculateFieldWidths } from "./utils/calculateFieldWidths";
10
+ import DefaultClientActions from "./utils/DefaultClientActions";
10
11
  const EMPTY_OBJECT = {};
12
+ const EMPTY_ARRAY = [];
11
13
 
12
14
  const fallbackToDefault = (value, defaultValue) => [undefined, null].includes(value) ? defaultValue : value;
13
15
 
@@ -34,11 +36,16 @@ export default class TableTranslator {
34
36
  context['servicePrefix'] = 'supportapi/zd'; // FIX: servicePrefix defaultValue should be available from properties
35
37
 
36
38
  const {
39
+ zlist,
37
40
  zrecord,
38
41
  zfield,
39
42
  zclientAction
40
43
  } = fallbackToDefault(behaviours, {}); // FIX: behaviours should be available by default
41
44
 
45
+ const {
46
+ sortBy
47
+ } = fallbackToDefault(zlist, {}); // FIX: zlist should be available by default
48
+
42
49
  const {
43
50
  records,
44
51
  isFetching: isRecordsFetching
@@ -60,12 +67,13 @@ export default class TableTranslator {
60
67
 
61
68
  const isLoading = !!(isRecordsFetching || isAvailableFieldsFetching || isSelectedFieldsFetching);
62
69
  const fields = selectedFields === null || selectedFields === void 0 ? void 0 : selectedFields.map(selectedField => availableFields === null || availableFields === void 0 ? void 0 : availableFields.find(availableField => availableField.name === selectedField)).filter(f => f != undefined);
70
+ const newClientActions = DefaultClientActions.createSortActions(fields, clientActions || EMPTY_ARRAY);
63
71
  const {
64
72
  headerActions,
65
73
  fieldActions,
66
74
  rowActions,
67
75
  noLocation
68
- } = mapClientActions(clientActions || []);
76
+ } = mapClientActions(newClientActions || EMPTY_ARRAY);
69
77
  const isRowClickable = noLocation.some(action => action.uiComponentMapping.eventMappings.some(mapping => mapping.sourceEvent === TableListConstants.TABLE_LIST_ROW_CLICKED));
70
78
  const rowCursor = isRowClickable ? RowCursor.Pointer : RowCursor.Default;
71
79
  const {
@@ -75,7 +83,7 @@ export default class TableTranslator {
75
83
 
76
84
  const localStorageFieldWidths = fallbackToDefault(localStorageBehaviour === null || localStorageBehaviour === void 0 ? void 0 : (_localStorageBehaviou = localStorageBehaviour[moduleName]) === null || _localStorageBehaviou === void 0 ? void 0 : (_localStorageBehaviou2 = _localStorageBehaviou[viewId]) === null || _localStorageBehaviou2 === void 0 ? void 0 : _localStorageBehaviou2.modifiedWidths, EMPTY_OBJECT);
77
85
  const modifiedWidths = calculateFieldWidths(fields, localStorageFieldWidths, preferences);
78
- const headersTranslator = new HeadersTranslator(fields, headerActions, context, modifiedWidths);
86
+ const headersTranslator = new HeadersTranslator(fields, headerActions, context, modifiedWidths, sortBy);
79
87
  const rowsTranslator = new RowsTranslator(records, fields, rowActions, context, fieldComponentMapping, rowActionsUiType, fieldActions); // const actionTranslator = new ClientActionsTranslator(clientActions, records, fields, pageContext);
80
88
  // const translators = [headersTranslator.getTranslator(), rowsTranslator.getTranslator(), actionTranslator.getTranslator()];
81
89
 
@@ -86,6 +94,7 @@ export default class TableTranslator {
86
94
  properties,
87
95
  behaviours,
88
96
  selection: behaviours === null || behaviours === void 0 ? void 0 : behaviours.selection,
97
+ sortBy,
89
98
  rowCursor,
90
99
  resizerState: ResizerStateTranslator({
91
100
  columnResizer: columnResizer,
@@ -1,7 +1,8 @@
1
1
  import ColumnAlignmentTranslator from "./ColumnAlignmentTranslator";
2
2
  import ClientActionsTranslator from "../../../../client-actions/translators/client-actions-translator";
3
+ import { SortOrder } from "../../../../zlist/domain/entities/interfaces/Properties";
3
4
 
4
- function HeaderTranslator(field, actions, context, modifiedWidths) {
5
+ function HeaderTranslator(field, actions, context, modifiedWidths, sortBy) {
5
6
  const {
6
7
  id,
7
8
  name,
@@ -9,8 +10,11 @@ function HeaderTranslator(field, actions, context, modifiedWidths) {
9
10
  isSortable,
10
11
  type
11
12
  } = field;
13
+ const newField = { ...field,
14
+ sort: translateSortBy(field.id, sortBy)
15
+ };
12
16
  const transformedActions = ClientActionsTranslator.transform(actions, { ...context,
13
- field
17
+ field: newField
14
18
  });
15
19
  const width = modifiedWidths[name];
16
20
  return {
@@ -24,4 +28,25 @@ function HeaderTranslator(field, actions, context, modifiedWidths) {
24
28
  };
25
29
  }
26
30
 
27
- export default HeaderTranslator;
31
+ export default HeaderTranslator;
32
+
33
+ function translateSortBy(id, sortBy) {
34
+ const newSortBy = { ...sortBy,
35
+ tooltip: ''
36
+ };
37
+
38
+ if (sortBy.id === id) {
39
+ if (sortBy.order === SortOrder.ASC) {
40
+ newSortBy.tooltip = 'Click to Sort Descending';
41
+ } else if (newSortBy.order === SortOrder.DES) {
42
+ newSortBy.tooltip = 'Click to Sort Ascending';
43
+ } else if (newSortBy.order === SortOrder.NONE) {
44
+ newSortBy.tooltip = 'Click to Sort';
45
+ }
46
+ } else {
47
+ newSortBy.order = SortOrder.NONE;
48
+ newSortBy.tooltip = 'Click to Sort';
49
+ }
50
+
51
+ return newSortBy;
52
+ }
@@ -1,10 +1,11 @@
1
1
  import HeaderTranslator from "./Header";
2
2
  export default class HeadersTranslator {
3
- constructor(fields, actions, context, modifiedWidths) {
3
+ constructor(fields, actions, context, modifiedWidths, sortBy) {
4
4
  this.fields = fields;
5
5
  this.actions = actions;
6
6
  this.context = context;
7
7
  this.modifiedWidths = modifiedWidths;
8
+ this.sortBy = sortBy;
8
9
  this.pipe = this.pipe.bind(this);
9
10
  }
10
11
 
@@ -13,7 +14,7 @@ export default class HeadersTranslator {
13
14
  return [];
14
15
  }
15
16
 
16
- return this.fields.map(field => HeaderTranslator(field, this.actions, this.context, this.modifiedWidths));
17
+ return this.fields.map(field => HeaderTranslator(field, this.actions, this.context, this.modifiedWidths, this.sortBy));
17
18
  }
18
19
 
19
20
  pipe(viewModel) {
@@ -1,24 +1,44 @@
1
1
  import FieldTypes from "../../../../../../cc/fields/field/Types";
2
2
  import MultiListFieldModel from "../../../../../../cc/fields/multi-select/Model";
3
+ import ColouredMultiListFieldModel from "../../../../../../cc/fields/coloured-multi-select/Model";
3
4
 
4
5
  const MultiSelectFieldTranslator = (field, value, appendToActionPayload) => {
5
6
  const {
6
7
  uiType,
7
- name
8
+ name,
9
+ subType,
10
+ pickListValues
8
11
  } = field;
9
- const updatedValue = value.split(';').map(item => {
10
- if (item === '') {
11
- return '-None-';
12
- }
12
+ const updatedValue = value.split(';').map(item => item === '' ? '-None-' : item);
13
+
14
+ if (['colored', 'ColorCoded'].includes(subType)) {
15
+ return ColouredMultiSelectFieldTranslator(field, updatedValue, appendToActionPayload);
16
+ }
13
17
 
14
- return item;
15
- });
16
18
  return MultiListFieldModel({
17
19
  uiType: uiType || FieldTypes.MultiSelectField,
18
20
  appendToActionPayload,
19
21
  name,
22
+ options: pickListValues,
20
23
  value: updatedValue
21
24
  });
22
25
  };
23
26
 
24
- export default MultiSelectFieldTranslator;
27
+ export default MultiSelectFieldTranslator;
28
+
29
+ const ColouredMultiSelectFieldTranslator = (field, value, appendToActionPayload) => {
30
+ const {
31
+ uiType,
32
+ name,
33
+ pickListValues
34
+ } = field;
35
+ return ColouredMultiListFieldModel({
36
+ uiType: uiType || FieldTypes.ColouredMultiSelectField,
37
+ appendToActionPayload,
38
+ name,
39
+ options: pickListValues.map(option => ({ ...option,
40
+ colorCode: option.colorCode || ''
41
+ })),
42
+ value
43
+ });
44
+ };
@@ -1,17 +1,43 @@
1
1
  import FieldTypes from "../../../../../../cc/fields/field/Types";
2
2
  import PickListFieldModel from "../../../../../../cc/fields/pick-list/Model";
3
+ import ColouredPickListFieldModel from "../../../../../../cc/fields/coloured-pick-list/Model";
3
4
 
4
5
  const PickListFieldTranslator = (field, value, appendToActionPayload) => {
5
6
  const {
6
7
  uiType,
7
- name
8
+ name,
9
+ pickListValues,
10
+ subType
8
11
  } = field;
12
+
13
+ if (['colored', 'ColorCoded'].includes(subType)) {
14
+ return ColouredPickListFieldTranslator(field, value, appendToActionPayload);
15
+ }
16
+
9
17
  return PickListFieldModel({
10
18
  uiType: uiType || FieldTypes.PickListField,
11
19
  appendToActionPayload,
20
+ options: pickListValues,
12
21
  name,
13
22
  value
14
23
  });
15
24
  };
16
25
 
17
- export default PickListFieldTranslator;
26
+ export default PickListFieldTranslator;
27
+
28
+ const ColouredPickListFieldTranslator = (field, value, appendToActionPayload) => {
29
+ const {
30
+ uiType,
31
+ name,
32
+ pickListValues
33
+ } = field;
34
+ return ColouredPickListFieldModel({
35
+ uiType: uiType || FieldTypes.ColouredPickListField,
36
+ appendToActionPayload,
37
+ options: pickListValues.map(option => ({ ...option,
38
+ colorCode: option.colorCode || ''
39
+ })),
40
+ name,
41
+ value
42
+ });
43
+ };
@@ -0,0 +1,54 @@
1
+ import ClientAction from "../../../../client-actions/behaviour/zclient-actions/domain/entities/ClientAction";
2
+
3
+ class DefaultClientActions {
4
+ static constructAction(clientAction) {
5
+ return new ClientAction(clientAction).toObject();
6
+ }
7
+
8
+ static constructSortAction() {
9
+ return this.constructAction({
10
+ uiComponentMapping: {
11
+ component: 'TableColumnSort',
12
+ name: 'SortBy',
13
+ propertiesValueMapping: {
14
+ value: '{{@context.field.sort.order}}',
15
+ ascendingLabel: 'Ascending',
16
+ descendingLabel: 'Descending'
17
+ },
18
+ eventMappings: [{
19
+ payloadValueMapping: {
20
+ id: '{{@context.field.id}}',
21
+ name: '{{@context.field.name}}',
22
+ order: `{{@payload.value}}`
23
+ },
24
+ sourceEvent: 'SORT#CLICKED',
25
+ targetEvent: 'SMART_TABLE#SORT',
26
+ id: '4000000080005'
27
+ }],
28
+ id: '4000000080003'
29
+ },
30
+ conditions: {
31
+ fields: [{
32
+ fieldName: 'field.isSortable',
33
+ condition: '=',
34
+ value: ['true']
35
+ }],
36
+ pattern: '1'
37
+ },
38
+ location: 'header_actions',
39
+ id: '4000000080009',
40
+ modules: ['MODULE'],
41
+ name: 'SortBy Action',
42
+ component: 'SmartTable',
43
+ modifiedTime: '2024-11-21T06:11:59.000Z',
44
+ createdTime: '2024-11-21T06:11:59.000Z'
45
+ });
46
+ }
47
+
48
+ static createSortActions(fields, clientActions) {
49
+ return [...clientActions, this.constructSortAction()];
50
+ }
51
+
52
+ }
53
+
54
+ export default DefaultClientActions;
@@ -4,11 +4,13 @@ class AbstractUseCase {
4
4
  this.execute = this.execute.bind(this);
5
5
  }
6
6
 
7
- updateDependency(state) {
7
+ updateDependency(state, updateState) {
8
8
  const {
9
- repository
9
+ repository,
10
+ presenter
10
11
  } = this.dependencies;
11
12
  repository.init(state);
13
+ presenter.updateDependencies(state, updateState);
12
14
  }
13
15
 
14
16
  }
@@ -0,0 +1,24 @@
1
+ import AbstractUseCase from "./AbstractUseCase";
2
+
3
+ class RecordSuccessCallbackUsecase extends AbstractUseCase {
4
+ execute(input) {
5
+ const {
6
+ dispatch,
7
+ payload,
8
+ metaData
9
+ } = input;
10
+ const {
11
+ repository,
12
+ presenter
13
+ } = this.dependencies;
14
+ const list = repository.getList();
15
+
16
+ if (list.isAcknowledgeBySortBy(metaData)) {
17
+ list.setSortBy(metaData);
18
+ presenter.updateView(list.toObject());
19
+ }
20
+ }
21
+
22
+ }
23
+
24
+ export default RecordSuccessCallbackUsecase;
@@ -1,3 +1,4 @@
1
+ import { SmartTableConstants } from "../../../../cc/table-connected";
1
2
  import AbstractUseCase from "./AbstractUseCase";
2
3
 
3
4
  class SortUseCase extends AbstractUseCase {
@@ -8,11 +9,16 @@ class SortUseCase extends AbstractUseCase {
8
9
  } = input;
9
10
  const {
10
11
  repository,
11
- sortBy: sortByGateway
12
+ presenter
12
13
  } = this.dependencies;
13
14
  const list = repository.getList();
14
- const sortByQueryString = sortByGateway.toQueryString(sortBy);
15
- dispatch(list.createSortByRefetchAction(sortByQueryString));
15
+ list.setSortBy(sortBy);
16
+ dispatch(list.createRecordsRefetchAction());
17
+ dispatch({
18
+ type: SmartTableConstants.Events.SORTED,
19
+ payload: sortBy
20
+ });
21
+ presenter.updateView(list.toObject());
16
22
  }
17
23
 
18
24
  }
@@ -3,6 +3,7 @@ import { FIELD_EXECUTE, FIELD_REFETCH } from "../../../../bc/zfield/Constants";
3
3
  import { ZLIST_RECORD_DELETE_FAILED, ZLIST_RECORD_DELETE_SUCCEEDED, ZLIST_RECORD_UPDATE_FAILED, ZLIST_RECORD_UPDATE_SUCCEEDED } from "../../../../bc/zlist/Constants";
4
4
  import { CLIENTACTION_BEHAVIOUR_EXECUTE } from "../../../client-actions/bc/zclient-actions/Constants";
5
5
  import { SmartTableConstants } from "../../../../cc/table-connected";
6
+ import SortBy from "./SortBy";
6
7
 
7
8
  class List {
8
9
  constructor(limit, sortBy, query, context) {
@@ -12,6 +13,28 @@ class List {
12
13
  this.context = context;
13
14
  }
14
15
 
16
+ toObject() {
17
+ return {
18
+ sortBy: this.sortBy.toObject()
19
+ };
20
+ }
21
+
22
+ setSortBy(sortBy) {
23
+ this.sortBy = new SortBy(sortBy.id, sortBy.name, sortBy.order);
24
+ }
25
+
26
+ toggleSortBy() {
27
+ const {
28
+ id,
29
+ name
30
+ } = this.sortBy;
31
+ this.sortBy.doSorting(id, name);
32
+ }
33
+
34
+ isAcknowledgeBySortBy(metaData) {
35
+ return metaData && metaData['SMART_TABLE#SORTED'];
36
+ }
37
+
15
38
  createApiProps() {
16
39
  const {
17
40
  query,
@@ -21,17 +44,12 @@ class List {
21
44
  } = this;
22
45
  return {
23
46
  limit,
24
- sortBy,
47
+ sortBy: sortBy.toQueryString(),
25
48
  ...query,
26
49
  ...context
27
50
  };
28
51
  }
29
52
 
30
- createSortByRefetchAction(sortBy) {
31
- this.sortBy = sortBy;
32
- return this.createRecordsRefetchAction();
33
- }
34
-
35
53
  getInitialMountFetchActions() {
36
54
  return [this.createRecordsFetchAction(), this.createAvailableFieldsFetchAction(), this.createSelectedFieldsFetchAction(), this.createClientActionsFetchAction()];
37
55
  }
@@ -288,15 +306,21 @@ class List {
288
306
  };
289
307
  }
290
308
 
291
- createRecordsRefetchAction() {
309
+ createRecordsRefetchAction(triggerer) {
292
310
  const props = this.createApiProps();
311
+ const metaData = triggerer === 'sortBy' && {
312
+ ['SMART_TABLE#SORTED']: {
313
+ sortBy: this.sortBy.toObject()
314
+ }
315
+ };
293
316
  return {
294
317
  type: RECORD_REFETCH,
295
318
  payload: {
296
319
  actionName: RecordApiActionName.GET_RECORDS,
297
320
  props,
298
321
  apiName: 'records'
299
- }
322
+ },
323
+ metaData
300
324
  };
301
325
  }
302
326