commons-shared-web-ui 0.0.50 → 0.0.51

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 (186) hide show
  1. package/fesm2022/commons-shared-web-ui.mjs +13828 -0
  2. package/fesm2022/commons-shared-web-ui.mjs.map +1 -0
  3. package/index.d.ts +4258 -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 -597
  15. package/documentation/form-components.md +0 -384
  16. package/documentation/nav.md +0 -427
  17. package/documentation/pagination.md +0 -181
  18. package/documentation/side-nav-documentation.md +0 -169
  19. package/documentation/smart-form.md +0 -2405
  20. package/documentation/smart-table.md +0 -1221
  21. package/documentation/snackbar.md +0 -118
  22. package/documentation/style-externalization.md +0 -88
  23. package/documentation/summary-card.md +0 -279
  24. package/ng-package.json +0 -28
  25. package/src/lib/modules/alert/alert.models.ts +0 -6
  26. package/src/lib/modules/alert/alert.module.ts +0 -16
  27. package/src/lib/modules/alert/components/alert/alert.component.html +0 -27
  28. package/src/lib/modules/alert/components/alert/alert.component.scss +0 -92
  29. package/src/lib/modules/alert/components/alert/alert.component.ts +0 -81
  30. package/src/lib/modules/button/button.models.ts +0 -13
  31. package/src/lib/modules/button/button.module.ts +0 -16
  32. package/src/lib/modules/button/components/button/button.component.html +0 -22
  33. package/src/lib/modules/button/components/button/button.component.scss +0 -88
  34. package/src/lib/modules/button/components/button/button.component.ts +0 -67
  35. package/src/lib/modules/button-dropdown/button-dropdown.models.ts +0 -26
  36. package/src/lib/modules/button-dropdown/button-dropdown.module.ts +0 -22
  37. package/src/lib/modules/button-dropdown/button-dropdown.theme.scss +0 -87
  38. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.html +0 -41
  39. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.scss +0 -135
  40. package/src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.ts +0 -160
  41. package/src/lib/modules/configurable-form/component/configurable-form.component.html +0 -294
  42. package/src/lib/modules/configurable-form/component/configurable-form.component.scss +0 -503
  43. package/src/lib/modules/configurable-form/component/configurable-form.component.ts +0 -628
  44. package/src/lib/modules/configurable-form/configurable-form.examples.ts +0 -154
  45. package/src/lib/modules/configurable-form/configurable-form.model.ts +0 -131
  46. package/src/lib/modules/configurable-form/configurable-form.module.ts +0 -19
  47. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.html +0 -77
  48. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.scss +0 -395
  49. package/src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.ts +0 -266
  50. package/src/lib/modules/confirmation-modal/confirmation-modal.models.ts +0 -71
  51. package/src/lib/modules/confirmation-modal/confirmation-modal.module.ts +0 -20
  52. package/src/lib/modules/filter/components/filter/filter.component.html +0 -131
  53. package/src/lib/modules/filter/components/filter/filter.component.scss +0 -245
  54. package/src/lib/modules/filter/components/filter/filter.component.ts +0 -216
  55. package/src/lib/modules/filter/filter.models.ts +0 -88
  56. package/src/lib/modules/filter/filter.module.ts +0 -24
  57. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.html +0 -112
  58. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.scss +0 -186
  59. package/src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.ts +0 -163
  60. package/src/lib/modules/filter-sidebar/filter-sidebar.models.ts +0 -95
  61. package/src/lib/modules/filter-sidebar/filter-sidebar.module.ts +0 -24
  62. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.html +0 -73
  63. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.scss +0 -321
  64. package/src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.ts +0 -361
  65. package/src/lib/modules/filter-table-selector/filter-table-selector.models.ts +0 -91
  66. package/src/lib/modules/filter-table-selector/filter-table-selector.module.ts +0 -22
  67. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.html +0 -63
  68. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.scss +0 -496
  69. package/src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.ts +0 -445
  70. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.html +0 -75
  71. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.scss +0 -210
  72. package/src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.ts +0 -55
  73. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.html +0 -25
  74. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.scss +0 -82
  75. package/src/lib/modules/form-builder/components/field-configurator/field-configurator.component.ts +0 -95
  76. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.html +0 -20
  77. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.scss +0 -37
  78. package/src/lib/modules/form-builder/components/field-selection/field-selection.component.ts +0 -94
  79. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.html +0 -46
  80. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.scss +0 -102
  81. package/src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.ts +0 -50
  82. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.html +0 -35
  83. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.scss +0 -67
  84. package/src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.ts +0 -34
  85. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.html +0 -68
  86. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.scss +0 -113
  87. package/src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.ts +0 -74
  88. package/src/lib/modules/form-builder/configs/field-type-schema.map.ts +0 -533
  89. package/src/lib/modules/form-builder/form-builder.module.ts +0 -36
  90. package/src/lib/modules/form-builder/index.ts +0 -9
  91. package/src/lib/modules/form-builder/models/builder.models.ts +0 -7
  92. package/src/lib/modules/form-builder/models/field-configurator.models.ts +0 -38
  93. package/src/lib/modules/form-builder/models/field-selection.models.ts +0 -51
  94. package/src/lib/modules/form-builder/services/field-configurator.service.ts +0 -258
  95. package/src/lib/modules/form-builder/services/field-selection.service.ts +0 -299
  96. package/src/lib/modules/form-builder/services/form-schema-tree.service.ts +0 -670
  97. package/src/lib/modules/form-builder/tokens/builder.tokens.ts +0 -10
  98. package/src/lib/modules/form-builder/utils/constants.ts +0 -43
  99. package/src/lib/modules/form-components/components/checkbox/checkbox.component.html +0 -29
  100. package/src/lib/modules/form-components/components/checkbox/checkbox.component.scss +0 -111
  101. package/src/lib/modules/form-components/components/checkbox/checkbox.component.ts +0 -207
  102. package/src/lib/modules/form-components/components/checkbox/checkbox.models.ts +0 -35
  103. package/src/lib/modules/form-components/components/datepicker/datepicker.component.html +0 -42
  104. package/src/lib/modules/form-components/components/datepicker/datepicker.component.scss +0 -115
  105. package/src/lib/modules/form-components/components/datepicker/datepicker.component.ts +0 -267
  106. package/src/lib/modules/form-components/components/datepicker/datepicker.models.ts +0 -45
  107. package/src/lib/modules/form-components/components/dropdown/dropdown.component.html +0 -74
  108. package/src/lib/modules/form-components/components/dropdown/dropdown.component.scss +0 -252
  109. package/src/lib/modules/form-components/components/dropdown/dropdown.component.ts +0 -377
  110. package/src/lib/modules/form-components/components/dropdown/dropdown.models.ts +0 -53
  111. package/src/lib/modules/form-components/components/input/input.component.html +0 -51
  112. package/src/lib/modules/form-components/components/input/input.component.scss +0 -128
  113. package/src/lib/modules/form-components/components/input/input.component.ts +0 -250
  114. package/src/lib/modules/form-components/components/input/input.models.ts +0 -55
  115. package/src/lib/modules/form-components/components/radio/radio.component.html +0 -22
  116. package/src/lib/modules/form-components/components/radio/radio.component.scss +0 -107
  117. package/src/lib/modules/form-components/components/radio/radio.component.ts +0 -181
  118. package/src/lib/modules/form-components/components/radio/radio.models.ts +0 -39
  119. package/src/lib/modules/form-components/components/search/search.component.html +0 -15
  120. package/src/lib/modules/form-components/components/search/search.component.scss +0 -87
  121. package/src/lib/modules/form-components/components/search/search.component.ts +0 -213
  122. package/src/lib/modules/form-components/components/search/search.models.ts +0 -40
  123. package/src/lib/modules/form-components/components/toggle/toggle.component.html +0 -15
  124. package/src/lib/modules/form-components/components/toggle/toggle.component.scss +0 -81
  125. package/src/lib/modules/form-components/components/toggle/toggle.component.ts +0 -166
  126. package/src/lib/modules/form-components/components/toggle/toggle.models.ts +0 -27
  127. package/src/lib/modules/form-components/directives/click-outside.directive.ts +0 -22
  128. package/src/lib/modules/form-components/form-components.module.ts +0 -41
  129. package/src/lib/modules/material/material.module.ts +0 -94
  130. package/src/lib/modules/nav/components/nav/nav.component.html +0 -34
  131. package/src/lib/modules/nav/components/nav/nav.component.scss +0 -171
  132. package/src/lib/modules/nav/components/nav/nav.component.ts +0 -82
  133. package/src/lib/modules/nav/nav.models.ts +0 -31
  134. package/src/lib/modules/nav/nav.module.ts +0 -17
  135. package/src/lib/modules/pagination/components/pagination/pagination.component.html +0 -52
  136. package/src/lib/modules/pagination/components/pagination/pagination.component.scss +0 -155
  137. package/src/lib/modules/pagination/components/pagination/pagination.component.ts +0 -109
  138. package/src/lib/modules/pagination/pagination.module.ts +0 -17
  139. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.html +0 -56
  140. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.scss +0 -342
  141. package/src/lib/modules/side-nav/components/side-nav/side-nav.component.ts +0 -135
  142. package/src/lib/modules/side-nav/side-nav.models.ts +0 -38
  143. package/src/lib/modules/side-nav/side-nav.module.ts +0 -16
  144. package/src/lib/modules/smart-form/components/form-field/form-field.component.html +0 -1196
  145. package/src/lib/modules/smart-form/components/form-field/form-field.component.scss +0 -2014
  146. package/src/lib/modules/smart-form/components/form-field/form-field.component.ts +0 -2525
  147. package/src/lib/modules/smart-form/components/form-section/form-section.component.html +0 -65
  148. package/src/lib/modules/smart-form/components/form-section/form-section.component.scss +0 -209
  149. package/src/lib/modules/smart-form/components/form-section/form-section.component.ts +0 -131
  150. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.html +0 -253
  151. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.scss +0 -689
  152. package/src/lib/modules/smart-form/components/smart-form/smart-form.component.ts +0 -1124
  153. package/src/lib/modules/smart-form/index.ts +0 -10
  154. package/src/lib/modules/smart-form/models/form-schema.model.ts +0 -733
  155. package/src/lib/modules/smart-form/models/hierarchy-config.model.ts +0 -21
  156. package/src/lib/modules/smart-form/services/expression.service.ts +0 -75
  157. package/src/lib/modules/smart-form/services/smart-form-controller.service.ts +0 -65
  158. package/src/lib/modules/smart-form/smart-form.examples.ts +0 -1324
  159. package/src/lib/modules/smart-form/smart-form.module.ts +0 -36
  160. package/src/lib/modules/smart-form/utils/translation.utils.ts +0 -82
  161. package/src/lib/modules/smart-form/utils/trusted-url.pipe.ts +0 -25
  162. package/src/lib/modules/smart-form/utils/validation.utils.ts +0 -98
  163. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.html +0 -283
  164. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.scss +0 -685
  165. package/src/lib/modules/smart-table/components/smart-table/smart-table.component.ts +0 -1128
  166. package/src/lib/modules/smart-table/models/table-config.model.ts +0 -207
  167. package/src/lib/modules/smart-table/smart-table.module.ts +0 -30
  168. package/src/lib/modules/smart-table/utils/safe-html.pipe.ts +0 -28
  169. package/src/lib/modules/smart-table/utils/smart-table.utils.ts +0 -18
  170. package/src/lib/modules/snackbar/components/snackbar.component.html +0 -41
  171. package/src/lib/modules/snackbar/components/snackbar.component.scss +0 -99
  172. package/src/lib/modules/snackbar/components/snackbar.component.ts +0 -18
  173. package/src/lib/modules/snackbar/models/snackbar.models.ts +0 -10
  174. package/src/lib/modules/snackbar/services/snackbar.service.ts +0 -40
  175. package/src/lib/modules/snackbar/snackbar.module.ts +0 -11
  176. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.html +0 -47
  177. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.scss +0 -199
  178. package/src/lib/modules/summary-card/components/summary-card/summary-card.component.ts +0 -126
  179. package/src/lib/modules/summary-card/summary-card.module.ts +0 -18
  180. package/src/lib/shared-ui.module.ts +0 -44
  181. package/src/lib/utils/constants.ts +0 -11
  182. package/src/lib/utils/storage.utils.ts +0 -37
  183. package/src/lib/utils/string.utils.ts +0 -23
  184. package/src/lib/utils/translation.utils.ts +0 -87
  185. package/src/public-api.ts +0 -104
  186. package/tsconfig.lib.json +0 -15
