@vc-shell/framework 1.0.293 → 1.0.294

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 (95) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/core/composables/useLanguages/index.ts +30 -0
  3. package/core/composables/useMenuService/index.ts +1 -1
  4. package/core/composables/useSettings/index.ts +2 -3
  5. package/core/composables/useTheme/index.ts +2 -1
  6. package/core/composables/useUser/index.ts +4 -76
  7. package/core/constants/index.ts +1 -0
  8. package/core/constants/locale.ts +78 -0
  9. package/core/interceptors/index.ts +3 -0
  10. package/core/plugins/modularity/index.ts +106 -16
  11. package/dist/core/composables/useLanguages/index.d.ts +5 -0
  12. package/dist/core/composables/useLanguages/index.d.ts.map +1 -1
  13. package/dist/core/composables/useSettings/index.d.ts.map +1 -1
  14. package/dist/core/composables/useTheme/index.d.ts.map +1 -1
  15. package/dist/core/composables/useUser/index.d.ts +1 -3
  16. package/dist/core/composables/useUser/index.d.ts.map +1 -1
  17. package/dist/core/constants/index.d.ts +2 -0
  18. package/dist/core/constants/index.d.ts.map +1 -0
  19. package/dist/core/constants/locale.d.ts +7 -0
  20. package/dist/core/constants/locale.d.ts.map +1 -0
  21. package/dist/core/interceptors/index.d.ts.map +1 -1
  22. package/dist/core/plugins/modularity/index.d.ts.map +1 -1
  23. package/dist/framework.js +21278 -20967
  24. package/dist/index.css +1 -1
  25. package/dist/index.d.ts +9 -4
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/locales/en.json +2 -1
  28. package/dist/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -1
  29. package/dist/shared/components/index.d.ts +1 -0
  30. package/dist/shared/components/index.d.ts.map +1 -1
  31. package/dist/shared/components/language-selector/language-selector.vue.d.ts.map +1 -1
  32. package/dist/shared/components/sidebar/sidebar.vue.d.ts +1 -1
  33. package/dist/shared/components/sidebar/sidebar.vue.d.ts.map +1 -1
  34. package/dist/shared/components/sign-in/azuread.vue.d.ts +17 -0
  35. package/dist/shared/components/sign-in/azuread.vue.d.ts.map +1 -0
  36. package/dist/shared/components/sign-in/external-provider.vue.d.ts +23 -0
  37. package/dist/shared/components/sign-in/external-provider.vue.d.ts.map +1 -0
  38. package/dist/shared/components/sign-in/external-providers.vue.d.ts +16 -0
  39. package/dist/shared/components/sign-in/external-providers.vue.d.ts.map +1 -0
  40. package/dist/shared/components/sign-in/index.d.ts +2 -0
  41. package/dist/shared/components/sign-in/index.d.ts.map +1 -0
  42. package/dist/shared/components/sign-in/useExternalProvider.d.ts +12 -0
  43. package/dist/shared/components/sign-in/useExternalProvider.d.ts.map +1 -0
  44. package/dist/shared/components/theme-selector/theme-selector.vue.d.ts.map +1 -1
  45. package/dist/shared/modules/dynamic/index.d.ts +13 -10
  46. package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
  47. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +1 -0
  48. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  49. package/dist/shared/pages/LoginPage/components/login/Login.vue.d.ts.map +1 -1
  50. package/dist/tailwind.config.d.ts +1 -1
  51. package/dist/tailwind.config.d.ts.map +1 -1
  52. package/dist/tsconfig.tsbuildinfo +1 -1
  53. package/dist/ui/components/atoms/vc-image/index.d.ts +1 -68
  54. package/dist/ui/components/atoms/vc-image/index.d.ts.map +1 -1
  55. package/dist/ui/components/atoms/vc-image/vc-image.stories.d.ts +3 -3
  56. package/dist/ui/components/atoms/vc-image/vc-image.vue.d.ts +2 -2
  57. package/dist/ui/components/atoms/vc-image/vc-image.vue.d.ts.map +1 -1
  58. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts +2 -2
  59. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  60. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  61. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts +1 -1
  62. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
  63. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +30 -30
  64. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +9 -6
  65. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  66. package/package.json +5 -5
  67. package/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue +1 -2
  68. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +1 -1
  69. package/shared/components/index.ts +1 -0
  70. package/shared/components/language-selector/language-selector.vue +59 -6
  71. package/shared/components/sidebar/sidebar.vue +1 -1
  72. package/shared/components/sign-in/azuread.vue +24 -0
  73. package/shared/components/sign-in/external-provider.vue +38 -0
  74. package/shared/components/sign-in/external-providers.vue +39 -0
  75. package/shared/components/sign-in/index.ts +1 -0
  76. package/shared/components/sign-in/useExternalProvider.ts +102 -0
  77. package/shared/components/theme-selector/theme-selector.vue +7 -8
  78. package/shared/modules/dynamic/helpers/nodeBuilder.ts +2 -2
  79. package/shared/modules/dynamic/helpers/override.ts +1 -1
  80. package/shared/modules/dynamic/index.ts +166 -63
  81. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +99 -20
  82. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +1 -1
  83. package/shared/pages/LoginPage/components/login/Login.vue +8 -40
  84. package/tailwind.config.ts +6 -198
  85. package/ui/components/atoms/vc-image/index.ts +1 -3
  86. package/ui/components/atoms/vc-image/vc-image.vue +3 -2
  87. package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +1 -1
  88. package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +1 -1
  89. package/ui/components/molecules/vc-input/vc-input.vue +38 -0
  90. package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +1 -1
  91. package/ui/components/molecules/vc-select/vc-select.vue +15 -5
  92. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +2 -24
  93. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +12 -3
  94. package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +1 -1
  95. package/ui/components/organisms/vc-table/vc-table.vue +124 -65
