commons-shared-web-ui 0.0.62 → 0.0.63

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 (222) hide show
  1. package/fesm2022/commons-shared-web-ui.mjs +16153 -0
  2. package/fesm2022/commons-shared-web-ui.mjs.map +1 -0
  3. package/index.d.ts +5033 -0
  4. package/package.json +34 -53
  5. package/.claude/settings.local.json +0 -10
  6. package/documentation/alert.md +0 -123
  7. package/documentation/button-dropdown.md +0 -126
  8. package/documentation/button.md +0 -184
  9. package/documentation/cards-usage-guidelines.md +0 -131
  10. package/documentation/configurable-form.md +0 -605
  11. package/documentation/confirmation-modal.md +0 -250
  12. package/documentation/filter-sidebar.md +0 -178
  13. package/documentation/filter-table-selector.md +0 -228
  14. package/documentation/form-builder.md +0 -599
  15. package/documentation/form-components.md +0 -384
  16. package/documentation/form-field-configuration.md +0 -250
  17. package/documentation/nav.md +0 -427
  18. package/documentation/pagination.md +0 -181
  19. package/documentation/side-nav-documentation.md +0 -169
  20. package/documentation/smart-form.md +0 -2819
  21. package/documentation/smart-table.md +0 -1297
  22. package/documentation/snackbar.md +0 -118
  23. package/documentation/style-externalization.md +0 -88
  24. package/documentation/summary-card.md +0 -279
  25. package/documentation/table-column-configuration.md +0 -221
  26. package/documentation/time-picker.md +0 -274
  27. package/ng-package.json +0 -30
  28. package/src/lib/modules/alert/alert.models.ts +0 -6
  29. package/src/lib/modules/alert/alert.module.ts +0 -16
  30. package/src/lib/modules/alert/components/alert/alert.component.html +0 -27
  31. package/src/lib/modules/alert/components/alert/alert.component.scss +0 -92
  32. package/src/lib/modules/alert/components/alert/alert.component.ts +0 -81
  33. package/src/lib/modules/button/button.models.ts +0 -13
  34. package/src/lib/modules/button/button.module.ts +0 -16
  35. package/src/lib/modules/button/components/button/button.component.html +0 -22
  36. package/src/lib/modules/button/components/button/button.component.scss +0 -92
  37. package/src/lib/modules/button/components/button/button.component.ts +0 -67
  38. package/src/lib/modules/button-dropdown/button-dropdown.models.ts +0 -26
  39. package/src/lib/modules/button-dropdown/button-dropdown.module.ts +0 -22
  40. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.html +0 -41
  41. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.scss +0 -135
  42. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.ts +0 -160
  43. package/src/lib/modules/configurable-form/component/configurable-form.component.html +0 -294
  44. package/src/lib/modules/configurable-form/component/configurable-form.component.scss +0 -503
  45. package/src/lib/modules/configurable-form/component/configurable-form.component.ts +0 -628
  46. package/src/lib/modules/configurable-form/configurable-form.examples.ts +0 -154
  47. package/src/lib/modules/configurable-form/configurable-form.model.ts +0 -131
  48. package/src/lib/modules/configurable-form/configurable-form.module.ts +0 -19
  49. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.html +0 -77
  50. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.scss +0 -395
  51. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.ts +0 -266
  52. package/src/lib/modules/confirmation-modal/confirmation-modal.models.ts +0 -71
  53. package/src/lib/modules/confirmation-modal/confirmation-modal.module.ts +0 -20
  54. package/src/lib/modules/filter/components/filter/filter.component.html +0 -131
  55. package/src/lib/modules/filter/components/filter/filter.component.scss +0 -245
  56. package/src/lib/modules/filter/components/filter/filter.component.ts +0 -216
  57. package/src/lib/modules/filter/filter.models.ts +0 -88
  58. package/src/lib/modules/filter/filter.module.ts +0 -24
  59. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.html +0 -112
  60. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.scss +0 -186
  61. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.ts +0 -163
  62. package/src/lib/modules/filter-sidebar/filter-sidebar.models.ts +0 -95
  63. package/src/lib/modules/filter-sidebar/filter-sidebar.module.ts +0 -24
  64. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.html +0 -73
  65. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.scss +0 -321
  66. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.ts +0 -361
  67. package/src/lib/modules/filter-table-selector/filter-table-selector.models.ts +0 -91
  68. package/src/lib/modules/filter-table-selector/filter-table-selector.module.ts +0 -22
  69. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.html +0 -63
  70. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.scss +0 -496
  71. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.ts +0 -445
  72. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.html +0 -75
  73. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.scss +0 -210
  74. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.ts +0 -55
  75. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.html +0 -25
  76. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.scss +0 -82
  77. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.ts +0 -95
  78. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.html +0 -20
  79. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.scss +0 -37
  80. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.ts +0 -94
  81. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.html +0 -46
  82. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.scss +0 -102
  83. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.ts +0 -50
  84. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.html +0 -35
  85. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.scss +0 -67
  86. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.ts +0 -34
  87. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.html +0 -68
  88. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.scss +0 -113
  89. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.ts +0 -74
  90. package/src/lib/modules/form-builder/configs/field-type-schema.map.ts +0 -533
  91. package/src/lib/modules/form-builder/form-builder.module.ts +0 -36
  92. package/src/lib/modules/form-builder/index.ts +0 -9
  93. package/src/lib/modules/form-builder/models/builder.models.ts +0 -7
  94. package/src/lib/modules/form-builder/models/field-configurator.models.ts +0 -38
  95. package/src/lib/modules/form-builder/models/field-selection.models.ts +0 -51
  96. package/src/lib/modules/form-builder/services/field-configurator.service.ts +0 -258
  97. package/src/lib/modules/form-builder/services/field-selection.service.ts +0 -299
  98. package/src/lib/modules/form-builder/services/form-schema-tree.service.ts +0 -670
  99. package/src/lib/modules/form-builder/tokens/builder.tokens.ts +0 -10
  100. package/src/lib/modules/form-builder/utils/constants.ts +0 -43
  101. package/src/lib/modules/form-components/components/checkbox/checkbox.component.html +0 -29
  102. package/src/lib/modules/form-components/components/checkbox/checkbox.component.scss +0 -111
  103. package/src/lib/modules/form-components/components/checkbox/checkbox.component.ts +0 -207
  104. package/src/lib/modules/form-components/components/checkbox/checkbox.models.ts +0 -35
  105. package/src/lib/modules/form-components/components/datepicker/datepicker.component.html +0 -42
  106. package/src/lib/modules/form-components/components/datepicker/datepicker.component.scss +0 -115
  107. package/src/lib/modules/form-components/components/datepicker/datepicker.component.ts +0 -267
  108. package/src/lib/modules/form-components/components/datepicker/datepicker.models.ts +0 -45
  109. package/src/lib/modules/form-components/components/dropdown/dropdown.component.html +0 -74
  110. package/src/lib/modules/form-components/components/dropdown/dropdown.component.scss +0 -252
  111. package/src/lib/modules/form-components/components/dropdown/dropdown.component.ts +0 -377
  112. package/src/lib/modules/form-components/components/dropdown/dropdown.models.ts +0 -53
  113. package/src/lib/modules/form-components/components/input/input.component.html +0 -51
  114. package/src/lib/modules/form-components/components/input/input.component.scss +0 -128
  115. package/src/lib/modules/form-components/components/input/input.component.ts +0 -250
  116. package/src/lib/modules/form-components/components/input/input.models.ts +0 -55
  117. package/src/lib/modules/form-components/components/radio/radio.component.html +0 -22
  118. package/src/lib/modules/form-components/components/radio/radio.component.scss +0 -107
  119. package/src/lib/modules/form-components/components/radio/radio.component.ts +0 -181
  120. package/src/lib/modules/form-components/components/radio/radio.models.ts +0 -39
  121. package/src/lib/modules/form-components/components/search/search.component.html +0 -15
  122. package/src/lib/modules/form-components/components/search/search.component.scss +0 -87
  123. package/src/lib/modules/form-components/components/search/search.component.ts +0 -213
  124. package/src/lib/modules/form-components/components/search/search.models.ts +0 -40
  125. package/src/lib/modules/form-components/components/toggle/toggle.component.html +0 -15
  126. package/src/lib/modules/form-components/components/toggle/toggle.component.scss +0 -81
  127. package/src/lib/modules/form-components/components/toggle/toggle.component.ts +0 -166
  128. package/src/lib/modules/form-components/components/toggle/toggle.models.ts +0 -27
  129. package/src/lib/modules/form-components/directives/click-outside.directive.ts +0 -22
  130. package/src/lib/modules/form-components/form-components.module.ts +0 -42
  131. package/src/lib/modules/form-field-configuration/components/_ffc-controls.scss +0 -89
  132. package/src/lib/modules/form-field-configuration/components/config-field-node/config-field-node.component.html +0 -68
  133. package/src/lib/modules/form-field-configuration/components/config-field-node/config-field-node.component.scss +0 -73
  134. package/src/lib/modules/form-field-configuration/components/config-field-node/config-field-node.component.ts +0 -34
  135. package/src/lib/modules/form-field-configuration/components/config-section-node/config-section-node.component.html +0 -78
  136. package/src/lib/modules/form-field-configuration/components/config-section-node/config-section-node.component.scss +0 -83
  137. package/src/lib/modules/form-field-configuration/components/config-section-node/config-section-node.component.ts +0 -94
  138. package/src/lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component.html +0 -38
  139. package/src/lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component.scss +0 -42
  140. package/src/lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component.ts +0 -92
  141. package/src/lib/modules/form-field-configuration/form-field-configuration.module.ts +0 -23
  142. package/src/lib/modules/form-field-configuration/index.ts +0 -7
  143. package/src/lib/modules/form-field-configuration/models/field-configuration.models.ts +0 -62
  144. package/src/lib/modules/form-field-configuration/services/config-schema-tree.service.ts +0 -159
  145. package/src/lib/modules/form-field-configuration/services/field-configuration.service.ts +0 -228
  146. package/src/lib/modules/material/material.module.ts +0 -94
  147. package/src/lib/modules/nav/components/nav/nav.component.html +0 -34
  148. package/src/lib/modules/nav/components/nav/nav.component.scss +0 -171
  149. package/src/lib/modules/nav/components/nav/nav.component.ts +0 -82
  150. package/src/lib/modules/nav/nav.models.ts +0 -31
  151. package/src/lib/modules/nav/nav.module.ts +0 -17
  152. package/src/lib/modules/pagination/components/pagination/pagination.component.html +0 -52
  153. package/src/lib/modules/pagination/components/pagination/pagination.component.scss +0 -155
  154. package/src/lib/modules/pagination/components/pagination/pagination.component.ts +0 -109
  155. package/src/lib/modules/pagination/pagination.module.ts +0 -17
  156. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.html +0 -56
  157. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.scss +0 -342
  158. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.ts +0 -135
  159. package/src/lib/modules/side-nav/side-nav.models.ts +0 -38
  160. package/src/lib/modules/side-nav/side-nav.module.ts +0 -16
  161. package/src/lib/modules/smart-form/components/form-field/form-field.component.html +0 -1379
  162. package/src/lib/modules/smart-form/components/form-field/form-field.component.scss +0 -2255
  163. package/src/lib/modules/smart-form/components/form-field/form-field.component.ts +0 -3174
  164. package/src/lib/modules/smart-form/components/form-section/form-section.component.html +0 -67
  165. package/src/lib/modules/smart-form/components/form-section/form-section.component.scss +0 -209
  166. package/src/lib/modules/smart-form/components/form-section/form-section.component.ts +0 -142
  167. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.html +0 -253
  168. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.scss +0 -689
  169. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.ts +0 -1134
  170. package/src/lib/modules/smart-form/index.ts +0 -10
  171. package/src/lib/modules/smart-form/models/form-schema.model.ts +0 -803
  172. package/src/lib/modules/smart-form/models/hierarchy-config.model.ts +0 -22
  173. package/src/lib/modules/smart-form/services/expression.service.ts +0 -75
  174. package/src/lib/modules/smart-form/services/smart-form-controller.service.ts +0 -67
  175. package/src/lib/modules/smart-form/smart-form.examples.ts +0 -1324
  176. package/src/lib/modules/smart-form/smart-form.module.ts +0 -40
  177. package/src/lib/modules/smart-form/utils/translation.utils.ts +0 -82
  178. package/src/lib/modules/smart-form/utils/trusted-url.pipe.ts +0 -25
  179. package/src/lib/modules/smart-form/utils/validation.utils.ts +0 -98
  180. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.html +0 -283
  181. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.scss +0 -685
  182. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.ts +0 -1219
  183. package/src/lib/modules/smart-table/models/table-config.model.ts +0 -247
  184. package/src/lib/modules/smart-table/smart-table.module.ts +0 -30
  185. package/src/lib/modules/smart-table/utils/safe-html.pipe.ts +0 -28
  186. package/src/lib/modules/smart-table/utils/smart-table.utils.ts +0 -18
  187. package/src/lib/modules/snackbar/components/snackbar.component.html +0 -41
  188. package/src/lib/modules/snackbar/components/snackbar.component.scss +0 -99
  189. package/src/lib/modules/snackbar/components/snackbar.component.ts +0 -18
  190. package/src/lib/modules/snackbar/models/snackbar.models.ts +0 -10
  191. package/src/lib/modules/snackbar/services/snackbar.service.ts +0 -40
  192. package/src/lib/modules/snackbar/snackbar.module.ts +0 -11
  193. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.html +0 -47
  194. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.scss +0 -199
  195. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.ts +0 -126
  196. package/src/lib/modules/summary-card/summary-card.module.ts +0 -18
  197. package/src/lib/modules/table-column-configuration/components/_tcc-controls.scss +0 -53
  198. package/src/lib/modules/table-column-configuration/components/config-column-node/config-column-node.component.html +0 -47
  199. package/src/lib/modules/table-column-configuration/components/config-column-node/config-column-node.component.scss +0 -50
  200. package/src/lib/modules/table-column-configuration/components/config-column-node/config-column-node.component.ts +0 -33
  201. package/src/lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component.html +0 -30
  202. package/src/lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component.scss +0 -36
  203. package/src/lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component.ts +0 -78
  204. package/src/lib/modules/table-column-configuration/index.ts +0 -5
  205. package/src/lib/modules/table-column-configuration/models/table-column-configuration.models.ts +0 -20
  206. package/src/lib/modules/table-column-configuration/services/table-column-configuration.service.ts +0 -77
  207. package/src/lib/modules/table-column-configuration/table-column-configuration.module.ts +0 -21
  208. package/src/lib/modules/time-picker/components/time-picker/time-picker.component.html +0 -37
  209. package/src/lib/modules/time-picker/components/time-picker/time-picker.component.scss +0 -102
  210. package/src/lib/modules/time-picker/components/time-picker/time-picker.component.ts +0 -178
  211. package/src/lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component.html +0 -78
  212. package/src/lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component.scss +0 -226
  213. package/src/lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component.ts +0 -595
  214. package/src/lib/modules/time-picker/models/time-picker.models.ts +0 -49
  215. package/src/lib/modules/time-picker/time-picker.module.ts +0 -23
  216. package/src/lib/shared-ui.module.ts +0 -55
  217. package/src/lib/utils/constants.ts +0 -11
  218. package/src/lib/utils/storage.utils.ts +0 -37
  219. package/src/lib/utils/string.utils.ts +0 -23
  220. package/src/lib/utils/translation.utils.ts +0 -87
  221. package/src/public-api.ts +0 -127
  222. package/tsconfig.lib.json +0 -15