@@ -1,207 +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
- }
43
-
44
- export interface TableFilter {
45
- key: string;
46
- label: string;
47
- type: 'select' | 'text' | 'date'; // Added type for future extension
48
- options?: TableOption[];
49
- apiUrl?: string;
50
- apiMethod?: 'GET' | 'POST';
51
- apiPayload?: any;
52
- labelKey?: string;
53
- valueKey?: string;
54
- labelPath?: string;
55
- valuePath?: string;
56
- requestKey?: string;
57
- dataPath?: string;
58
- handling?: 'standard' | 'nested_string';
59
- nestedStringConfig?: NestedStringConfig;
60
- }
61
-
62
- export interface TableActionItem {
63
- label: string;
64
- type: 'api' | 'callback' | 'route' | 'delete';
65
- icon?: string;
66
- apiUrl?: string;
67
- apiMethod?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
68
- route?: string;
69
- confirmationNeeded?: boolean;
70
- confirmationMessage?: string;
71
- callback?: (row: any) => void;
72
- /** Set to false to hide this action item. Default: true */
73
- isEnabled?: boolean;
74
- /** Config for native 'delete' action type — drives the built-in confirmation modal */
75
- deleteConfig?: {
76
- apiUrl: string; // URL with :id placeholder e.g. 'gateway/service/api/v1/items/:id'
77
- idField?: string; // Row field used as id (default: 'id')
78
- modalTitle?: string;
79
- modalMessage?: string;
80
- confirmLabel?: string;
81
- cancelLabel?: string;
82
- };
83
- }
84
-
85
- export interface TableAction {
86
- label: string;
87
- type: 'api' | 'callback' | 'route' | 'edit' | 'dropdown';
88
- icon?: string; // FontAwesome class or similar
89
- btnVariant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'warning' | 'success' | 'danger-outline'; // utilizing button variants
90
- apiUrl?: string;
91
- apiMethod?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
92
- route?: string;
93
- confirmationNeeded?: boolean;
94
- confirmationMessage?: string;
95
- callback?: (row: any) => void;
96
- items?: TableActionItem[]; // For dropdown type
97
- /** Set to false to hide this action. Default: true */
98
- isEnabled?: boolean;
99
- }
100
-
101
- export interface PaginationConfig {
102
- enabled: boolean;
103
- pageSize: number;
104
- pageSizeOptions: number[];
105
- totalCountConfig?: {
106
- source: 'same' | 'separate';
107
- apiUrl?: string;
108
- responsePath?: string;
109
- };
110
- }
111
-
112
- export interface TableTheme {
113
- primaryColor?: string;
114
- headerBg?: string;
115
- headerColor?: string;
116
- rowHoverBg?: string;
117
- borderColor?: string;
118
- }
119
-
120
- export interface NestedStringConfig {
121
- paramName: string;
122
- baseValue?: string;
123
- separator: string;
124
- assignment: string;
125
- }
126
-
127
- export interface QueryParamsConfig {
128
- pageKey?: string;
129
- sizeKey?: string;
130
- pageIndexOffset?: number; // e.g. -1 for 0-based index from 1-based UI
131
- filterHandling?: 'standard' | 'nested_string';
132
- nestedStringConfig?: NestedStringConfig;
133
- }
134
-
135
- export interface TableConfig {
136
- columns: TableColumn[];
137
- apiUrl?: string; // Optional when tableData is provided externally
138
- apiMethod?: 'GET' | 'POST';
139
- apiPayload?: any;
140
- dataResponsePath?: string;
141
- filters?: TableFilter[];
142
- filterData?: { [key: string]: any[] };
143
- pagination?: PaginationConfig;
144
- actions?: TableAction[]; // Row level actions
145
- topBarButtons?: TableAction[]; // Buttons above the table
146
- sortBy?: string;
147
- orderBy?: 'ASC' | 'DESC';
148
- theme?: TableTheme;
149
- requestParams?: Function;
150
- selectable?: boolean; // Checkbox selection
151
- queryParamsConfig?: QueryParamsConfig;
152
- labels?: TableLabels;
153
- searchConfig?: SearchConfig;
154
- maxHeight?: string;
155
- stickyHeader?: boolean;
156
-
157
- stickyColumnCount?: number;
158
- token?: string; // Full token string (e.g. "Bearer ...")
159
- tokenHeader?: string; // Header key (default: "Authorization")
160
- editingRowClass?: string; // Optional CSS class to apply to rows being edited
161
- /** Fallback text for any cell whose value is null, undefined, or empty string.
162
- * Overridden per-column via TableColumn.emptyValue. Library default: '-' */
163
- emptyValue?: string;
164
- }
165
-
166
- export interface SearchConfig {
167
- enabled: boolean;
168
- searchKey?: string; // Query param key (default: 'search')
169
- debounceTime?: number; // ms (default: 300)
170
- handling?: 'standard' | 'nested_string'; // standard: ?search=term, nested_string: ?params=SEARCH_TERM=term
171
- minimumCharacter?: number; // Min chars before the API is called (default: 3). Clearing the input always re-triggers.
172
- }
173
-
174
- export interface TableLabels {
175
- searchPlaceholder?: string;
176
- actionColumnHeader?: string;
177
- noDataMessage?: string;
178
- itemsPerPageLabel?: string;
179
- defaultConfirmationMessage?: string;
180
- saveLabel?: string;
181
- cancelLabel?: string;
182
- addLabel?: string;
183
- /** Variant for the Add button (new row). Defaults to 'danger'. */
184
- addButtonVariant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'warning' | 'success' | 'danger-outline';
185
- /** Variant for the Save button (edit row). Defaults to 'primary'. */
186
- saveButtonVariant?: 'primary' | 'secondary' | 'outline' | 'danger' | 'warning' | 'success' | 'danger-outline';
187
- }
188
-
189
- /**
190
- * Emitted by the SmartTableComponent when operating in external-data mode
191
- * (i.e. when [tableData] input is provided by the parent).
192
- * The parent is responsible for fetching updated data based on this event
193
- * and providing it back via [tableData] and [totalItemsCount].
194
- */
195
- export interface TableDataChangeEvent {
196
- page: number;
197
- pageSize: number;
198
- sortBy?: string;
199
- orderBy?: 'ASC' | 'DESC';
200
- searchTerm?: string;
201
- filters?: { [key: string]: any };
202
- }
203
-
204
- export interface TableRowSaveEvent {
205
- row: any;
206
- isNew: boolean;
207
- }
@@ -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>