@@ -329,7 +329,7 @@
329
329
  >
330
330
  <VcTableCell
331
331
  :item="item as TableItem"
332
- :cell="cell"
332
+ :cell="cell as ITableColumns"
333
333
  :index="itemIndex"
334
334
  :editing="editing"
335
335
  @update="$emit('onEditComplete', { event: $event, index: itemIndex })"
@@ -484,12 +484,18 @@ export interface TableItem {
484
484
  actions?: IActionBuilderResult[];
485
485
  }
486
486
 
487
+ export type TableColPartial = Partial<
488
+ ITableColumns & {
489
+ predefined?: boolean;
490
+ }
491
+ >;
492
+
487
493
  defineSlots<{
488
494
  header: (props: { header: VNode }) => any;
489
495
  filters: (args: { closePanel: () => void }) => any;
490
496
  "mobile-item": (args: { item: T }) => any;
491
497
  [key: `header_${string}`]: (props: any) => any;
492
- [key: `item_${string}`]: (args: { item: T; cell: ITableColumns; index: number }) => any;
498
+ [key: `item_${string}`]: (args: { item: T; cell: ITableColumns | TableColPartial; index: number }) => any;
493
499
  notfound: (props: any) => any;
494
500
  empty: (props: any) => any;
495
501
  footer: (props: any) => any;
@@ -586,18 +592,15 @@ const itemActions: Ref<IActionBuilderResult[][]> = ref([]);
586
592
  const disabledSelection: Ref<T[]> = ref([]);
587
593
  const mobileSwipeItem = ref<string>();
588
594
  const columnResizing = ref(false);
589
- const resizeColumnElement = ref<ITableColumns>();
590
- const nextColumn = ref<ITableColumns>();
595
+ const resizeColumnElement = ref<TableColPartial>();
596
+ const nextColumn = ref<TableColPartial>();
591
597
  const lastResize = ref<number>();
592
598
  const table = useCurrentElement();
593
599
  const resizer = ref();
594
600
  const isHeaderHover = ref(false);
595
601
  const columnSwitcherActive = ref(false);
596
- const state = useLocalStorage<Partial<ITableColumns & { predefined: boolean }>[]>(
597
- "VC_TABLE_STATE_" + props.stateKey.toUpperCase(),
598
- [],
599
- );
600
- const internalColumns: Ref<ITableColumns[]> = ref([]);
602
+ const state = useLocalStorage<TableColPartial[]>("VC_TABLE_STATE_" + props.stateKey.toUpperCase(), []);
603
+ const internalColumns: Ref<TableColPartial[]> = ref([]);
601
604
  const draggedColumn = ref();
602
605
  const draggedElement = ref<HTMLElement>();
603
606
  const dropPosition = ref();
@@ -711,7 +714,7 @@ const headerComponent = () =>
711
714
  : undefined,
712
715
  );