@@ -1,247 +0,0 @@
1
- export interface TableOption {
2
- label: string;
3
- value: any;
4
- }
5
-
6
- export interface TableColumnSubField {
7
- key: string;
8
- label?: string;
9
- dataType: 'text' | 'number' | 'email' | 'select' | 'date';
10
- placeholder?: string;
11
- editable?: boolean;
12
- options?: TableOption[];
13
- editConfig?: {
14
- disabled?: boolean;
15
- defaultValue?: any;
16
- };
17
- }
18
-
19
- export interface TableColumn {
20
- key: string;
21
- label: string;
22
- type: 'text' | 'number' | 'date' | 'custom' | 'html' | 'badge';
23
- sortable?: boolean;
24
- editable?: boolean;
25
- dataType?: 'text' | 'number' | 'date' | 'email' | 'select';
26
- options?: TableOption[]; // For select dataType
27
- badgeConfig?: { [key: string]: 'success' | 'warning' | 'danger' | 'info' | 'neutral' }; // Map values to badge variants
28
- width?: string;
29
- cellClass?: string;
30
- headerClass?: string;
31
- sticky?: boolean;
32
- labelPath?: string; // Path to fetch nested value (e.g. 'user.address.city')
33
- emptyValue?: string; // Shown when the cell value is null, undefined, or empty string
34
- dateFormat?: string; // Date format (e.g. 'short', 'medium', 'dd/MM/yyyy')
35
- clickAction?: 'route' | 'callback';
36
- clickRoute?: string; // Route pattern for redirection (e.g. '/users/:id')
37
- subFields?: TableColumnSubField[]; // For columns displaying/editing multiple fields
38
- editConfig?: {
39
- disabled?: boolean;
40
- defaultValue?: any;
41
- };
42
- /** Set to false to hide this column. Default: true. Driven by the column configurator. */
43
- isEnabled?: boolean;
44
- /** Backward-compatible visibility alias, kept in sync with isEnabled by the column configurator. */
45
- visible?: boolean;
46
- /** Configurator-only flag: when true the column can never be hidden (toggle is replaced by a lock). */
47
- lockVisibility?: boolean;
48
- }
49
-
50
- export interface TableFilter {
51
- key: string;
52
- label: string;
53
- type: 'select' | 'text' | 'date'; // Added type for future extension
54
- options?: TableOption[];
55
- apiUrl?: string;
56
- apiMethod?: 'GET' | 'POST';
57
- apiPayload?: any;
58
- labelKey?: string;
59
- valueKey?: string;
60
- labelPath?: string;
61
- valuePath?: string;
62
- requestKey?: string;
63
- dataPath?: string;
64
- handling?: 'standard' | 'nested_string';
65
- nestedStringConfig?: NestedStringConfig;
66
- }
67
-
68
- /**
69
- * A single condition evaluated against a row to decide action visibility.
70
- *
71
- * `field` is a path into the row (supports nesting + array index, e.g.
72
- * 'status.code', 'subStatus.code', 'name[0].text'). When the resolved value is
73
- * an object (e.g. `{ code, name, value }`), it is normalized to its `code`
74
- * (then `name`, then `value`) so the SAME rule works whether the API returns
75
- * `status: { code: 'ACTIVE' }` or `status: 'ACTIVE'`.
76
- *
77
- * String comparisons are case-insensitive.
78
- */
79
- export interface VisibilityRule {
80
- /** Path into the row, e.g. 'status.code' or just 'status'. */
81
- field: string;
82
- /** Comparison operator. Default: 'eq'. */
83
- operator?: 'eq' | 'neq' | 'in' | 'nin' | 'truthy' | 'falsy';
84
- /** Comparison value for 'eq' / 'neq'. */
85
- value?: any;
86
- /** Comparison list for 'in' / 'nin'. */
87
- values?: any[];
88
- }
89
-
90
- /**
91
- * Row-aware visibility config shared by actions and action items.
92
- * - `visibleWhen`: ALL rules must pass (AND) for the action to show.
93
- * - `hiddenWhen`: if ANY rule passes (OR), the action is hidden.
94
- * `hiddenWhen` takes precedence over `visibleWhen`. Either may be a single
95
- * rule or an array of rules.
96
- */
97
- export interface ActionVisibility {
98
- visibleWhen?: VisibilityRule | VisibilityRule[];
99
- hiddenWhen?: VisibilityRule | VisibilityRule[];
100
- }
101
-
102
- export interface TableActionItem extends ActionVisibility {
103
- label: string;
104
- type: 'api' | 'callback' | 'route' | 'delete';
105
- icon?: string;
106
- apiUrl?: string;
107
- apiMethod?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
108
- route?: string;
109
- confirmationNeeded?: boolean;
110
- confirmationMessage?: string;
111
- callback?: (row: any) => void;
112
- /** Set to false to hide this action item. Default: true */
113
- isEnabled?: boolean;
114
- /** Config for native 'delete' action type — drives the built-in confirmation modal */
115
- deleteConfig?: {
116
- apiUrl: string; // URL with :id placeholder e.g. 'gateway/service/api/v1/items/:id'
117
- idField?: string; // Row field used as id (default: 'id')
118
- modalTitle?: string;
119
- modalMessage?: string;
120
- confirmLabel?: string;
121
- cancelLabel?: string;
122
- };
123
- }
124
-
125
- export interface TableAction extends ActionVisibility {
126
- label: string;
127
- type: 'api' | 'callback' | 'route' | 'edit' | 'dropdown';
128
- icon?: string; // FontAwesome class or similar
129
- btnVariant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'warning' | 'success' | 'danger-outline'; // utilizing button variants
130
- apiUrl?: string;
131
- apiMethod?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
132
- route?: string;
133
- confirmationNeeded?: boolean;
134
- confirmationMessage?: string;
135
- callback?: (row: any) => void;
136
- items?: TableActionItem[]; // For dropdown type
137
- /** Set to false to hide this action. Default: true */
138
- isEnabled?: boolean;
139
- }
140
-
141
- export interface PaginationConfig {
142
- enabled: boolean;
143
- pageSize: number;
144
- pageSizeOptions: number[];
145
- totalCountConfig?: {
146
- source: 'same' | 'separate';
147
- apiUrl?: string;
148
- responsePath?: string;
149
- };
150
- }
151
-
152
- export interface TableTheme {
153
- primaryColor?: string;
154
- headerBg?: string;
155
- headerColor?: string;
156
- rowHoverBg?: string;
157
- borderColor?: string;
158
- }
159
-
160
- export interface NestedStringConfig {
161
- paramName: string;
162
- baseValue?: string;
163
- separator: string;
164
- assignment: string;
165
- }
166
-
167
- export interface QueryParamsConfig {
168
- pageKey?: string;
169
- sizeKey?: string;
170
- pageIndexOffset?: number; // e.g. -1 for 0-based index from 1-based UI
171
- filterHandling?: 'standard' | 'nested_string';
172
- nestedStringConfig?: NestedStringConfig;
173
- }
174
-
175
- export interface TableConfig {
176
- columns: TableColumn[];
177
- apiUrl?: string; // Optional when tableData is provided externally
178
- apiMethod?: 'GET' | 'POST';
179
- apiPayload?: any;
180
- dataResponsePath?: string;
181
- filters?: TableFilter[];
182
- filterData?: { [key: string]: any[] };
183
- pagination?: PaginationConfig;
184
- actions?: TableAction[]; // Row level actions
185
- topBarButtons?: TableAction[]; // Buttons above the table
186
- sortBy?: string;
187
- orderBy?: 'ASC' | 'DESC';
188
- theme?: TableTheme;
189
- requestParams?: Function;
190
- selectable?: boolean; // Checkbox selection
191
- queryParamsConfig?: QueryParamsConfig;
192
- labels?: TableLabels;
193
- searchConfig?: SearchConfig;
194
- maxHeight?: string;
195
- stickyHeader?: boolean;
196
-
197
- stickyColumnCount?: number;
198
- token?: string; // Full token string (e.g. "Bearer ...")
199
- tokenHeader?: string; // Header key (default: "Authorization")
200
- editingRowClass?: string; // Optional CSS class to apply to rows being edited
201
- /** Fallback text for any cell whose value is null, undefined, or empty string.
202
- * Overridden per-column via TableColumn.emptyValue. Library default: '-' */
203
- emptyValue?: string;
204
- }
205
-
206
- export interface SearchConfig {
207
- enabled: boolean;
208
- searchKey?: string; // Query param key (default: 'search')
209
- debounceTime?: number; // ms (default: 300)
210
- handling?: 'standard' | 'nested_string'; // standard: ?search=term, nested_string: ?params=SEARCH_TERM=term
211
- minimumCharacter?: number; // Min chars before the API is called (default: 3). Clearing the input always re-triggers.
212
- }
213
-
214
- export interface TableLabels {
215
- searchPlaceholder?: string;
216
- actionColumnHeader?: string;
217
- noDataMessage?: string;
218
- itemsPerPageLabel?: string;
219
- defaultConfirmationMessage?: string;
220
- saveLabel?: string;
221
- cancelLabel?: string;
222
- addLabel?: string;
223
- /** Variant for the Add button (new row). Defaults to 'danger'. */
224
- addButtonVariant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'warning' | 'success' | 'danger-outline';
225
- /** Variant for the Save button (edit row). Defaults to 'primary'. */
226
- saveButtonVariant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'warning' | 'success' | 'danger-outline';
227
- }
228
-
229
- /**
230
- * Emitted by the SmartTableComponent when operating in external-data mode
231
- * (i.e. when [tableData] input is provided by the parent).
232
- * The parent is responsible for fetching updated data based on this event
233
- * and providing it back via [tableData] and [totalItemsCount].
234
- */
235
- export interface TableDataChangeEvent {
236
- page: number;
237
- pageSize: number;
238
- sortBy?: string;
239
- orderBy?: 'ASC' | 'DESC';
240
- searchTerm?: string;
241
- filters?: { [key: string]: any };
242
- }
243
-
244
- export interface TableRowSaveEvent {
245
- row: any;
246
- isNew: boolean;
247
- }
@@ -1,30 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import { SmartTableComponent } from './components/smart-table/smart-table.component';
5
- import { PaginationModule } from '../pagination/pagination.module';
6
- import { ButtonModule } from '../button/button.module';
7
- import { MaterialModule } from '../material/material.module';
8
- import { ConfirmationModalModule } from '../confirmation-modal/confirmation-modal.module';
9
- import { SafeHtmlPipe } from './utils/safe-html.pipe';
10
-
11
-
12
- @NgModule({
13
- declarations: [
14
- SmartTableComponent,
15
- SafeHtmlPipe
16
- ],
17
- imports: [
18
- CommonModule,
19
- FormsModule,
20
- PaginationModule,
21
- ButtonModule,
22
- MaterialModule,
23
- ConfirmationModalModule
24
- ],
25
- exports: [
26
- SmartTableComponent
27
- ]
28
- })
29
- export class SmartTableModule { }
30
-
@@ -1,28 +0,0 @@
1
- import { Pipe, PipeTransform, SecurityContext } from '@angular/core';
2
- import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
3
-
4
- /**
5
- * Marks rich-text HTML (e.g. from a smart-table "html" column, always sourced from this
6
- * app's own rich-text editor output, never arbitrary external/user-supplied markup) as
7
- * trusted so [innerHTML] renders it without Angular's default HTML sanitizer stripping it.
8
- *
9
- * Deliberately does NOT run the value through DomSanitizer.sanitize(SecurityContext.HTML, ...)
10
- * first — that sanitizer strips `style` attributes entirely (they're not in its allowlist),
11
- * which silently destroyed rich-text formatting like text color and highlight color while
12
- * leaving semantic-tag formatting (bold/italic/underline) untouched, since only tags — not
13
- * inline styles — survive that pass.
14
- */
15
- @Pipe({
16
- name: 'safeHtml',
17
- standalone: false
18
- })
19
- export class SafeHtmlPipe implements PipeTransform {
20
- constructor(private sanitizer: DomSanitizer) { }
21
-
22
- transform(value: string): SafeHtml | null {
23
- if (!value) {
24
- return '';
25
- }
26
- return this.sanitizer.bypassSecurityTrustHtml(value);
27
- }
28
- }
@@ -1,18 +0,0 @@
1
- export function appendBaseUrlRecursively(obj: any, baseURL: string): void {
2
- if (obj && typeof obj === 'object') {
3
- if (obj.apiUrl && typeof obj.apiUrl === 'string' && !obj.apiUrl.startsWith('http://') && !obj.apiUrl.startsWith('https://')) {
4
- let finalApiUrl = obj.apiUrl;
5
- if (baseURL.endsWith('/') && finalApiUrl.startsWith('/')) {
6
- finalApiUrl = finalApiUrl.substring(1);
7
- } else if (!baseURL.endsWith('/') && !finalApiUrl.startsWith('/')) {
8
- finalApiUrl = '/' + finalApiUrl;
9
- }
10
- obj.apiUrl = baseURL + finalApiUrl;
11
- }
12
- for (const key in obj) {
13
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
14
- appendBaseUrlRecursively(obj[key], baseURL);
15
- }
16
- }
17
- }
18
- }
@@ -1,41 +0,0 @@
1
- <div class="cc-snackbar-container" [ngClass]="variantClass">
2
- <div class="cc-snackbar-icon">
3
- <!-- Success Icon -->
4
- <svg *ngIf="data.variant === 'success'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
5
- <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path>
6
- <polyline points="22 4 12 14.01 9 11.01"></polyline>
7
- </svg>
8
-
9
- <!-- Error Icon -->
10
- <svg *ngIf="data.variant === 'error'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
11
- <circle cx="12" cy="12" r="10"></circle>
12
- <line x1="15" y1="9" x2="9" y2="15"></line>
13
- <line x1="9" y1="9" x2="15" y2="15"></line>
14
- </svg>
15
-
16
- <!-- Warning Icon -->
17
- <svg *ngIf="data.variant === 'warning'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
18
- <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path>
19
- <line x1="12" y1="9" x2="12" y2="13"></line>
20
- <line x1="12" y1="17" x2="12.01" y2="17"></line>
21
- </svg>
22
-
23
- <!-- Info Icon -->
24
- <svg *ngIf="data.variant === 'info' || !data.variant" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
25
- <circle cx="12" cy="12" r="10"></circle>
26
- <line x1="12" y1="16" x2="12" y2="12"></line>
27
- <line x1="12" y1="8" x2="12.01" y2="8"></line>
28
- </svg>
29
- </div>
30
-
31
- <div class="cc-snackbar-message">
32
- {{ data.message }}
33
- </div>
34
-
35
- <button *ngIf="data.showCloseButton" class="cc-snackbar-close" (click)="snackBarRef.dismiss()">
36
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
37
- <line x1="18" y1="6" x2="6" y2="18"></line>
38
- <line x1="6" y1="6" x2="18" y2="18"></line>
39
- </svg>
40
- </button>
41
- </div>
@@ -1,99 +0,0 @@
1
- .cc-snackbar-container {
2
- display: flex;
3
- align-items: center;
4
- gap: var(--cc-sb-gap, 12px);
5
- padding: var(--cc-sb-padding, 12px 16px);
6
- border-radius: var(--cc-sb-radius, 8px);
7
- box-shadow: var(--cc-sb-shadow, 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06));
8
- font-family: var(--cc-sb-font-family, 'Inter', sans-serif);
9
- font-size: var(--cc-sb-font-size, 14px);
10
- font-weight: var(--cc-sb-font-weight, 500);
11
- background: var(--cc-sb-bg, #ffffff);
12
- color: var(--cc-sb-color, #1f2937);
13
- border: var(--cc-sb-border, 1px solid transparent);
14
- min-width: var(--cc-sb-min-width, 300px);
15
-
16
- &.snackbar-success {
17
- background: var(--cc-sb-success-bg, #ecfdf5);
18
- color: var(--cc-sb-success-color, #065f46);
19
- border-color: var(--cc-sb-success-border, #a7f3d0);
20
- .cc-snackbar-icon { color: var(--cc-sb-success-icon-color, #10b981); }
21
- }
22
-
23
- &.snackbar-error {
24
- background: var(--cc-sb-error-bg, #fef2f2);
25
- color: var(--cc-sb-error-color, #991b1b);
26
- border-color: var(--cc-sb-error-border, #fecaca);
27
- .cc-snackbar-icon { color: var(--cc-sb-error-icon-color, #ef4444); }
28
- }
29
-
30
- &.snackbar-warning {
31
- background: var(--cc-sb-warning-bg, #fffbeb);
32
- color: var(--cc-sb-warning-color, #92400e);
33
- border-color: var(--cc-sb-warning-border, #fde68a);
34
- .cc-snackbar-icon { color: var(--cc-sb-warning-icon-color, #f59e0b); }
35
- }
36
-
37
- &.snackbar-info {
38
- background: var(--cc-sb-info-bg, #eff6ff);
39
- color: var(--cc-sb-info-color, #1e40af);
40
- border-color: var(--cc-sb-info-border, #bfdbfe);
41
- .cc-snackbar-icon { color: var(--cc-sb-info-icon-color, #3b82f6); }
42
- }
43
-
44
- .cc-snackbar-icon {
45
- display: flex;
46
- align-items: center;
47
- justify-content: center;
48
- flex-shrink: 0;
49
-
50
- svg {
51
- width: var(--cc-sb-icon-size, 20px);
52
- height: var(--cc-sb-icon-size, 20px);
53
- }
54
- }
55
-
56
- .cc-snackbar-message {
57
- flex-grow: 1;
58
- line-height: 1.4;
59
- }
60
-
61
- .cc-snackbar-close {
62
- background: transparent;
63
- border: none;
64
- padding: 0;
65
- margin: 0;
66
- cursor: pointer;
67
- display: flex;
68
- align-items: center;
69
- justify-content: center;
70
- color: currentcolor;
71
- opacity: 0.7;
72
- transition: opacity 0.2s;
73
-
74
- &:hover {
75
- opacity: 1;
76
- }
77
-
78
- svg {
79
- width: var(--cc-sb-close-icon-size, 16px);
80
- height: var(--cc-sb-close-icon-size, 16px);
81
- }
82
- }
83
- }
84
-
85
- // Override Angular Material default snackbar surface
86
- ::ng-deep .cc-snackbar-panel {
87
- .mdc-snackbar__surface {
88
- background: transparent !important;
89
- box-shadow: none !important;
90
- padding: 0 !important;
91
- border-radius: 0 !important;
92
- }
93
-
94
- &.mat-snack-bar-container {
95
- background: transparent !important;
96
- box-shadow: none !important;
97
- padding: 0 !important;
98
- }
99
- }
@@ -1,18 +0,0 @@
1
- import { Component, inject } from '@angular/core';
2
- import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
3
- import { SnackbarConfig } from '../models/snackbar.models';
4
-
5
- @Component({
6
- selector: 'lib-snackbar',
7
- templateUrl: './snackbar.component.html',
8
- styleUrls: ['./snackbar.component.scss'],
9
- standalone: false
10
- })
11
- export class SnackbarComponent {
12
- public data: SnackbarConfig = inject(MAT_SNACK_BAR_DATA);
13
- public snackBarRef: MatSnackBarRef<SnackbarComponent> = inject(MatSnackBarRef);
14
-
15
- get variantClass(): string {
16
- return `snackbar-${this.data.variant || 'info'}`;
17
- }
18
- }
@@ -1,10 +0,0 @@
1
- export type SnackbarVariant = 'success' | 'error' | 'warning' | 'info';
2
-
3
- export interface SnackbarConfig {
4
- message: string;
5
- variant?: SnackbarVariant;
6
- duration?: number;
7
- horizontalPosition?: 'start' | 'center' | 'end' | 'left' | 'right';
8
- verticalPosition?: 'top' | 'bottom';
9
- showCloseButton?: boolean;
10
- }
@@ -1,40 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
3
- import { SnackbarConfig } from '../models/snackbar.models';
4
- import { SnackbarComponent } from '../components/snackbar.component';
5
-
6
- @Injectable({
7
- providedIn: 'root'
8
- })
9
- export class SnackbarService {
10
-
11
- constructor(private snackBar: MatSnackBar) {}
12
-
13
- show(config: SnackbarConfig): void {
14
- const matConfig: MatSnackBarConfig = {
15
- duration: config.duration ?? 5000,
16
- horizontalPosition: config.horizontalPosition ?? 'right',
17
- verticalPosition: config.verticalPosition ?? 'top',
18
- panelClass: ['cc-snackbar-panel', `cc-snackbar-${config.variant || 'info'}`],
19
- data: config // Pass the entire config down to the component
20
- };
21
-
22
- this.snackBar.openFromComponent(SnackbarComponent, matConfig);
23
- }
24
-
25
- success(message: string, duration?: number): void {
26
- this.show({ message, variant: 'success', duration });
27
- }
28
-
29
- error(message: string, duration?: number): void {
30
- this.show({ message, variant: 'error', duration });
31
- }
32
-
33
- warning(message: string, duration?: number): void {
34
- this.show({ message, variant: 'warning', duration });
35
- }
36
-
37
- info(message: string, duration?: number): void {
38
- this.show({ message, variant: 'info', duration });
39
- }
40
- }
@@ -1,11 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { MatSnackBarModule } from '@angular/material/snack-bar';
4
- import { SnackbarComponent } from './components/snackbar.component';
5
-
6
- @NgModule({
7
- declarations: [SnackbarComponent],
8
- imports: [CommonModule, MatSnackBarModule],
9
- exports: [SnackbarComponent]
10
- })
11
- export class SnackbarModule {}
@@ -1,47 +0,0 @@
1
- <div class="cc-summary-card" (click)="onCardClick()">
2
- <!-- Icon Section (Left Side) -->
3
- <div class="icon-section" *ngIf="config.icon || config.iconImage" [ngClass]="config.iconClass"
4
- [ngStyle]="iconStyles">
5
- <mat-icon *ngIf="config.icon">{{ config.icon }}</mat-icon>
6
- <img *ngIf="!config.icon && config.iconImage" [src]="config.iconImage" [alt]="labels.iconAlt">
7
- </div>
8
-
9
- <!-- Right Section (Header + Value/Meta) -->
10
- <div class="right-section">
11
- <!-- Header (Full Width on Right) -->
12
- <div class="header" [ngClass]="config.headerClass" [ngStyle]="headerStyles">
13
- {{ config.header }}
14
- </div>
15
-
16
- <!-- Value and Meta Row -->
17
- <div class="value-meta-row">
18
- <!-- Content Section -->
19
- <div class="content-section">
20
- <!-- Value Row (with optional inline description) -->
21
- <div class="value-row" [class.inline-layout]="isDescriptionInline">
22
- <div class="value-container">
23
- <div class="value" [ngClass]="config.valueClass" [ngStyle]="valueStyles">
24
- {{ config.value }}
25
- <span *ngIf="config.valueSubtext" class="value-subtext">{{ config.valueSubtext }}</span>
26
- </div>
27
- </div>
28
-
29
- <!-- Description (inline or bottom based on config) -->
30
- <div class="description" *ngIf="config.description" [ngClass]="config.descriptionClass"
31
- [ngStyle]="descriptionStyles">
32
- {{ config.description }}
33
- </div>
34
- </div>
35
- </div>
36
-
37
- <!-- Meta/Status Section (Aligned with Value) -->
38
- <div class="meta-section" *ngIf="config.metaData && config.metaData.length > 0">
39
- <div *ngFor="let meta of config.metaData" class="meta-item"
40
- [ngClass]="[meta.type === 'pill' ? 'meta-pill' : 'meta-text', meta.cssClass || '']"
41
- [ngStyle]="getMetaStyles(meta)">
42
- {{ meta.text }}
43
- </div>
44
- </div>
45
- </div>
46
- </div>
47
- </div>