713
716
 
714
- const allColumns = ref([]) as Ref<ITableColumns[]>;
717
+ const allColumns = ref([]) as Ref<TableColPartial[]>;
715
718
 
716
719
  const mobileTemplateRenderer = ({ item, index }: { item: TableItem | string; index: number }) => {
717
720
  return h(
@@ -759,11 +762,12 @@ watch(
759
762
  );
760
763
 
761
764
  watch(
762
- () => props.items,
763
- (newVal) => {
765
+ [() => props.items, () => props.columns],
766
+ ([newValItems, newValCols]) => {
764
767
  let cols: ITableColumns[] = [];
765
- if (newVal && newVal.length) {
766
- cols = Object.keys(newVal[0]).map((key) => {
768
+ let predefinedCols: ITableColumns[] = [];
769
+ if (newValItems && newValItems.length) {
770
+ cols = Object.keys(newValItems[0]).map((key) => {
767
771
  return {
768
772
  id: key,
769
773
  // From camelCase to human readable with first letter capitalized
@@ -774,14 +778,18 @@ watch(
774
778
  });
775
779
  }
776
780
 
777
- const predefined = props.columns.map((item) => ({
778
- ...item,
779
- predefined: true,
780
- visible: typeof item.visible !== "undefined" ? item.visible : true,
781
- }));
782
- allColumns.value = _.unionBy(predefined, cols, "id");
781
+ if (newValCols && newValCols.length) {
782
+ // Update internal columns based on predefined columns
783
+ predefinedCols = newValCols.map((item) => ({
784
+ ...item,
785
+ predefined: true,
786
+ visible: typeof item.visible !== "undefined" ? item.visible : true,
787
+ }));
788
+ }
789
+
790
+ allColumns.value = _.unionBy(predefinedCols, cols, "id");
783
791
 
784
- restoreState();
792
+ restoreState(predefinedCols);
785
793
  columnsInit.value = false;
786
794
  },
787
795
  { deep: true, immediate: true },
@@ -960,11 +968,13 @@ function handleSwipe(id: string) {
960
968
  mobileSwipeItem.value = id;
961
969
  }
962
970
 
963
- function handleHeaderClick(item: ITableColumns) {
964
- emit("headerClick", item);
971
+ function handleHeaderClick(item: TableColPartial) {
972
+ const cleanCol = item;
973
+ delete cleanCol.predefined;
974
+ emit("headerClick", cleanCol as ITableColumns);
965
975
  }
966
976
 
967
- function handleMouseDown(e: MouseEvent, item: ITableColumns) {
977
+ function handleMouseDown(e: MouseEvent, item: TableColPartial) {
968
978
  if (props.resizableColumns) {
969
979
  const containerLeft = getOffset(table.value as HTMLElement).left;
970
980
  resizeColumnElement.value = item;
@@ -1068,15 +1078,26 @@ function onColumnResizeEnd() {
1068
1078
  }
1069
1079
 
1070
1080
  function resizeTableCells(newColumnWidth: number, nextColumnWidth: number) {
1071
- if (resizeColumnElement.value) {
1072
- resizeColumnElement.value.width = newColumnWidth + "px";
1073
- }
1074
- if (nextColumn.value) {
1075
- nextColumn.value.width = nextColumnWidth + "px";
1076
- }
1081
+ const colIndex = internalColumns.value.findIndex((col) => col.id === resizeColumnElement.value?.id);
1082
+ const widths: number[] = [];
1083
+ const tableHeaders = (table.value as HTMLDivElement)?.querySelectorAll(
1084
+ ".vc-table__header-cell",
1085
+ ) as NodeListOf<HTMLElement>;
1086
+ tableHeaders.forEach((header) => widths.push(header.offsetWidth));
1087
+
1088
+ internalColumns.value.forEach((col, index) => {
1089
+ col.width = widths[index] + "px";
1090
+ });
1091
+
1092
+ widths.forEach((width, index) => {
1093
+ const colWidth =
1094
+ index === colIndex ? newColumnWidth : nextColumnWidth && index === colIndex + 1 ? nextColumnWidth : width;
1095
+
1096
+ internalColumns.value[index].width = colWidth + "px";
1097
+ });
1077
1098
  }
1078
1099
 
1079
- function onColumnHeaderDragStart(event: DragEvent, item: ITableColumns) {
1100
+ function onColumnHeaderDragStart(event: DragEvent, item: TableColPartial) {
1080
1101
  if (columnResizing.value) {
1081
1102
  event.preventDefault();
1082
1103
  return;
@@ -1090,12 +1111,12 @@ function onColumnHeaderDragStart(event: DragEvent, item: ITableColumns) {
1090
1111
  }
1091
1112
 
1092
1113
  function findParentHeader(element: HTMLElement) {
1093
- if (element.classList.contains("vc-table__header")) {
1114
+ if (element.classList.contains("vc-table__header-cell")) {
1094
1115
  return element;
1095
1116
  } else {
1096
1117
  let parent = element.parentElement;
1097
1118
 
1098
- while (parent && !parent.classList.contains("vc-table__header")) {
1119
+ while (parent && !parent.classList.contains("vc-table__header-cell")) {
1099
1120
  parent = parent.parentElement;
1100
1121
  if (!parent) break;
1101
1122
  }
@@ -1141,7 +1162,7 @@ function onColumnHeaderDragLeave(event: DragEvent) {
1141
1162
  }
1142
1163
  }
1143
1164
 
1144
- function onColumnHeaderDrop(event: DragEvent, item: ITableColumns) {
1165
+ function onColumnHeaderDrop(event: DragEvent, item: TableColPartial) {
1145
1166
  event.preventDefault();
1146
1167
 
1147
1168
  if (draggedColumn.value) {
@@ -1182,37 +1203,79 @@ function saveState() {
1182
1203
  state.value = colsClone.map((col) => _.pick(col, "id", "visible", "width", "predefined"));
1183
1204
  }
1184
1205
 
1185
- function restoreState() {
1186
- console.debug("[@vc-shell/framework#vc-table.vue] - Restore state");
1187
-
1188
- if (state.value && state.value.length) {
1189
- // Iterate over the state value and update corresponding columns in allColumns
1190
- for (const item of state.value) {
1191
- const matchingColumn = _.cloneDeep(allColumns.value.find((col) => col.id === item.id));
1192
- if (matchingColumn) {
1193
- matchingColumn.width = item.width || matchingColumn.width;
1194
- matchingColumn.visible = item.visible;
1195
- // Remove the matched column from internalColumns
1196
- internalColumns.value = internalColumns.value.filter((col) => col.id !== matchingColumn.id);
1197
- }
1198
- if (item.predefined && !props.columns.some((col) => col.id === item.id)) {
1199
- _.remove(state.value, item);
1200
- }
1201
- }
1202
- // Merge the updated columns with the remaining state columns
1203
- internalColumns.value = state.value.map((stateItem) => {
1204
- const id = stateItem.id;
1206
+ function restoreState(predefinedColumns: TableColPartial[] = []) {
1207
+ const storedState = state.value;
1208
+
1209
+ if (!storedState?.length) {
1210
+ internalColumns.value = allColumns.value;
1211
+ return;
1212
+ }
1205
1213
 
1206
- const propsColumn = _.find(props.columns, { id });
1207
- const allColumn = _.find(allColumns.value, { id });
1214
+ const predefinedMap = new Map(predefinedColumns.map((col) => [col.id, col]));
1208
1215
 
1209
- return _.merge({}, propsColumn, allColumn, stateItem);
1210
- });
1216
+ const mergedColumns = storedState.map((storedCol) => {
1217
+ const predefinedCol = predefinedMap.get(storedCol.id);
1218
+ return mergeColumns(storedCol, predefinedCol);
1219
+ });
1220
+
1221
+ resetRemovedColumns(storedState, predefinedMap, mergedColumns);
1222
+
1223
+ setTitles(mergedColumns);
1224
+
1225
+ allColumns.value = [...mergedColumns];
1226
+ internalColumns.value = allColumns.value;
1227
+
1228
+ saveState();
1229
+ }
1230
+
1231
+ function mergeColumns(storedCol: TableColPartial, predefinedCol: TableColPartial | undefined) {
1232
+ if (predefinedCol) {
1233
+ if (predefinedCol.predefined && !storedCol.predefined) {
1234
+ return { ...predefinedCol, predefined: true };
1235
+ } else {
1236
+ return {
1237
+ ...predefinedCol,
1238
+ visible: storedCol.visible,
1239
+ width: storedCol.width,
1240
+ title: predefinedCol.title || storedCol.title || "",
1241
+ };
1242
+ }
1211
1243
  } else {
1212
- internalColumns.value = allColumns.value;
1244
+ return { ...storedCol, predefined: false };
1213
1245
  }
1214
1246
  }
1215
1247
 
1248
+ function resetRemovedColumns(
1249
+ storedState: TableColPartial[],
1250
+ predefinedMap: Map<string | undefined, TableColPartial>,
1251
+ mergedColumns: TableColPartial[],
1252
+ ) {
1253
+ storedState.forEach((storedCol) => {
1254
+ if (storedCol.predefined && !predefinedMap.has(storedCol.id)) {
1255
+ const existingColumnIndex = mergedColumns.findIndex((col) => col.id === storedCol.id);
1256
+ if (existingColumnIndex !== -1) {
1257
+ mergedColumns[existingColumnIndex] = {
1258
+ ...mergedColumns[existingColumnIndex],
1259
+ visible: false,
1260
+ width: undefined,
1261
+ predefined: false,
1262
+ };
1263
+ }
1264
+ }
1265
+ });
1266
+ }
1267
+
1268
+ function setTitles(mergedColumns: TableColPartial[]) {
1269
+ mergedColumns.forEach((col) => {
1270
+ if (!col.title) {
1271
+ const originalColumn = allColumns.value.find((c) => c.id === col.id);
1272
+ if (originalColumn) {
1273
+ col.title = originalColumn.title;
1274
+ }
1275
+ }
1276
+ });
1277
+ }
1278
+
1216
1279
  function reorderArray(value: unknown[], from: number, to: number) {
1217
1280
  if (value && from !== to) {
1218
1281
  if (to >= value.length) {
@@ -1433,7 +1496,7 @@ $variants: (
1433
1496
  &__mobile-view {
1434
1497
  @apply tw-grow tw-basis-0 tw-relative;
1435
1498
  .vc-container__inner {
1436
- @apply tw-flex tw-flex-grow;
1499
+ @apply tw-flex tw-flex-grow tw-flex-col;
1437
1500
  }
1438
1501
  }
1439
1502
 
@@ -1449,12 +1512,8 @@ $variants: (
1449
1512
  @apply tw-relative tw-box-border tw-w-full tw-h-full tw-flex tw-flex-col;
1450
1513
  }
1451
1514
 
1452
- &__header {
1453
- @apply tw-flex tw-flex-col tw-sticky tw-top-0 tw-bg-[--table-header-bg] tw-z-[1] tw-box-border;
1454
- }
1455
-
1456
1515
  &__header-row {
1457
- @apply tw-flex tw-flex-row;
1516
+ @apply tw-flex tw-flex-row [box-shadow:var(--table-header-border)];
1458
1517
  }
1459
1518
 
1460
1519
  &__header-checkbox {