@masterteam/workspace-builder 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-300:oklch(80.8% .114 19.571);--color-red-700:oklch(50.5% .213 27.518);--spacing:.25rem;--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.static{position:static}.start{inset-inline-start:var(--spacing)}.m-0{margin:calc(var(--spacing) * 0)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.flex{display:flex}.grid{display:grid}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[24rem\]{min-height:24rem}.min-h-full{min-height:100%}.\!w-\[28rem\]{width:28rem!important}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[9rem\]{min-width:9rem}.min-w-\[12rem\]{min-width:12rem}.flex-1{flex:1}.cursor-move{cursor:move}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.content-start{align-content:flex-start}.items-center{align-items:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-red-300{border-color:var(--color-red-300)}.border-surface-200{border-color:var(--p-surface-200)}@supports (color:color-mix(in lab, red, red)){.border-surface-200{border-color:color-mix(in srgb, var(--p-surface-200) calc(100% * 1), transparent)}}.border-surface-300{border-color:var(--p-surface-300)}@supports (color:color-mix(in lab, red, red)){.border-surface-300{border-color:color-mix(in srgb, var(--p-surface-300) calc(100% * 1), transparent)}}.bg-red-50{background-color:var(--color-red-50)}.bg-surface-0{background-color:var(--p-surface-0)}@supports (color:color-mix(in lab, red, red)){.bg-surface-0{background-color:color-mix(in srgb, var(--p-surface-0) calc(100% * 1), transparent)}}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.pt-2{padding-top:calc(var(--spacing) * 2)}.text-center{text-align:center}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-red-700{color:var(--color-red-700)}.text-surface-500{color:var(--p-surface-500)}@supports (color:color-mix(in lab, red, red)){.text-surface-500{color:color-mix(in srgb, var(--p-surface-500) calc(100% * 1), transparent)}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-300:oklch(80.8% .114 19.571);--color-red-700:oklch(50.5% .213 27.518);--spacing:.25rem;--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.static{position:static}.start{inset-inline-start:var(--spacing)}.m-0{margin:calc(var(--spacing) * 0)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.flex{display:flex}.grid{display:grid}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[24rem\]{min-height:24rem}.min-h-full{min-height:100%}.\!w-\[28rem\]{width:28rem!important}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[12rem\]{min-width:12rem}.flex-1{flex:1}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.content-start{align-content:flex-start}.items-center{align-items:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-red-300{border-color:var(--color-red-300)}.border-surface-300{border-color:var(--p-surface-300)}@supports (color:color-mix(in lab, red, red)){.border-surface-300{border-color:color-mix(in srgb, var(--p-surface-300) calc(100% * 1), transparent)}}.bg-red-50{background-color:var(--color-red-50)}.bg-surface-0{background-color:var(--p-surface-0)}@supports (color:color-mix(in lab, red, red)){.bg-surface-0{background-color:color-mix(in srgb, var(--p-surface-0) calc(100% * 1), transparent)}}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2{padding-block:calc(var(--spacing) * 2)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.pt-2{padding-top:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-red-700{color:var(--color-red-700)}.text-surface-500{color:var(--p-surface-500)}@supports (color:color-mix(in lab, red, red)){.text-surface-500{color:color-mix(in srgb, var(--p-surface-500) calc(100% * 1), transparent)}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
@@ -12,7 +12,6 @@ import { ModalService } from '@masterteam/components/modal';
12
12
  import { Page } from '@masterteam/components/page';
13
13
  import { Card } from '@masterteam/components/card';
14
14
  import { TextField } from '@masterteam/components/text-field';
15
- import { ToggleField } from '@masterteam/components/toggle-field';
16
15
  import { ToastService } from '@masterteam/components/toast';
17
16
  import * as i3$1 from 'primeng/contextmenu';
18
17
  import { ContextMenuModule } from 'primeng/contextmenu';
@@ -25,6 +24,7 @@ import { CrudStateBase, handleApiRequest } from '@masterteam/components';
25
24
  import { Button } from '@masterteam/components/button';
26
25
  import * as i2 from 'primeng/inputtext';
27
26
  import { InputTextModule } from 'primeng/inputtext';
27
+ import { Icon } from '@masterteam/icons';
28
28
 
29
29
  class SetWorkspaceBuilderLevelId {
30
30
  levelId;
@@ -698,14 +698,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
698
698
  const DRAG_PAYLOAD_MIME = 'application/x-workspace-builder';
699
699
  class WorkspaceBuilder {
700
700
  levelId = input(null, ...(ngDevMode ? [{ debugName: "levelId" }] : []));
701
+ autoSave = input(false, ...(ngDevMode ? [{ debugName: "autoSave" }] : []));
701
702
  areas = ['main', 'more'];
702
703
  dropScope = 'workspace-builder-item';
703
704
  createGroupArea = signal('main', ...(ngDevMode ? [{ debugName: "createGroupArea" }] : []));
704
705
  editingGroupId = signal(null, ...(ngDevMode ? [{ debugName: "editingGroupId" }] : []));
705
706
  editingGroupTitle = signal('', ...(ngDevMode ? [{ debugName: "editingGroupTitle" }] : []));
706
- autoSaveEnabled = signal(true, ...(ngDevMode ? [{ debugName: "autoSaveEnabled" }] : []));
707
+ isDragging = signal(false, ...(ngDevMode ? [{ debugName: "isDragging" }] : []));
708
+ activeDropSlotKey = signal(null, ...(ngDevMode ? [{ debugName: "activeDropSlotKey" }] : []));
707
709
  expandedGroups = signal({}, ...(ngDevMode ? [{ debugName: "expandedGroups" }] : []));
708
710
  dragPayload = signal(null, ...(ngDevMode ? [{ debugName: "dragPayload" }] : []));
711
+ dragCleanupTimer = null;
709
712
  autoSaveInFlight = false;
710
713
  autoSaveQueued = false;
711
714
  autoSaveQueuedNotifySuccess = false;
@@ -760,6 +763,7 @@ class WorkspaceBuilder {
760
763
  });
761
764
  }
762
765
  ngOnDestroy() {
766
+ this.clearDragCleanupTimer();
763
767
  this.facade.resetState();
764
768
  }
765
769
  areaItems(area) {
@@ -779,6 +783,7 @@ class WorkspaceBuilder {
779
783
  }
780
784
  onModuleDragStart(event, module, source) {
781
785
  this.stopEventPropagation(event);
786
+ this.beginDragSession();
782
787
  const payload = {
783
788
  kind: 'module',
784
789
  source,
@@ -795,6 +800,7 @@ class WorkspaceBuilder {
795
800
  }
796
801
  onGroupDragStart(event, group, area) {
797
802
  this.stopEventPropagation(event);
803
+ this.beginDragSession();
798
804
  const payload = {
799
805
  kind: 'group',
800
806
  source: { type: 'area', area },
@@ -804,19 +810,114 @@ class WorkspaceBuilder {
804
810
  this.setDragTransferData(this.getNativeDragEvent(event), payload, group.id);
805
811
  }
806
812
  onDragEnd() {
807
- // Intentionally keep payload until an explicit drop/cancel path.
808
- // Some browsers/directives emit dragend before drop.
813
+ this.scheduleDragSessionCleanup();
809
814
  }
810
- onDropToArea(event, area, index) {
815
+ onDropToArea(event, area, index, disabled = false) {
816
+ if (disabled) {
817
+ this.stopDropEvent(event);
818
+ return;
819
+ }
811
820
  this.stopDropEvent(event);
812
821
  this.handleDrop({ type: 'area', area }, index, event);
813
822
  }
814
- onDropToGroup(event, area, groupId, index) {
823
+ onDropToGroup(event, area, groupId, index, disabled = false) {
824
+ if (disabled) {
825
+ this.stopDropEvent(event);
826
+ return;
827
+ }
815
828
  this.stopDropEvent(event);
816
829
  this.handleDrop({ type: 'group', area, groupId }, index, event);
817
830
  }
818
831
  allowNativeDrop(event) {
819
832
  event.preventDefault();
833
+ if (event.dataTransfer) {
834
+ event.dataTransfer.dropEffect = 'move';
835
+ }
836
+ }
837
+ onDropSlotDragOver(event, slotKey, disabled = false) {
838
+ this.allowNativeDrop(event);
839
+ if (disabled) {
840
+ if (this.activeDropSlotKey() === slotKey) {
841
+ this.activeDropSlotKey.set(null);
842
+ }
843
+ return;
844
+ }
845
+ if (!this.isDragging()) {
846
+ return;
847
+ }
848
+ if (this.activeDropSlotKey() !== slotKey) {
849
+ this.activeDropSlotKey.set(slotKey);
850
+ }
851
+ }
852
+ onDropSlotDragLeave(event, slotKey) {
853
+ if (this.activeDropSlotKey() !== slotKey) {
854
+ return;
855
+ }
856
+ const currentTarget = event.currentTarget;
857
+ const relatedTarget = event.relatedTarget;
858
+ if (currentTarget &&
859
+ relatedTarget &&
860
+ currentTarget.contains(relatedTarget)) {
861
+ return;
862
+ }
863
+ this.activeDropSlotKey.set(null);
864
+ }
865
+ areaDropSlotKey(area, index) {
866
+ return `area:${area}:${index}`;
867
+ }
868
+ groupDropSlotKey(area, groupId, index) {
869
+ return `group:${area}:${groupId}:${index}`;
870
+ }
871
+ isAreaDropSlotDisabled(area, index) {
872
+ const payload = this.dragPayload();
873
+ if (!payload)
874
+ return false;
875
+ if (payload.kind === 'group') {
876
+ if (payload.source.area !== area)
877
+ return false;
878
+ const list = this.layout()[area];
879
+ const movingIds = new Set(payload.groups.map((group) => group.id));
880
+ const movingIndexes = list
881
+ .map((item, i) => item.type === 'group' && movingIds.has(item.id) ? i : -1)
882
+ .filter((i) => i >= 0);
883
+ if (movingIndexes.length !== 1)
884
+ return false;
885
+ const sourceIndex = movingIndexes[0];
886
+ return index === sourceIndex || index === sourceIndex + 1;
887
+ }
888
+ if (payload.source.type !== 'area' || payload.source.area !== area) {
889
+ return false;
890
+ }
891
+ const list = this.layout()[area];
892
+ const movingIds = new Set(payload.modules.map((module) => module.id));
893
+ const movingIndexes = list
894
+ .map((item, i) => item.type === 'module' && movingIds.has(item.id) ? i : -1)
895
+ .filter((i) => i >= 0);
896
+ if (movingIndexes.length !== 1)
897
+ return false;
898
+ const sourceIndex = movingIndexes[0];
899
+ return index === sourceIndex || index === sourceIndex + 1;
900
+ }
901
+ isGroupDropSlotDisabled(area, groupId, index) {
902
+ const payload = this.dragPayload();
903
+ if (!payload || payload.kind !== 'module')
904
+ return false;
905
+ if (payload.source.type !== 'group')
906
+ return false;
907
+ if (payload.source.area !== area || payload.source.groupId !== groupId) {
908
+ return false;
909
+ }
910
+ const group = this.findGroup(this.layout(), area, groupId);
911
+ if (!group)
912
+ return false;
913
+ const movingIds = new Set(payload.modules.map((module) => module.id));
914
+ const movingIndexes = group.modules
915
+ .map((module, i) => (movingIds.has(module.id) ? i : -1))
916
+ .filter((i) => i >= 0);
917
+ if (movingIndexes.length !== 1)
918
+ return false;
919
+ const sourceIndex = movingIndexes[0];
920
+ return index === sourceIndex || index === sourceIndex + 1;
820
921
  }
821
922
  onNativeAreaDrop(event, area) {
822
923
  this.stopDropEvent(event);
@@ -857,8 +958,6 @@ class WorkspaceBuilder {
857
958
  const order = this.layout()[area].length + 1;
858
959
  this.facade.createGroup(title, area, order).subscribe({
859
960
  next: () => {
860
- // Persist full layout after group creation.
861
- this.triggerAutoSave({ notifyOnSuccess: false });
862
961
  this.ts.success(this.getSuccessMessage(WorkspaceBuilderActionKey.CreateGroup, 'workspace-builder.group-create-success'));
863
962
  },
864
963
  error: () => {
@@ -891,15 +990,7 @@ class WorkspaceBuilder {
891
990
  this.editingGroupTitle.set('');
892
991
  }
893
992
  onSaveClick() {
894
- this.triggerAutoSave({ notifyOnSuccess: true, force: true });
895
- }
896
- onAutoSaveToggleChange(value) {
897
- const isEnabled = value ?? false;
898
- this.autoSaveEnabled.set(isEnabled);
899
- if (!isEnabled) {
900
- this.autoSaveQueued = false;
901
- this.autoSaveQueuedNotifySuccess = false;
902
- }
993
+ this.triggerAutoSave({ notifyOnSuccess: true });
903
994
  }
904
995
  deleteGroup(groupId, event) {
905
996
  if (!event) {
@@ -915,8 +1006,6 @@ class WorkspaceBuilder {
915
1006
  executeDeleteGroup(groupId) {
916
1007
  this.facade.deleteGroup(groupId).subscribe({
917
1008
  next: () => {
918
- // Persist layout after group removal so backend stores the no-group shape.
919
- this.triggerAutoSave({ notifyOnSuccess: false });
920
1009
  this.ts.success(this.getSuccessMessage(WorkspaceBuilderActionKey.DeleteGroup, 'workspace-builder.group-delete-success'));
921
1010
  },
922
1011
  error: () => {
@@ -946,7 +1035,7 @@ class WorkspaceBuilder {
946
1035
  name: module.name,
947
1036
  order: 0,
948
1037
  });
949
- this.patchLayoutAndAutoSave(nextLayout);
1038
+ this.patchLayout(nextLayout);
950
1039
  }
951
1040
  handleDrop(target, targetIndex, event) {
952
1041
  const payload = this.resolveDropPayload(event);
@@ -955,7 +1044,7 @@ class WorkspaceBuilder {
955
1044
  }
956
1045
  if (payload.kind === 'group' && target.type === 'group') {
957
1046
  // Prevent nested groups.
958
- this.dragPayload.set(null);
1047
+ this.endDragSession();
959
1048
  return;
960
1049
  }
961
1050
  const nextLayout = this.cloneLayout(this.layout());
@@ -965,22 +1054,20 @@ class WorkspaceBuilder {
965
1054
  else {
966
1055
  this.moveModules(nextLayout, payload, target, targetIndex);
967
1056
  }
968
- this.patchLayoutAndAutoSave(nextLayout);
969
- this.dragPayload.set(null);
1057
+ this.patchLayout(nextLayout);
1058
+ this.endDragSession();
970
1059
  }
971
- patchLayoutAndAutoSave(layout) {
1060
+ patchLayout(layout) {
972
1061
  this.facade.patchLayout(layout).subscribe({
973
1062
  next: () => {
974
- this.triggerAutoSave({ notifyOnSuccess: true });
1063
+ if (this.autoSave()) {
1064
+ this.triggerAutoSave();
1065
+ }
975
1066
  },
976
1067
  });
977
1068
  }
978
1069
  triggerAutoSave(options) {
979
1070
  const notifyOnSuccess = options?.notifyOnSuccess ?? false;
980
- const shouldAutoSave = options?.force || this.autoSaveEnabled();
981
- if (!shouldAutoSave) {
982
- return;
983
- }
984
1071
  if (this.validationErrors().length > 0) {
985
1072
  return;
986
1073
  }
@@ -1042,9 +1129,37 @@ class WorkspaceBuilder {
1042
1129
  if (!transfer) {
1043
1130
  return;
1044
1131
  }
1132
+ transfer.effectAllowed = 'move';
1045
1133
  transfer.setData(DRAG_PAYLOAD_MIME, JSON.stringify(payload));
1046
1134
  transfer.setData('text/plain', plainTextFallback);
1047
1135
  }
1136
+ beginDragSession() {
1137
+ this.isDragging.set(true);
1138
+ this.activeDropSlotKey.set(null);
1139
+ this.clearDragCleanupTimer();
1140
+ }
1141
+ endDragSession() {
1142
+ this.isDragging.set(false);
1143
+ this.activeDropSlotKey.set(null);
1144
+ this.dragPayload.set(null);
1145
+ this.clearDragCleanupTimer();
1146
+ }
1147
+ scheduleDragSessionCleanup() {
1148
+ this.isDragging.set(false);
1149
+ this.activeDropSlotKey.set(null);
1150
+ this.clearDragCleanupTimer();
1151
+ this.dragCleanupTimer = setTimeout(() => {
1152
+ this.dragPayload.set(null);
1153
+ this.dragCleanupTimer = null;
1154
+ }, 180);
1155
+ }
1156
+ clearDragCleanupTimer() {
1157
+ if (!this.dragCleanupTimer) {
1158
+ return;
1159
+ }
1160
+ clearTimeout(this.dragCleanupTimer);
1161
+ this.dragCleanupTimer = null;
1162
+ }
1048
1163
  stopDropEvent(event) {
1049
1164
  const nativeEvent = this.unwrapEvent(event);
1050
1165
  nativeEvent?.preventDefault?.();
@@ -1284,7 +1399,7 @@ class WorkspaceBuilder {
1284
1399
  return this.transloco.translate(fallbackTranslationKey);
1285
1400
  }
1286
1401
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: WorkspaceBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
1287
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: WorkspaceBuilder, isStandalone: true, selector: "mt-workspace-builder", inputs: { levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: false, transformFunction: null } }, providers: [DialogService], ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <p-contextMenu\r\n #areaContextMenu\r\n [model]=\"areaContextItems()\"\r\n appendTo=\"body\"\r\n />\r\n\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n <div class=\"flex items-center gap-3\">\r\n <mt-toggle-field\r\n class=\"min-w-[9rem]\"\r\n [label]=\"t('auto-save')\"\r\n [ngModel]=\"autoSaveEnabled()\"\r\n size=\"small\"\r\n (ngModelChange)=\"onAutoSaveToggleChange($event)\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"isSavingLayout() || validationErrors().length > 0\"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"grid gap-4\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-300 bg-red-50 p-3 text-red-700\"\r\n >\r\n <div class=\"mb-2 font-semibold\">{{ t(\"validation-title\") }}</div>\r\n <ul class=\"m-0 list-disc ps-4\">\r\n @for (error of validationErrors(); track error) {\r\n <li>{{ error }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <div class=\"workspace-areas-grid grid gap-4\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [paddingless]=\"true\"\r\n class=\"min-h-[24rem] overflow-hidden border border-surface-300\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <header class=\"border-b border-surface-200 px-4 py-3 font-semibold\">\r\n {{ t(area) }}\r\n </header>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 p-3\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, areaItems(area).length)\"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n ></div>\r\n\r\n @for (\r\n item of areaItems(area);\r\n track trackItem(item);\r\n let i = $index\r\n ) {\r\n @if (item.type === \"module\") {\r\n <div\r\n class=\"flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, item, {\r\n type: 'area',\r\n area: area,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <mt-button\r\n class=\"drag-handle\"\r\n styleClass=\"drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.name }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"grid gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.group-drag-handle'\"\r\n (onDragStart)=\"onGroupDragStart($event, item, area)\"\r\n (onDragEnd)=\"onDragEnd()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeGroupDrop($event, area, item.id)\"\r\n >\r\n <div\r\n class=\"group-header flex items-center gap-2 rounded-md px-1 py-0.5\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <mt-button\r\n class=\"expand-btn\"\r\n [icon]=\"\r\n isGroupExpanded(item.id)\r\n ? 'arrow.chevron-up'\r\n : 'arrow.chevron-down'\r\n \"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <mt-button\r\n class=\"group-drag-handle\"\r\n styleClass=\"group-drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n\r\n @if (editingGroupId() === item.id) {\r\n <mt-text-field\r\n [(ngModel)]=\"editingGroupTitle\"\r\n class=\"min-w-[12rem] flex-1\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n [text]=\"true\"\r\n severity=\"success\"\r\n size=\"small\"\r\n (onClick)=\"saveRenameGroup(item.id)\"\r\n />\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"cancelRenameGroup()\"\r\n />\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n item.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n [text]=\"true\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n (onClick)=\"deleteGroup(item.id, $event)\"\r\n />\r\n </div>\r\n\r\n @if (isGroupExpanded(item.id)) {\r\n <div\r\n class=\"group-modules grid gap-2 border-t border-dashed border-surface-300 pt-2\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToGroup($event, area, item.id, 0)\"\r\n ></div>\r\n\r\n @for (\r\n module of item.modules;\r\n track module.id;\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2 ms-2\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop($event, area, item.id, j)\r\n \"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, module, {\r\n type: 'group',\r\n area: area,\r\n groupId: item.id,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <mt-button\r\n class=\"drag-handle\"\r\n styleClass=\"drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n [text]=\"true\"\r\n severity=\"warn\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(area, item.id, module.id)\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup($event, area, item.id, j + 1)\r\n \"\r\n ></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, i + 1)\"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area rounded-lg border border-dashed border-surface-300 p-4 text-center text-surface-500\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n >\r\n {{ t(\"empty-area\") }}\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n", styles: [".workspace-areas-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}@media(max-width:960px){.workspace-areas-grid{grid-template-columns:minmax(0,1fr)}}.drop-slot{height:.5rem;border:1px dashed transparent;border-radius:9999px;background:transparent;transition:all .15s ease}.workspace-area-body.p-droppable-enter{background:var(--p-primary-50, #eff6ff)}.empty-area.p-droppable-enter,.drop-slot.p-droppable-enter{border-color:var(--p-primary-400, #60a5fa);background:var(--p-primary-50, #eff6ff)}.group-header.p-droppable-enter,.group-modules.p-droppable-enter{background:var(--p-primary-50, #eff6ff)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2$1.Draggable, selector: "[pDraggable]", inputs: ["pDraggable", "dragEffect", "dragHandle", "pDraggableDisabled"], outputs: ["onDragStart", "onDragEnd", "onDrag"] }, { kind: "directive", type: i2$1.Droppable, selector: "[pDroppable]", inputs: ["pDroppable", "pDroppableDisabled", "dropEffect"], outputs: ["onDragEnter", "onDragLeave", "onDrop"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Page, selector: "mt-page", inputs: ["backButton", "backButtonIcon", "avatarIcon", "avatarStyle", "avatarShape", "title", "tabs", "activeTab", "contentClass", "contentId"], outputs: ["backButtonClick", "tabChange"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "ngmodule", type: ContextMenuModule }, { kind: "component", type: i3$1.ContextMenu, selector: "p-contextMenu, p-contextmenu, p-context-menu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "autoZIndex", "baseZIndex", "id", "breakpoint", "ariaLabel", "ariaLabelledBy", "pressDelay", "appendTo", "motionOptions"], outputs: ["onShow", "onHide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1402
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: WorkspaceBuilder, isStandalone: true, selector: "mt-workspace-builder", inputs: { levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: false, transformFunction: null }, autoSave: { classPropertyName: "autoSave", publicName: "autoSave", isSignal: true, isRequired: false, transformFunction: null } }, providers: [DialogService], ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <p-contextMenu\r\n #areaContextMenu\r\n [model]=\"areaContextItems()\"\r\n appendTo=\"body\"\r\n />\r\n\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\n <ng-template #headerEnd>\n @if (!autoSave()) {\n <div class=\"flex items-center\">\n <mt-button\n [label]=\"t('save')\"\n icon=\"general.save-02\"\n severity=\"primary\"\n variant=\"outlined\"\n size=\"small\"\n [loading]=\"isSavingLayout()\"\n [disabled]=\"isSavingLayout() || validationErrors().length > 0\"\n (onClick)=\"onSaveClick()\"\n />\n </div>\n }\n </ng-template>\n\r\n <div class=\"grid gap-4\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-300 bg-red-50 p-3 text-red-700\"\r\n >\r\n <div class=\"mb-2 font-semibold\">{{ t(\"validation-title\") }}</div>\r\n <ul class=\"m-0 list-disc ps-4\">\r\n @for (error of validationErrors(); track error) {\r\n <li>{{ error }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <div class=\"workspace-areas-grid grid gap-4\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[24rem] overflow-hidden\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <ng-template #cardEnd>\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"openCreateGroupDialog(area)\"\r\n />\r\n </ng-template>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 p-3\"\r\n [class.drag-active]=\"isDragging()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, areaItems(area).length)\"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"isAreaDropSlotDisabled(area, 0)\"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, 0),\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, 0))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea($event, area, 0, isAreaDropSlotDisabled(area, 0))\r\n \"\r\n ></div>\r\n\r\n @for (\r\n item of areaItems(area);\r\n track trackItem(item);\r\n let i = $index\r\n ) {\r\n @if (item.type === \"module\") {\r\n <div\r\n class=\"workspace-draggable-item flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, item, {\r\n type: 'area',\r\n area: area,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <span class=\"drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.name }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.group-drag-handle'\"\r\n (onDragStart)=\"onGroupDragStart($event, item, area)\"\r\n (onDragEnd)=\"onDragEnd()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeGroupDrop($event, area, item.id)\"\r\n >\r\n <div\r\n class=\"group-header flex items-center gap-2 rounded-md px-1 py-0.5\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <mt-button\r\n class=\"expand-btn\"\r\n [icon]=\"\r\n isGroupExpanded(item.id)\r\n ? 'arrow.chevron-up'\r\n : 'arrow.chevron-down'\r\n \"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span class=\"group-drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n\r\n @if (editingGroupId() === item.id) {\r\n <mt-text-field\r\n [(ngModel)]=\"editingGroupTitle\"\r\n class=\"min-w-[12rem] flex-1\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n severity=\"success\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"saveRenameGroup(item.id)\"\r\n />\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"cancelRenameGroup()\"\r\n />\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n item.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n severity=\"danger\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"deleteGroup(item.id, $event)\"\r\n />\r\n </div>\r\n\r\n @if (isGroupExpanded(item.id)) {\r\n <div\r\n class=\"group-modules grid gap-2 border-t border-dashed border-surface-300 pt-2\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0),\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n 0,\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n ></div>\r\n\r\n @for (\r\n module of item.modules;\r\n track module.id;\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"workspace-draggable-item workspace-group-module-item flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2 ms-2\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop($event, area, item.id, j)\r\n \"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, module, {\r\n type: 'group',\r\n area: area,\r\n groupId: item.id,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <span class=\"drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"warn\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(area, item.id, module.id)\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, j + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1),\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n j + 1,\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, i + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isAreaDropSlotDisabled(area, i + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, i + 1),\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, i + 1))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n i + 1,\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area rounded-lg border border-dashed border-surface-300 p-4 text-center text-surface-500\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n >\r\n {{ t(\"empty-area\") }}\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n", styles: [".workspace-areas-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.workspace-area-body{transition:background-color .18s ease,box-shadow .18s ease}.workspace-area-body.drag-active{cursor:grabbing}.workspace-draggable-item,.workspace-group-card{transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease,background-color .16s ease}.workspace-draggable-item:hover,.workspace-group-card:hover{border-color:var(--p-surface-400);box-shadow:0 4px 12px color-mix(in srgb,var(--p-text-color) 8%,transparent)}.workspace-draggable-item.p-draggable-dragging,.workspace-group-card.p-draggable-dragging{transform:scale(.985);box-shadow:0 10px 24px color-mix(in srgb,var(--p-text-color) 14%,transparent)}.drag-handle,.group-drag-handle{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border-radius:.5rem;border:1px solid var(--p-surface-300);background:var(--p-surface-0);color:var(--p-surface-600);cursor:grab;user-select:none;-webkit-user-select:none;touch-action:none;transition:transform .15s ease,border-color .15s ease,background-color .15s ease,color .15s ease}.drag-handle:hover,.group-drag-handle:hover{border-color:var(--p-primary-300);background:var(--p-primary-50);color:var(--p-primary-700)}.drag-handle:active,.group-drag-handle:active,.workspace-area-body.drag-active .drag-handle,.workspace-area-body.drag-active .group-drag-handle{cursor:grabbing}.drag-handle:active,.group-drag-handle:active{transform:scale(.96)}@media(max-width:960px){.workspace-areas-grid{grid-template-columns:minmax(0,1fr)}}.drop-slot{width:100%;height:.4rem;border:1px solid transparent;border-radius:.5rem;background:transparent;opacity:0;transition:height .15s ease,border-color .15s ease,background-color .15s ease,box-shadow .15s ease,transform .15s ease,opacity .15s ease}.workspace-area-body.drag-active .drop-slot{height:.65rem;border-color:var(--p-surface-300);background:color-mix(in srgb,var(--p-surface-100) 55%,transparent);opacity:.28;transform:scaleX(.98)}.workspace-area-body.drag-active .drop-slot.drop-slot-disabled{opacity:0;height:.4rem;pointer-events:none}.empty-area.p-droppable-enter{border-color:var(--p-primary-400);background:var(--p-primary-50)}.drop-slot.p-droppable-enter,.workspace-area-body.drag-active .drop-slot:hover,.workspace-area-body.drag-active .drop-slot.drop-slot-active{height:2.5rem;border-width:1px;border-color:color-mix(in srgb,var(--p-primary-500) 55%,var(--p-surface-300));background:color-mix(in srgb,var(--p-primary-50) 45%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--p-primary-300) 22%,transparent);opacity:1;transform:scaleX(1.01)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2$1.Draggable, selector: "[pDraggable]", inputs: ["pDraggable", "dragEffect", "dragHandle", "pDraggableDisabled"], outputs: ["onDragStart", "onDragEnd", "onDrag"] }, { kind: "directive", type: i2$1.Droppable, selector: "[pDroppable]", inputs: ["pDroppable", "pDroppableDisabled", "dropEffect"], outputs: ["onDragEnter", "onDragLeave", "onDrop"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Page, selector: "mt-page", inputs: ["backButton", "backButtonIcon", "avatarIcon", "avatarStyle", "avatarShape", "title", "tabs", "activeTab", "contentClass", "contentId"], outputs: ["backButtonClick", "tabChange"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "ngmodule", type: ContextMenuModule }, { kind: "component", type: i3$1.ContextMenu, selector: "p-contextMenu, p-contextmenu, p-context-menu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "autoZIndex", "baseZIndex", "id", "breakpoint", "ariaLabel", "ariaLabelledBy", "pressDelay", "appendTo", "motionOptions"], outputs: ["onShow", "onHide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1288
1403
  }
1289
1404
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: WorkspaceBuilder, decorators: [{
1290
1405
  type: Component,
@@ -1294,13 +1409,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
1294
1409
  TranslocoDirective,
1295
1410
  DragDropModule,
1296
1411
  Button,
1412
+ Icon,
1297
1413
  Page,
1298
1414
  Card,
1299
1415
  TextField,
1300
- ToggleField,
1301
1416
  ContextMenuModule,
1302
- ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [DialogService], template: "<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <p-contextMenu\r\n #areaContextMenu\r\n [model]=\"areaContextItems()\"\r\n appendTo=\"body\"\r\n />\r\n\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n <div class=\"flex items-center gap-3\">\r\n <mt-toggle-field\r\n class=\"min-w-[9rem]\"\r\n [label]=\"t('auto-save')\"\r\n [ngModel]=\"autoSaveEnabled()\"\r\n size=\"small\"\r\n (ngModelChange)=\"onAutoSaveToggleChange($event)\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"isSavingLayout() || validationErrors().length > 0\"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"grid gap-4\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-300 bg-red-50 p-3 text-red-700\"\r\n >\r\n <div class=\"mb-2 font-semibold\">{{ t(\"validation-title\") }}</div>\r\n <ul class=\"m-0 list-disc ps-4\">\r\n @for (error of validationErrors(); track error) {\r\n <li>{{ error }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <div class=\"workspace-areas-grid grid gap-4\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [paddingless]=\"true\"\r\n class=\"min-h-[24rem] overflow-hidden border border-surface-300\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <header class=\"border-b border-surface-200 px-4 py-3 font-semibold\">\r\n {{ t(area) }}\r\n </header>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 p-3\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, areaItems(area).length)\"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n ></div>\r\n\r\n @for (\r\n item of areaItems(area);\r\n track trackItem(item);\r\n let i = $index\r\n ) {\r\n @if (item.type === \"module\") {\r\n <div\r\n class=\"flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, item, {\r\n type: 'area',\r\n area: area,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <mt-button\r\n class=\"drag-handle\"\r\n styleClass=\"drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.name }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"grid gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.group-drag-handle'\"\r\n (onDragStart)=\"onGroupDragStart($event, item, area)\"\r\n (onDragEnd)=\"onDragEnd()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeGroupDrop($event, area, item.id)\"\r\n >\r\n <div\r\n class=\"group-header flex items-center gap-2 rounded-md px-1 py-0.5\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <mt-button\r\n class=\"expand-btn\"\r\n [icon]=\"\r\n isGroupExpanded(item.id)\r\n ? 'arrow.chevron-up'\r\n : 'arrow.chevron-down'\r\n \"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <mt-button\r\n class=\"group-drag-handle\"\r\n styleClass=\"group-drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n\r\n @if (editingGroupId() === item.id) {\r\n <mt-text-field\r\n [(ngModel)]=\"editingGroupTitle\"\r\n class=\"min-w-[12rem] flex-1\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n [text]=\"true\"\r\n severity=\"success\"\r\n size=\"small\"\r\n (onClick)=\"saveRenameGroup(item.id)\"\r\n />\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"cancelRenameGroup()\"\r\n />\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n item.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n [text]=\"true\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n (onClick)=\"deleteGroup(item.id, $event)\"\r\n />\r\n </div>\r\n\r\n @if (isGroupExpanded(item.id)) {\r\n <div\r\n class=\"group-modules grid gap-2 border-t border-dashed border-surface-300 pt-2\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToGroup($event, area, item.id, 0)\"\r\n ></div>\r\n\r\n @for (\r\n module of item.modules;\r\n track module.id;\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2 ms-2\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop($event, area, item.id, j)\r\n \"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, module, {\r\n type: 'group',\r\n area: area,\r\n groupId: item.id,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <mt-button\r\n class=\"drag-handle\"\r\n styleClass=\"drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n [text]=\"true\"\r\n severity=\"warn\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(area, item.id, module.id)\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup($event, area, item.id, j + 1)\r\n \"\r\n ></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, i + 1)\"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area rounded-lg border border-dashed border-surface-300 p-4 text-center text-surface-500\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n >\r\n {{ t(\"empty-area\") }}\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n", styles: [".workspace-areas-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}@media(max-width:960px){.workspace-areas-grid{grid-template-columns:minmax(0,1fr)}}.drop-slot{height:.5rem;border:1px dashed transparent;border-radius:9999px;background:transparent;transition:all .15s ease}.workspace-area-body.p-droppable-enter{background:var(--p-primary-50, #eff6ff)}.empty-area.p-droppable-enter,.drop-slot.p-droppable-enter{border-color:var(--p-primary-400, #60a5fa);background:var(--p-primary-50, #eff6ff)}.group-header.p-droppable-enter,.group-modules.p-droppable-enter{background:var(--p-primary-50, #eff6ff)}\n"] }]
1303
- }], ctorParameters: () => [], propDecorators: { levelId: [{ type: i0.Input, args: [{ isSignal: true, alias: "levelId", required: false }] }] } });
1417
+ ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [DialogService], template: "<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <p-contextMenu\r\n #areaContextMenu\r\n [model]=\"areaContextItems()\"\r\n appendTo=\"body\"\r\n />\r\n\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\n <ng-template #headerEnd>\n @if (!autoSave()) {\n <div class=\"flex items-center\">\n <mt-button\n [label]=\"t('save')\"\n icon=\"general.save-02\"\n severity=\"primary\"\n variant=\"outlined\"\n size=\"small\"\n [loading]=\"isSavingLayout()\"\n [disabled]=\"isSavingLayout() || validationErrors().length > 0\"\n (onClick)=\"onSaveClick()\"\n />\n </div>\n }\n </ng-template>\n\r\n <div class=\"grid gap-4\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-300 bg-red-50 p-3 text-red-700\"\r\n >\r\n <div class=\"mb-2 font-semibold\">{{ t(\"validation-title\") }}</div>\r\n <ul class=\"m-0 list-disc ps-4\">\r\n @for (error of validationErrors(); track error) {\r\n <li>{{ error }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <div class=\"workspace-areas-grid grid gap-4\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[24rem] overflow-hidden\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <ng-template #cardEnd>\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"openCreateGroupDialog(area)\"\r\n />\r\n </ng-template>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 p-3\"\r\n [class.drag-active]=\"isDragging()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, areaItems(area).length)\"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"isAreaDropSlotDisabled(area, 0)\"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, 0),\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, 0))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea($event, area, 0, isAreaDropSlotDisabled(area, 0))\r\n \"\r\n ></div>\r\n\r\n @for (\r\n item of areaItems(area);\r\n track trackItem(item);\r\n let i = $index\r\n ) {\r\n @if (item.type === \"module\") {\r\n <div\r\n class=\"workspace-draggable-item flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, item, {\r\n type: 'area',\r\n area: area,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <span class=\"drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.name }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.group-drag-handle'\"\r\n (onDragStart)=\"onGroupDragStart($event, item, area)\"\r\n (onDragEnd)=\"onDragEnd()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeGroupDrop($event, area, item.id)\"\r\n >\r\n <div\r\n class=\"group-header flex items-center gap-2 rounded-md px-1 py-0.5\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <mt-button\r\n class=\"expand-btn\"\r\n [icon]=\"\r\n isGroupExpanded(item.id)\r\n ? 'arrow.chevron-up'\r\n : 'arrow.chevron-down'\r\n \"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span class=\"group-drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n\r\n @if (editingGroupId() === item.id) {\r\n <mt-text-field\r\n [(ngModel)]=\"editingGroupTitle\"\r\n class=\"min-w-[12rem] flex-1\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n severity=\"success\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"saveRenameGroup(item.id)\"\r\n />\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"cancelRenameGroup()\"\r\n />\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n item.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n severity=\"danger\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"deleteGroup(item.id, $event)\"\r\n />\r\n </div>\r\n\r\n @if (isGroupExpanded(item.id)) {\r\n <div\r\n class=\"group-modules grid gap-2 border-t border-dashed border-surface-300 pt-2\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0),\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n 0,\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n ></div>\r\n\r\n @for (\r\n module of item.modules;\r\n track module.id;\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"workspace-draggable-item workspace-group-module-item flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2 ms-2\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop($event, area, item.id, j)\r\n \"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, module, {\r\n type: 'group',\r\n area: area,\r\n groupId: item.id,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <span class=\"drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"warn\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(area, item.id, module.id)\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, j + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1),\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n j + 1,\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, i + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isAreaDropSlotDisabled(area, i + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, i + 1),\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, i + 1))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n i + 1,\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area rounded-lg border border-dashed border-surface-300 p-4 text-center text-surface-500\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n >\r\n {{ t(\"empty-area\") }}\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n", styles: [".workspace-areas-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.workspace-area-body{transition:background-color .18s ease,box-shadow .18s ease}.workspace-area-body.drag-active{cursor:grabbing}.workspace-draggable-item,.workspace-group-card{transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease,background-color .16s ease}.workspace-draggable-item:hover,.workspace-group-card:hover{border-color:var(--p-surface-400);box-shadow:0 4px 12px color-mix(in srgb,var(--p-text-color) 8%,transparent)}.workspace-draggable-item.p-draggable-dragging,.workspace-group-card.p-draggable-dragging{transform:scale(.985);box-shadow:0 10px 24px color-mix(in srgb,var(--p-text-color) 14%,transparent)}.drag-handle,.group-drag-handle{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border-radius:.5rem;border:1px solid var(--p-surface-300);background:var(--p-surface-0);color:var(--p-surface-600);cursor:grab;user-select:none;-webkit-user-select:none;touch-action:none;transition:transform .15s ease,border-color .15s ease,background-color .15s ease,color .15s ease}.drag-handle:hover,.group-drag-handle:hover{border-color:var(--p-primary-300);background:var(--p-primary-50);color:var(--p-primary-700)}.drag-handle:active,.group-drag-handle:active,.workspace-area-body.drag-active .drag-handle,.workspace-area-body.drag-active .group-drag-handle{cursor:grabbing}.drag-handle:active,.group-drag-handle:active{transform:scale(.96)}@media(max-width:960px){.workspace-areas-grid{grid-template-columns:minmax(0,1fr)}}.drop-slot{width:100%;height:.4rem;border:1px solid transparent;border-radius:.5rem;background:transparent;opacity:0;transition:height .15s ease,border-color .15s ease,background-color .15s ease,box-shadow .15s ease,transform .15s ease,opacity .15s ease}.workspace-area-body.drag-active .drop-slot{height:.65rem;border-color:var(--p-surface-300);background:color-mix(in srgb,var(--p-surface-100) 55%,transparent);opacity:.28;transform:scaleX(.98)}.workspace-area-body.drag-active .drop-slot.drop-slot-disabled{opacity:0;height:.4rem;pointer-events:none}.empty-area.p-droppable-enter{border-color:var(--p-primary-400);background:var(--p-primary-50)}.drop-slot.p-droppable-enter,.workspace-area-body.drag-active .drop-slot:hover,.workspace-area-body.drag-active .drop-slot.drop-slot-active{height:2.5rem;border-width:1px;border-color:color-mix(in srgb,var(--p-primary-500) 55%,var(--p-surface-300));background:color-mix(in srgb,var(--p-primary-50) 45%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--p-primary-300) 22%,transparent);opacity:1;transform:scaleX(1.01)}\n"] }]
1418
+ }], ctorParameters: () => [], propDecorators: { levelId: [{ type: i0.Input, args: [{ isSignal: true, alias: "levelId", required: false }] }], autoSave: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoSave", required: false }] }] } });
1304
1419
 
1305
1420
  /**
1306
1421
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-workspace-builder.mjs","sources":["../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.actions.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.model.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.state.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.facade.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/create-group-dialog/workspace-builder-create-group-dialog.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/create-group-dialog/workspace-builder-create-group-dialog.html","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/workspace-builder.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/workspace-builder.html","../../../../packages/masterteam/workspace-builder/src/masterteam-workspace-builder.ts"],"sourcesContent":["import {\r\n WorkspaceArea,\r\n WorkspaceBuilderLayoutDto,\r\n} from './workspace-builder.model';\r\n\r\nexport class SetWorkspaceBuilderLevelId {\r\n static readonly type = '[WorkspaceBuilder] Set Level ID';\r\n constructor(public levelId: number) {}\r\n}\r\n\r\nexport class GetWorkspaceBuilderLayout {\r\n static readonly type = '[WorkspaceBuilder] Get Layout';\r\n}\r\n\r\nexport class PatchWorkspaceBuilderLayoutLocally {\r\n static readonly type = '[WorkspaceBuilder] Patch Layout Locally';\r\n constructor(public layout: WorkspaceBuilderLayoutDto) {}\r\n}\r\n\r\nexport class SaveWorkspaceBuilderLayout {\r\n static readonly type = '[WorkspaceBuilder] Save Layout';\r\n}\r\n\r\nexport class CreateWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Create Group';\r\n constructor(\r\n public title: string,\r\n public area: WorkspaceArea = 'main',\r\n public order?: number,\r\n ) {}\r\n}\r\n\r\nexport class RenameWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Rename Group';\r\n constructor(\r\n public groupId: string,\r\n public title: string,\r\n ) {}\r\n}\r\n\r\nexport class DeleteWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Delete Group';\r\n constructor(public groupId: string) {}\r\n}\r\n\r\nexport class ResetWorkspaceBuilderState {\r\n static readonly type = '[WorkspaceBuilder] Reset State';\r\n}\r\n","import { LoadingStateShape } from '../utils/state-helpers';\r\n\r\nexport type WorkspaceArea = 'main' | 'more';\r\nexport type WorkspaceItemType = 'module' | 'group';\r\n\r\nexport interface WorkspaceModuleItem {\r\n type: 'module';\r\n id: string;\r\n name: string;\r\n order: number;\r\n}\r\n\r\nexport interface WorkspaceGroupModuleItem {\r\n id: string;\r\n name: string;\r\n order: number;\r\n}\r\n\r\nexport interface WorkspaceGroupItem {\r\n type: 'group';\r\n id: string;\r\n name: string;\r\n order: number;\r\n modules: WorkspaceGroupModuleItem[];\r\n}\r\n\r\nexport type WorkspaceItem = WorkspaceModuleItem | WorkspaceGroupItem;\r\n\r\nexport interface WorkspaceBuilderLayoutDto {\r\n levelId: number;\r\n main: WorkspaceItem[];\r\n more: WorkspaceItem[];\r\n}\r\n\r\nexport interface SaveWorkspaceModuleItemDto {\r\n id: string;\r\n order: number;\r\n}\r\n\r\nexport interface SaveWorkspaceItemDto {\r\n type: WorkspaceItemType;\r\n id: string;\r\n order: number;\r\n modules?: SaveWorkspaceModuleItemDto[];\r\n}\r\n\r\nexport interface SaveWorkspaceLayoutDto {\r\n main: SaveWorkspaceItemDto[];\r\n more: SaveWorkspaceItemDto[];\r\n}\r\n\r\nexport interface CreateWorkspaceGroupDto {\r\n title: string;\r\n area: WorkspaceArea;\r\n order: number;\r\n}\r\n\r\nexport interface CreateWorkspaceGroupResponseDto {\r\n groupId: string;\r\n}\r\n\r\nexport interface UpdateWorkspaceGroupDto {\r\n title?: string;\r\n area?: WorkspaceArea;\r\n order?: number;\r\n}\r\n\r\nexport enum WorkspaceBuilderActionKey {\r\n GetLayout = 'getLayout',\r\n SaveLayout = 'saveLayout',\r\n CreateGroup = 'createGroup',\r\n UpdateGroup = 'updateGroup',\r\n DeleteGroup = 'deleteGroup',\r\n}\r\n\r\nexport interface WorkspaceBuilderStateModel extends LoadingStateShape<WorkspaceBuilderActionKey> {\r\n levelId: number | null;\r\n layout: WorkspaceBuilderLayoutDto;\r\n originalLayout: SaveWorkspaceLayoutDto | null;\r\n validationErrors: string[];\r\n isDirty: boolean;\r\n successMessages: Partial<Record<WorkspaceBuilderActionKey, string>>;\r\n}\r\n","import { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport {\r\n CreateWorkspaceBuilderGroup,\r\n DeleteWorkspaceBuilderGroup,\r\n GetWorkspaceBuilderLayout,\r\n PatchWorkspaceBuilderLayoutLocally,\r\n RenameWorkspaceBuilderGroup,\r\n ResetWorkspaceBuilderState,\r\n SaveWorkspaceBuilderLayout,\r\n SetWorkspaceBuilderLevelId,\r\n} from './workspace-builder.actions';\r\nimport {\r\n CreateWorkspaceGroupResponseDto,\r\n SaveWorkspaceLayoutDto,\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n WorkspaceBuilderStateModel,\r\n WorkspaceGroupItem,\r\n WorkspaceGroupModuleItem,\r\n WorkspaceItem,\r\n WorkspaceModuleItem,\r\n} from './workspace-builder.model';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Response } from './api.model';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\n\r\nconst AREAS: WorkspaceArea[] = ['main', 'more'];\r\n\r\nfunction normalizeName(value: unknown): string {\r\n if (typeof value === 'string') {\r\n return value;\r\n }\r\n\r\n if (value && typeof value === 'object') {\r\n const localized = value as Record<string, unknown>;\r\n const display = localized['display'];\r\n if (typeof display === 'string' && display.trim().length > 0) {\r\n return display;\r\n }\r\n\r\n const en = localized['en'];\r\n if (typeof en === 'string' && en.trim().length > 0) {\r\n return en;\r\n }\r\n\r\n const ar = localized['ar'];\r\n if (typeof ar === 'string' && ar.trim().length > 0) {\r\n return ar;\r\n }\r\n }\r\n\r\n return '';\r\n}\r\n\r\nfunction createEmptyLayout(levelId = 0): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId,\r\n main: [],\r\n more: [],\r\n };\r\n}\r\n\r\nfunction cloneLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId: layout.levelId,\r\n main: layout.main.map(cloneItem),\r\n more: layout.more.map(cloneItem),\r\n };\r\n}\r\n\r\nfunction cloneItem(item: WorkspaceItem): WorkspaceItem {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n modules: item.modules.map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n };\r\n}\r\n\r\nfunction normalizeGroupModules(modules: any[]): WorkspaceGroupModuleItem[] {\r\n if (!Array.isArray(modules)) {\r\n return [];\r\n }\r\n\r\n return modules.map((module, index) => ({\r\n id: String(module?.id ?? ''),\r\n name: normalizeName(module?.name),\r\n order: index + 1,\r\n }));\r\n}\r\n\r\nfunction normalizeAreaItems(items: any[]): WorkspaceItem[] {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n\r\n return items.map((item, index) => {\r\n if (item?.type === 'group') {\r\n const group: WorkspaceGroupItem = {\r\n type: 'group',\r\n id: String(item?.id ?? ''),\r\n name: normalizeName(item?.name),\r\n order: index + 1,\r\n modules: normalizeGroupModules(item?.modules ?? []),\r\n };\r\n\r\n return group;\r\n }\r\n\r\n const moduleItem: WorkspaceModuleItem = {\r\n type: 'module',\r\n id: String(item?.id ?? ''),\r\n name: normalizeName(item?.name),\r\n order: index + 1,\r\n };\r\n\r\n return moduleItem;\r\n });\r\n}\r\n\r\nfunction normalizeLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): WorkspaceBuilderLayoutDto {\r\n const normalized: WorkspaceBuilderLayoutDto = {\r\n levelId: layout?.levelId ?? 0,\r\n main: normalizeAreaItems(layout?.main ?? []),\r\n more: normalizeAreaItems(layout?.more ?? []),\r\n };\r\n\r\n return normalized;\r\n}\r\n\r\nfunction toSaveLayoutDto(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): SaveWorkspaceLayoutDto {\r\n return {\r\n main: layout.main.map((item, index) => {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n order: index + 1,\r\n modules: item.modules.map((module, moduleIndex) => ({\r\n id: module.id,\r\n order: moduleIndex + 1,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n order: index + 1,\r\n };\r\n }),\r\n more: layout.more.map((item, index) => {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n order: index + 1,\r\n modules: item.modules.map((module, moduleIndex) => ({\r\n id: module.id,\r\n order: moduleIndex + 1,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n order: index + 1,\r\n };\r\n }),\r\n };\r\n}\r\n\r\nfunction hasDuplicate(values: string[]): boolean {\r\n return new Set(values).size !== values.length;\r\n}\r\n\r\nfunction validateLayout(layout: WorkspaceBuilderLayoutDto): string[] {\r\n const errors: string[] = [];\r\n\r\n const moduleIds: string[] = [];\r\n const groupIds: string[] = [];\r\n\r\n for (const area of AREAS) {\r\n const items = layout[area];\r\n const orders = items.map((item) => item.order);\r\n\r\n if (hasDuplicate(orders.map(String))) {\r\n errors.push(`Duplicate order detected in ${area} list.`);\r\n }\r\n\r\n items.forEach((item) => {\r\n if (item.type === 'group') {\r\n groupIds.push(item.id);\r\n\r\n const groupOrders = item.modules.map((module) => module.order);\r\n if (hasDuplicate(groupOrders.map(String))) {\r\n errors.push(`Duplicate order detected in group ${item.id}.`);\r\n }\r\n\r\n item.modules.forEach((module) => {\r\n const typedModule: any = module as any;\r\n if (\r\n typedModule?.type === 'group' ||\r\n Array.isArray(typedModule?.modules)\r\n ) {\r\n errors.push(`Nested groups are not supported (group ${item.id}).`);\r\n }\r\n\r\n moduleIds.push(module.id);\r\n });\r\n } else {\r\n moduleIds.push(item.id);\r\n }\r\n });\r\n }\r\n\r\n if (hasDuplicate(moduleIds)) {\r\n errors.push('Duplicate module IDs detected across main, more, and groups.');\r\n }\r\n\r\n if (hasDuplicate(groupIds)) {\r\n errors.push('Duplicate group IDs detected in layout.');\r\n }\r\n\r\n return Array.from(new Set(errors));\r\n}\r\n\r\nfunction computeIsDirty(\r\n layout: WorkspaceBuilderLayoutDto,\r\n originalLayout: SaveWorkspaceLayoutDto | null,\r\n): boolean {\r\n if (!originalLayout) {\r\n return true;\r\n }\r\n\r\n return (\r\n JSON.stringify(toSaveLayoutDto(layout)) !== JSON.stringify(originalLayout)\r\n );\r\n}\r\n\r\nfunction insertGroupIntoLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n title: string,\r\n area: WorkspaceArea,\r\n order?: number,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n const list = next[area];\r\n const insertIndex = Math.max(\r\n 0,\r\n Math.min((order ?? list.length + 1) - 1, list.length),\r\n );\r\n\r\n const group: WorkspaceGroupItem = {\r\n type: 'group',\r\n id: groupId,\r\n name: title,\r\n order: 0,\r\n modules: [],\r\n };\r\n\r\n list.splice(insertIndex, 0, group);\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nfunction renameGroupInLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n title: string,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n\r\n for (const area of AREAS) {\r\n const group = next[area].find(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (group) {\r\n group.name = title;\r\n break;\r\n }\r\n }\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nfunction removeGroupAndPromoteModules(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n\r\n for (const area of AREAS) {\r\n const index = next[area].findIndex(\r\n (item) => item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (index === -1) {\r\n continue;\r\n }\r\n\r\n const group = next[area][index] as WorkspaceGroupItem;\r\n const promotedModules: WorkspaceModuleItem[] = group.modules.map(\r\n (module) => ({\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n }),\r\n );\r\n\r\n next[area].splice(index, 1, ...promotedModules);\r\n break;\r\n }\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nconst DEFAULTS: WorkspaceBuilderStateModel = {\r\n levelId: null,\r\n layout: createEmptyLayout(),\r\n originalLayout: null,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {},\r\n loadingActive: [],\r\n errors: {},\r\n};\r\n\r\n@State<WorkspaceBuilderStateModel>({\r\n name: 'workspaceBuilder',\r\n defaults: DEFAULTS,\r\n})\r\n@Injectable()\r\nexport class WorkspaceBuilderState extends CrudStateBase<\r\n WorkspaceItem,\r\n WorkspaceBuilderStateModel,\r\n WorkspaceBuilderActionKey\r\n> {\r\n private http = inject(HttpClient);\r\n\r\n @Selector()\r\n static getLevelId(state: WorkspaceBuilderStateModel): number | null {\r\n return state.levelId;\r\n }\r\n\r\n @Selector()\r\n static getLayout(\r\n state: WorkspaceBuilderStateModel,\r\n ): WorkspaceBuilderLayoutDto {\r\n return state.layout;\r\n }\r\n\r\n @Selector()\r\n static getMainItems(state: WorkspaceBuilderStateModel): WorkspaceItem[] {\r\n return state.layout.main;\r\n }\r\n\r\n @Selector()\r\n static getMoreItems(state: WorkspaceBuilderStateModel): WorkspaceItem[] {\r\n return state.layout.more;\r\n }\r\n\r\n @Selector()\r\n static getValidationErrors(state: WorkspaceBuilderStateModel): string[] {\r\n return state.validationErrors;\r\n }\r\n\r\n @Selector()\r\n static getIsDirty(state: WorkspaceBuilderStateModel): boolean {\r\n return state.isDirty;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: WorkspaceBuilderStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: WorkspaceBuilderStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n @Selector()\r\n static getSuccessMessages(\r\n state: WorkspaceBuilderStateModel,\r\n ): Partial<Record<WorkspaceBuilderActionKey, string>> {\r\n return state.successMessages;\r\n }\r\n\r\n @Action(SetWorkspaceBuilderLevelId)\r\n setLevelId(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { levelId }: SetWorkspaceBuilderLevelId,\r\n ) {\r\n const state = ctx.getState();\r\n if (state.levelId === levelId) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n levelId,\r\n layout: createEmptyLayout(levelId),\r\n originalLayout: null,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {},\r\n });\r\n }\r\n\r\n @Action(GetWorkspaceBuilderLayout)\r\n getLayout(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.get<Response<WorkspaceBuilderLayoutDto>>(\r\n `levels/${levelId}/workspaceBuilder`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.GetLayout,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const incoming = response.data\r\n ? { ...response.data, levelId }\r\n : createEmptyLayout(levelId);\r\n\r\n const normalized = normalizeLayout(incoming);\r\n const validationErrors = validateLayout(normalized);\r\n\r\n return {\r\n layout: normalized,\r\n originalLayout: toSaveLayoutDto(normalized),\r\n validationErrors,\r\n isDirty: false,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(PatchWorkspaceBuilderLayoutLocally)\r\n patchLayoutLocally(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { layout }: PatchWorkspaceBuilderLayoutLocally,\r\n ) {\r\n const state = ctx.getState();\r\n const normalized = normalizeLayout({\r\n ...layout,\r\n levelId: state.levelId ?? layout.levelId,\r\n });\r\n const validationErrors = validateLayout(normalized);\r\n\r\n ctx.patchState({\r\n layout: normalized,\r\n validationErrors,\r\n isDirty: computeIsDirty(normalized, state.originalLayout),\r\n });\r\n }\r\n\r\n @Action(SaveWorkspaceBuilderLayout)\r\n saveLayout(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n const state = ctx.getState();\r\n const { levelId } = state;\r\n\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const normalized = normalizeLayout({\r\n ...state.layout,\r\n levelId,\r\n });\r\n\r\n const validationErrors = validateLayout(normalized);\r\n if (validationErrors.length > 0) {\r\n ctx.patchState({\r\n validationErrors,\r\n });\r\n return;\r\n }\r\n\r\n const payload = toSaveLayoutDto(normalized);\r\n\r\n const req$ = this.http.put<Response<{ ok: boolean }>>(\r\n `levels/${levelId}/workspaceBuilder`,\r\n payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.SaveLayout,\r\n request$: req$,\r\n onSuccess: (response, state) => ({\r\n layout: normalized,\r\n originalLayout: payload,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.SaveLayout]: response.message ?? '',\r\n },\r\n }),\r\n });\r\n }\r\n\r\n @Action(CreateWorkspaceBuilderGroup)\r\n createGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { title, area, order }: CreateWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.post<Response<CreateWorkspaceGroupResponseDto>>(\r\n `levels/${levelId}/workspaceBuilder/groups`,\r\n {\r\n title,\r\n area,\r\n order: order ?? 1,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.CreateGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const groupId = response.data?.groupId;\r\n if (!groupId) {\r\n return {};\r\n }\r\n\r\n const nextLayout = insertGroupIntoLayout(\r\n state.layout,\r\n groupId,\r\n title,\r\n area,\r\n order,\r\n );\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.CreateGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(RenameWorkspaceBuilderGroup)\r\n renameGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { groupId, title }: RenameWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.patch<Response<any>>(\r\n `levels/${levelId}/workspaceBuilder/groups/${groupId}`,\r\n {\r\n title,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.UpdateGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const nextLayout = renameGroupInLayout(state.layout, groupId, title);\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.UpdateGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteWorkspaceBuilderGroup)\r\n deleteGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { groupId }: DeleteWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.delete<Response<void>>(\r\n `levels/${levelId}/workspaceBuilder/groups/${groupId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.DeleteGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const nextLayout = removeGroupAndPromoteModules(state.layout, groupId);\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.DeleteGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(ResetWorkspaceBuilderState)\r\n resetState(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n ctx.setState(DEFAULTS);\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\nimport {\r\n CreateWorkspaceBuilderGroup,\r\n DeleteWorkspaceBuilderGroup,\r\n GetWorkspaceBuilderLayout,\r\n PatchWorkspaceBuilderLayoutLocally,\r\n RenameWorkspaceBuilderGroup,\r\n ResetWorkspaceBuilderState,\r\n SaveWorkspaceBuilderLayout,\r\n SetWorkspaceBuilderLevelId,\r\n} from './workspace-builder.actions';\r\nimport {\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n} from './workspace-builder.model';\r\nimport { WorkspaceBuilderState } from './workspace-builder.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkspaceBuilderFacade {\r\n private readonly store = inject(Store);\r\n\r\n readonly levelId = select(WorkspaceBuilderState.getLevelId);\r\n readonly layout = select(WorkspaceBuilderState.getLayout);\r\n readonly mainItems = select(WorkspaceBuilderState.getMainItems);\r\n readonly moreItems = select(WorkspaceBuilderState.getMoreItems);\r\n readonly validationErrors = select(WorkspaceBuilderState.getValidationErrors);\r\n readonly isDirty = select(WorkspaceBuilderState.getIsDirty);\r\n readonly successMessages = select(WorkspaceBuilderState.getSuccessMessages);\r\n\r\n private readonly loadingActive = select(\r\n WorkspaceBuilderState.getLoadingActive,\r\n );\r\n private readonly errors = select(WorkspaceBuilderState.getErrors);\r\n\r\n readonly isLoadingLayout = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.GetLayout),\r\n );\r\n readonly isSavingLayout = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.SaveLayout),\r\n );\r\n readonly isCreatingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.CreateGroup),\r\n );\r\n readonly isUpdatingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.UpdateGroup),\r\n );\r\n readonly isDeletingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.DeleteGroup),\r\n );\r\n\r\n readonly layoutError = computed(\r\n () => this.errors()[WorkspaceBuilderActionKey.GetLayout] ?? null,\r\n );\r\n readonly saveError = computed(\r\n () => this.errors()[WorkspaceBuilderActionKey.SaveLayout] ?? null,\r\n );\r\n\r\n getSuccessMessage(key: WorkspaceBuilderActionKey): string | null {\r\n return this.successMessages()[key] ?? null;\r\n }\r\n\r\n getErrorMessage(key: WorkspaceBuilderActionKey): string | null {\r\n return this.errors()[key] ?? null;\r\n }\r\n\r\n setLevelId(levelId: number) {\r\n return this.store.dispatch(new SetWorkspaceBuilderLevelId(levelId));\r\n }\r\n\r\n getLayout() {\r\n return this.store.dispatch(new GetWorkspaceBuilderLayout());\r\n }\r\n\r\n patchLayout(layout: WorkspaceBuilderLayoutDto) {\r\n return this.store.dispatch(new PatchWorkspaceBuilderLayoutLocally(layout));\r\n }\r\n\r\n saveLayout() {\r\n return this.store.dispatch(new SaveWorkspaceBuilderLayout());\r\n }\r\n\r\n createGroup(title: string, area: WorkspaceArea = 'main', order?: number) {\r\n return this.store.dispatch(\r\n new CreateWorkspaceBuilderGroup(title, area, order),\r\n );\r\n }\r\n\r\n renameGroup(groupId: string, title: string) {\r\n return this.store.dispatch(new RenameWorkspaceBuilderGroup(groupId, title));\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n return this.store.dispatch(new DeleteWorkspaceBuilderGroup(groupId));\r\n }\r\n\r\n resetState() {\r\n return this.store.dispatch(new ResetWorkspaceBuilderState());\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, inject, input, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DynamicDialogConfig, ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { WorkspaceArea } from '../../../store/workspace-builder/workspace-builder.model';\r\n\r\nexport interface CreateWorkspaceGroupDialogResult {\r\n area: WorkspaceArea;\r\n title: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-workspace-builder-create-group-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n InputTextModule,\r\n Button,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './workspace-builder-create-group-dialog.html',\r\n styleUrl: './workspace-builder-create-group-dialog.css',\r\n})\r\nexport class WorkspaceBuilderCreateGroupDialog {\r\n readonly area = input<WorkspaceArea | null>(null);\r\n readonly title = signal('');\r\n\r\n readonly modal = inject(ModalService);\r\n private readonly config = inject(DynamicDialogConfig, { optional: true });\r\n private readonly ref = inject(ModalRef);\r\n\r\n resolvedArea(): WorkspaceArea {\r\n return (\r\n this.area() ??\r\n (this.config?.data?.area as WorkspaceArea | undefined) ??\r\n 'main'\r\n );\r\n }\r\n\r\n submit(): void {\r\n const trimmed = this.title().trim();\r\n if (!trimmed) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n area: this.resolvedArea(),\r\n title: trimmed,\r\n } satisfies CreateWorkspaceGroupDialogResult);\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n <input\r\n pInputText\r\n [(ngModel)]=\"title\"\r\n [placeholder]=\"t('new-group-placeholder')\"\r\n class=\"group-title-input\"\r\n (keydown.enter)=\"submit()\"\r\n />\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n variant=\"outlined\"\r\n [label]=\"t('cancel')\"\r\n (click)=\"cancel()\"\r\n ></mt-button>\r\n\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n [disabled]=\"!title().trim()\"\r\n (click)=\"submit()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnDestroy,\r\n signal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { DialogService } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { ContextMenu, ContextMenuModule } from 'primeng/contextmenu';\r\nimport { DragDropModule } from 'primeng/dragdrop';\r\nimport { finalize } from 'rxjs';\r\nimport { WorkspaceBuilderFacade } from '../../store/workspace-builder/workspace-builder.facade';\r\nimport {\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n WorkspaceGroupItem,\r\n WorkspaceGroupModuleItem,\r\n WorkspaceItem,\r\n WorkspaceModuleItem,\r\n} from '../../store/workspace-builder/workspace-builder.model';\r\nimport {\r\n CreateWorkspaceGroupDialogResult,\r\n WorkspaceBuilderCreateGroupDialog,\r\n} from './create-group-dialog/workspace-builder-create-group-dialog';\r\nimport { Button } from '@masterteam/components/button';\r\n\r\ntype DragSource =\r\n | { type: 'area'; area: WorkspaceArea }\r\n | { type: 'group'; area: WorkspaceArea; groupId: string };\r\n\r\ntype DropTarget = DragSource;\r\n\r\ninterface ModuleDragPayload {\r\n kind: 'module';\r\n source: DragSource;\r\n modules: WorkspaceGroupModuleItem[];\r\n}\r\n\r\ninterface GroupDragPayload {\r\n kind: 'group';\r\n source: { type: 'area'; area: WorkspaceArea };\r\n groups: WorkspaceGroupItem[];\r\n}\r\n\r\ntype DragPayload = ModuleDragPayload | GroupDragPayload;\r\nconst DRAG_PAYLOAD_MIME = 'application/x-workspace-builder';\r\n\r\n@Component({\r\n selector: 'mt-workspace-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n DragDropModule,\r\n Button,\r\n Page,\r\n Card,\r\n TextField,\r\n ToggleField,\r\n ContextMenuModule,\r\n ],\r\n templateUrl: './workspace-builder.html',\r\n styleUrl: './workspace-builder.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [DialogService],\r\n})\r\nexport default class WorkspaceBuilder implements OnDestroy {\r\n readonly levelId = input<number | null>(null);\r\n readonly areas: WorkspaceArea[] = ['main', 'more'];\r\n\r\n readonly dropScope = 'workspace-builder-item';\r\n\r\n readonly createGroupArea = signal<WorkspaceArea>('main');\r\n readonly editingGroupId = signal<string | null>(null);\r\n readonly editingGroupTitle = signal('');\r\n readonly autoSaveEnabled = signal(true);\r\n\r\n private readonly expandedGroups = signal<Record<string, boolean>>({});\r\n private readonly dragPayload = signal<DragPayload | null>(null);\r\n private autoSaveInFlight = false;\r\n private autoSaveQueued = false;\r\n private autoSaveQueuedNotifySuccess = false;\r\n\r\n private readonly facade = inject(WorkspaceBuilderFacade);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n ts = inject(ToastService);\r\n private readonly addGroupLabel = toSignal(\r\n this.transloco.selectTranslate('workspace-builder.add-group'),\r\n {\r\n initialValue: this.transloco.translate('workspace-builder.add-group'),\r\n },\r\n );\r\n\r\n readonly layout = this.facade.layout;\r\n readonly validationErrors = this.facade.validationErrors;\r\n readonly isSavingLayout = this.facade.isSavingLayout;\r\n readonly areaContextItems = computed<MenuItem[]>(() => [\r\n {\r\n label: this.addGroupLabel(),\r\n icon: 'pi pi-plus',\r\n command: () => this.openCreateGroupDialog(this.createGroupArea()),\r\n },\r\n ]);\r\n\r\n constructor() {\r\n effect(() => {\r\n const levelId = this.levelId();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n this.facade.setLevelId(levelId);\r\n this.facade.getLayout();\r\n });\r\n\r\n effect(() => {\r\n const currentLayout = this.layout();\r\n this.expandedGroups.update((current) => {\r\n const next = { ...current };\r\n const existingGroupIds = new Set<string>();\r\n let changed = false;\r\n\r\n this.getAllGroups(currentLayout).forEach((group) => {\r\n existingGroupIds.add(group.id);\r\n if (next[group.id] === undefined) {\r\n next[group.id] = true;\r\n changed = true;\r\n }\r\n });\r\n\r\n Object.keys(next).forEach((groupId) => {\r\n if (!existingGroupIds.has(groupId)) {\r\n delete next[groupId];\r\n changed = true;\r\n }\r\n });\r\n\r\n return changed ? next : current;\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.facade.resetState();\r\n }\r\n\r\n areaItems(area: WorkspaceArea): WorkspaceItem[] {\r\n return this.layout()[area];\r\n }\r\n\r\n trackItem(item: WorkspaceItem): string {\r\n return `${item.type}:${item.id}`;\r\n }\r\n\r\n isGroupExpanded(groupId: string): boolean {\r\n return this.expandedGroups()[groupId] ?? true;\r\n }\r\n\r\n toggleGroup(groupId: string): void {\r\n this.expandedGroups.update((groups) => ({\r\n ...groups,\r\n [groupId]: !groups[groupId],\r\n }));\r\n }\r\n\r\n onModuleDragStart(\r\n event: unknown,\r\n module: WorkspaceModuleItem | WorkspaceGroupModuleItem,\r\n source: DragSource,\r\n ): void {\r\n this.stopEventPropagation(event);\r\n\r\n const payload: ModuleDragPayload = {\r\n kind: 'module',\r\n source,\r\n modules: [\r\n {\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n },\r\n ],\r\n };\r\n\r\n this.dragPayload.set(payload);\r\n this.setDragTransferData(\r\n this.getNativeDragEvent(event),\r\n payload,\r\n module.id,\r\n );\r\n }\r\n\r\n onGroupDragStart(\r\n event: unknown,\r\n group: WorkspaceGroupItem,\r\n area: WorkspaceArea,\r\n ): void {\r\n this.stopEventPropagation(event);\r\n\r\n const payload: GroupDragPayload = {\r\n kind: 'group',\r\n source: { type: 'area', area },\r\n groups: [group],\r\n };\r\n\r\n this.dragPayload.set(payload);\r\n this.setDragTransferData(this.getNativeDragEvent(event), payload, group.id);\r\n }\r\n\r\n onDragEnd(): void {\r\n // Intentionally keep payload until an explicit drop/cancel path.\r\n // Some browsers/directives emit dragend before drop.\r\n }\r\n\r\n onDropToArea(event: unknown, area: WorkspaceArea, index: number): void {\r\n this.stopDropEvent(event);\r\n this.handleDrop({ type: 'area', area }, index, event);\r\n }\r\n\r\n onDropToGroup(\r\n event: unknown,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n ): void {\r\n this.stopDropEvent(event);\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n allowNativeDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n }\r\n\r\n onNativeAreaDrop(event: DragEvent, area: WorkspaceArea): void {\r\n this.stopDropEvent(event);\r\n const index = this.resolveAreaDropIndex(event, area);\r\n this.handleDrop({ type: 'area', area }, index, event);\r\n }\r\n\r\n onNativeGroupDrop(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n ): void {\r\n this.stopDropEvent(event);\r\n const group = this.findGroup(this.layout(), area, groupId);\r\n const index = group?.modules.length ?? 0;\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n onNativeGroupModuleDrop(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n moduleIndex: number,\r\n ): void {\r\n this.stopDropEvent(event);\r\n const index = this.resolveSiblingDropIndex(event, moduleIndex);\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n onAreaContextMenu(\r\n event: MouseEvent,\r\n area: WorkspaceArea,\r\n contextMenu: ContextMenu,\r\n ): void {\r\n event.preventDefault();\r\n this.createGroupArea.set(area);\r\n contextMenu.show(event);\r\n }\r\n\r\n openCreateGroupDialog(area: WorkspaceArea): void {\r\n const ref = this.modal.openModal(\r\n WorkspaceBuilderCreateGroupDialog,\r\n 'dialog',\r\n {\r\n header: this.transloco.translate('workspace-builder.create-group'),\r\n styleClass: '!w-[28rem]',\r\n height: 'auto',\r\n appendTo: 'body',\r\n dismissableMask: true,\r\n data: { area },\r\n inputValues: { area },\r\n },\r\n );\r\n\r\n ref.onClose.subscribe(\r\n (result: CreateWorkspaceGroupDialogResult | null | undefined) => {\r\n const title = result?.title?.trim();\r\n if (!title) {\r\n return;\r\n }\r\n\r\n const order = this.layout()[area].length + 1;\r\n this.facade.createGroup(title, area, order).subscribe({\r\n next: () => {\r\n // Persist full layout after group creation.\r\n this.triggerAutoSave({ notifyOnSuccess: false });\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.CreateGroup,\r\n 'workspace-builder.group-create-success',\r\n ),\r\n );\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.CreateGroup,\r\n 'workspace-builder.group-create-error',\r\n ),\r\n );\r\n },\r\n });\r\n },\r\n );\r\n }\r\n\r\n startRenameGroup(group: WorkspaceGroupItem): void {\r\n this.editingGroupId.set(group.id);\r\n this.editingGroupTitle.set(group.name);\r\n }\r\n\r\n saveRenameGroup(groupId: string): void {\r\n const title = this.editingGroupTitle().trim();\r\n if (!title) {\r\n return;\r\n }\r\n\r\n this.facade.renameGroup(groupId, title).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.UpdateGroup,\r\n 'workspace-builder.group-update-success',\r\n ),\r\n );\r\n this.cancelRenameGroup();\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.UpdateGroup,\r\n 'workspace-builder.group-update-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n cancelRenameGroup(): void {\r\n this.editingGroupId.set(null);\r\n this.editingGroupTitle.set('');\r\n }\r\n\r\n onSaveClick(): void {\r\n this.triggerAutoSave({ notifyOnSuccess: true, force: true });\r\n }\r\n\r\n onAutoSaveToggleChange(value: boolean | null): void {\r\n const isEnabled = value ?? false;\r\n this.autoSaveEnabled.set(isEnabled);\r\n\r\n if (!isEnabled) {\r\n this.autoSaveQueued = false;\r\n this.autoSaveQueuedNotifySuccess = false;\r\n }\r\n }\r\n\r\n deleteGroup(groupId: string, event?: Event): void {\r\n if (!event) {\r\n return;\r\n }\r\n\r\n this.confirmationService.confirmDelete({\r\n event: event,\r\n type: 'popup',\r\n accept: () => this.executeDeleteGroup(groupId),\r\n reject: () => {},\r\n });\r\n }\r\n\r\n private executeDeleteGroup(groupId: string): void {\r\n this.facade.deleteGroup(groupId).subscribe({\r\n next: () => {\r\n // Persist layout after group removal so backend stores the no-group shape.\r\n this.triggerAutoSave({ notifyOnSuccess: false });\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.DeleteGroup,\r\n 'workspace-builder.group-delete-success',\r\n ),\r\n );\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.DeleteGroup,\r\n 'workspace-builder.group-delete-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n removeModuleFromGroup(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n moduleId: string,\r\n ): void {\r\n const nextLayout = this.cloneLayout(this.layout());\r\n const group = this.findGroup(nextLayout, area, groupId);\r\n if (!group) {\r\n return;\r\n }\r\n\r\n const moduleIndex = group.modules.findIndex(\r\n (module) => module.id === moduleId,\r\n );\r\n if (moduleIndex === -1) {\r\n return;\r\n }\r\n\r\n const [module] = group.modules.splice(moduleIndex, 1);\r\n\r\n const areaItems = nextLayout[area];\r\n const groupIndex = areaItems.findIndex(\r\n (item) => item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (groupIndex === -1) {\r\n return;\r\n }\r\n\r\n areaItems.splice(groupIndex + 1, 0, {\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n });\r\n\r\n this.patchLayoutAndAutoSave(nextLayout);\r\n }\r\n\r\n private handleDrop(\r\n target: DropTarget,\r\n targetIndex: number,\r\n event?: unknown,\r\n ): void {\r\n const payload = this.resolveDropPayload(event);\r\n if (!payload) {\r\n return;\r\n }\r\n\r\n if (payload.kind === 'group' && target.type === 'group') {\r\n // Prevent nested groups.\r\n this.dragPayload.set(null);\r\n return;\r\n }\r\n\r\n const nextLayout = this.cloneLayout(this.layout());\r\n\r\n if (payload.kind === 'group') {\r\n this.moveGroups(nextLayout, payload, target, targetIndex);\r\n } else {\r\n this.moveModules(nextLayout, payload, target, targetIndex);\r\n }\r\n\r\n this.patchLayoutAndAutoSave(nextLayout);\r\n this.dragPayload.set(null);\r\n }\r\n\r\n private patchLayoutAndAutoSave(layout: WorkspaceBuilderLayoutDto): void {\r\n this.facade.patchLayout(layout).subscribe({\r\n next: () => {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n },\r\n });\r\n }\r\n\r\n private triggerAutoSave(options?: {\r\n notifyOnSuccess?: boolean;\r\n force?: boolean;\r\n }): void {\r\n const notifyOnSuccess = options?.notifyOnSuccess ?? false;\r\n const shouldAutoSave = options?.force || this.autoSaveEnabled();\r\n\r\n if (!shouldAutoSave) {\r\n return;\r\n }\r\n\r\n if (this.validationErrors().length > 0) {\r\n return;\r\n }\r\n\r\n if (this.autoSaveInFlight) {\r\n this.autoSaveQueued = true;\r\n this.autoSaveQueuedNotifySuccess =\r\n this.autoSaveQueuedNotifySuccess || notifyOnSuccess;\r\n return;\r\n }\r\n\r\n this.autoSaveInFlight = true;\r\n this.facade\r\n .saveLayout()\r\n .pipe(\r\n finalize(() => {\r\n this.autoSaveInFlight = false;\r\n if (this.autoSaveQueued) {\r\n const queuedNotifyOnSuccess = this.autoSaveQueuedNotifySuccess;\r\n this.autoSaveQueued = false;\r\n this.autoSaveQueuedNotifySuccess = false;\r\n this.triggerAutoSave({ notifyOnSuccess: queuedNotifyOnSuccess });\r\n }\r\n }),\r\n )\r\n .subscribe({\r\n next: () => {\r\n if (notifyOnSuccess) {\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.SaveLayout,\r\n 'workspace-builder.layout-update-success',\r\n ),\r\n );\r\n }\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.SaveLayout,\r\n 'workspace-builder.layout-update-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n private resolveDropPayload(event?: unknown): DragPayload | null {\r\n const fromTransfer = this.getDropPayloadFromTransfer(event);\r\n if (fromTransfer) {\r\n return fromTransfer;\r\n }\r\n\r\n return this.dragPayload();\r\n }\r\n\r\n private getDropPayloadFromTransfer(event?: unknown): DragPayload | null {\r\n const transfer = this.getNativeDragEvent(event)?.dataTransfer;\r\n const raw = transfer?.getData?.(DRAG_PAYLOAD_MIME);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(raw) as DragPayload;\r\n if (parsed?.kind === 'module' || parsed?.kind === 'group') {\r\n return parsed;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private setDragTransferData(\r\n event: DragEvent | null,\r\n payload: DragPayload,\r\n plainTextFallback: string,\r\n ): void {\r\n const transfer = event?.dataTransfer;\r\n if (!transfer) {\r\n return;\r\n }\r\n\r\n transfer.setData(DRAG_PAYLOAD_MIME, JSON.stringify(payload));\r\n transfer.setData('text/plain', plainTextFallback);\r\n }\r\n\r\n private stopDropEvent(event: unknown): void {\r\n const nativeEvent = this.unwrapEvent(event);\r\n nativeEvent?.preventDefault?.();\r\n nativeEvent?.stopPropagation?.();\r\n (event as any)?.preventDefault?.();\r\n (event as any)?.stopPropagation?.();\r\n }\r\n\r\n private stopEventPropagation(event: unknown): void {\r\n this.unwrapEvent(event)?.stopPropagation?.();\r\n (event as any)?.stopPropagation?.();\r\n }\r\n\r\n private getNativeDragEvent(event: unknown): DragEvent | null {\r\n const nativeEvent = this.unwrapEvent(event);\r\n if (!nativeEvent || !('dataTransfer' in nativeEvent)) {\r\n return null;\r\n }\r\n\r\n return nativeEvent as DragEvent;\r\n }\r\n\r\n private unwrapEvent(event: unknown): Event | null {\r\n if (!event) {\r\n return null;\r\n }\r\n\r\n const candidate = (event as any)?.originalEvent ?? (event as any)?.event;\r\n return (candidate ?? (event as Event)) as Event;\r\n }\r\n\r\n private resolveAreaDropIndex(event: DragEvent, area: WorkspaceArea): number {\r\n const y = event.clientY;\r\n const items = this.layout()[area];\r\n\r\n for (let index = 0; index < items.length; index += 1) {\r\n const element = this.getTopLevelItemElement(event, area, index);\r\n if (!element) {\r\n continue;\r\n }\r\n\r\n const rect = element.getBoundingClientRect();\r\n if (y < rect.top + rect.height / 2) {\r\n return index;\r\n }\r\n }\r\n\r\n return items.length;\r\n }\r\n\r\n private resolveSiblingDropIndex(event: DragEvent, itemIndex: number): number {\r\n const target = event.currentTarget as HTMLElement | null;\r\n if (!target) {\r\n return itemIndex;\r\n }\r\n\r\n const rect = target.getBoundingClientRect();\r\n const shouldInsertAfter = event.clientY >= rect.top + rect.height / 2;\r\n return shouldInsertAfter ? itemIndex + 1 : itemIndex;\r\n }\r\n\r\n private getTopLevelItemElement(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n itemIndex: number,\r\n ): HTMLElement | null {\r\n const root = (event.currentTarget as HTMLElement | null) ?? null;\r\n if (!root) {\r\n return null;\r\n }\r\n\r\n const selector =\r\n area === 'main'\r\n ? `[data-area=\"main\"][data-item-index=\"${itemIndex}\"]`\r\n : `[data-area=\"more\"][data-item-index=\"${itemIndex}\"]`;\r\n return root.querySelector(selector);\r\n }\r\n\r\n private moveGroups(\r\n layout: WorkspaceBuilderLayoutDto,\r\n payload: GroupDragPayload,\r\n target: DropTarget,\r\n targetIndex: number,\r\n ): void {\r\n if (target.type !== 'area') {\r\n return;\r\n }\r\n\r\n const sourceArea = payload.source.area;\r\n const targetArea = target.area;\r\n const groupIds = new Set(payload.groups.map((group) => group.id));\r\n\r\n if (sourceArea === targetArea) {\r\n const original = layout[sourceArea];\r\n const moving = original.filter(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && groupIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter(\r\n (item) => item.type === 'group' && groupIds.has(item.id),\r\n ).length;\r\n\r\n const remaining = original.filter(\r\n (item) => !(item.type === 'group' && groupIds.has(item.id)),\r\n );\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n layout[sourceArea] = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n const sourceList = layout[sourceArea];\r\n const moving = sourceList.filter(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && groupIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n layout[sourceArea] = sourceList.filter(\r\n (item) => !(item.type === 'group' && groupIds.has(item.id)),\r\n );\r\n\r\n const targetList = layout[targetArea];\r\n const insertIndex = this.clampIndex(targetIndex, targetList.length);\r\n targetList.splice(insertIndex, 0, ...moving);\r\n }\r\n\r\n private moveModules(\r\n layout: WorkspaceBuilderLayoutDto,\r\n payload: ModuleDragPayload,\r\n target: DropTarget,\r\n targetIndex: number,\r\n ): void {\r\n const moduleIds = new Set(payload.modules.map((module) => module.id));\r\n\r\n if (\r\n payload.source.type === 'area' &&\r\n target.type === 'area' &&\r\n payload.source.area === target.area\r\n ) {\r\n const area = payload.source.area;\r\n const original = layout[area];\r\n const moving = original.filter(\r\n (item): item is WorkspaceModuleItem =>\r\n item.type === 'module' && moduleIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter(\r\n (item) => item.type === 'module' && moduleIds.has(item.id),\r\n ).length;\r\n\r\n const remaining = original.filter(\r\n (item) => !(item.type === 'module' && moduleIds.has(item.id)),\r\n );\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n layout[area] = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n if (\r\n payload.source.type === 'group' &&\r\n target.type === 'group' &&\r\n payload.source.area === target.area &&\r\n payload.source.groupId === target.groupId\r\n ) {\r\n const group = this.findGroup(layout, target.area, target.groupId);\r\n if (!group) {\r\n return;\r\n }\r\n\r\n const original = group.modules;\r\n const moving = original.filter((module) => moduleIds.has(module.id));\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter((module) => moduleIds.has(module.id)).length;\r\n\r\n const remaining = original.filter((module) => !moduleIds.has(module.id));\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n group.modules = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n const extracted = this.extractModulesFromSource(\r\n layout,\r\n payload.source,\r\n moduleIds,\r\n );\r\n if (extracted.length === 0) {\r\n return;\r\n }\r\n\r\n if (target.type === 'area') {\r\n const areaList = layout[target.area];\r\n const insertIndex = this.clampIndex(targetIndex, areaList.length);\r\n const topLevelModules: WorkspaceModuleItem[] = extracted.map(\r\n (module) => ({\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n }),\r\n );\r\n\r\n areaList.splice(insertIndex, 0, ...topLevelModules);\r\n return;\r\n }\r\n\r\n const targetGroup = this.findGroup(layout, target.area, target.groupId);\r\n if (!targetGroup) {\r\n return;\r\n }\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex,\r\n targetGroup.modules.length,\r\n );\r\n targetGroup.modules.splice(insertIndex, 0, ...extracted);\r\n }\r\n\r\n private extractModulesFromSource(\r\n layout: WorkspaceBuilderLayoutDto,\r\n source: DragSource,\r\n moduleIds: Set<string>,\r\n ): WorkspaceGroupModuleItem[] {\r\n if (source.type === 'area') {\r\n const areaList = layout[source.area];\r\n const moving = areaList\r\n .filter(\r\n (item): item is WorkspaceModuleItem =>\r\n item.type === 'module' && moduleIds.has(item.id),\r\n )\r\n .map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n }));\r\n\r\n layout[source.area] = areaList.filter(\r\n (item) => !(item.type === 'module' && moduleIds.has(item.id)),\r\n );\r\n\r\n return moving;\r\n }\r\n\r\n const group = this.findGroup(layout, source.area, source.groupId);\r\n if (!group) {\r\n return [];\r\n }\r\n\r\n const moving = group.modules.filter((module) => moduleIds.has(module.id));\r\n group.modules = group.modules.filter((module) => !moduleIds.has(module.id));\r\n\r\n return moving;\r\n }\r\n\r\n private findGroup(\r\n layout: WorkspaceBuilderLayoutDto,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n ): WorkspaceGroupItem | null {\r\n const found = layout[area].find(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n return found ?? null;\r\n }\r\n\r\n private clampIndex(index: number, length: number): number {\r\n return Math.max(0, Math.min(index, length));\r\n }\r\n\r\n private getAllGroups(\r\n layout: WorkspaceBuilderLayoutDto,\r\n ): WorkspaceGroupItem[] {\r\n return [...layout.main, ...layout.more].filter(\r\n (item): item is WorkspaceGroupItem => item.type === 'group',\r\n );\r\n }\r\n\r\n private cloneLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n ): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId: layout.levelId,\r\n main: layout.main.map((item) => this.cloneItem(item)),\r\n more: layout.more.map((item) => this.cloneItem(item)),\r\n };\r\n }\r\n\r\n private cloneItem(item: WorkspaceItem): WorkspaceItem {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n modules: item.modules.map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n };\r\n }\r\n\r\n private getSuccessMessage(\r\n key: WorkspaceBuilderActionKey,\r\n fallbackTranslationKey: string,\r\n ): string {\r\n const apiMessage = this.facade.getSuccessMessage(key)?.trim();\r\n if (apiMessage) {\r\n return apiMessage;\r\n }\r\n\r\n return this.transloco.translate(fallbackTranslationKey);\r\n }\r\n\r\n private getErrorMessage(\r\n key: WorkspaceBuilderActionKey,\r\n fallbackTranslationKey: string,\r\n ): string {\r\n const apiMessage = this.facade.getErrorMessage(key)?.trim();\r\n if (apiMessage) {\r\n return apiMessage;\r\n }\r\n\r\n return this.transloco.translate(fallbackTranslationKey);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <p-contextMenu\r\n #areaContextMenu\r\n [model]=\"areaContextItems()\"\r\n appendTo=\"body\"\r\n />\r\n\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n <div class=\"flex items-center gap-3\">\r\n <mt-toggle-field\r\n class=\"min-w-[9rem]\"\r\n [label]=\"t('auto-save')\"\r\n [ngModel]=\"autoSaveEnabled()\"\r\n size=\"small\"\r\n (ngModelChange)=\"onAutoSaveToggleChange($event)\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"isSavingLayout() || validationErrors().length > 0\"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"grid gap-4\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-300 bg-red-50 p-3 text-red-700\"\r\n >\r\n <div class=\"mb-2 font-semibold\">{{ t(\"validation-title\") }}</div>\r\n <ul class=\"m-0 list-disc ps-4\">\r\n @for (error of validationErrors(); track error) {\r\n <li>{{ error }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <div class=\"workspace-areas-grid grid gap-4\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [paddingless]=\"true\"\r\n class=\"min-h-[24rem] overflow-hidden border border-surface-300\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <header class=\"border-b border-surface-200 px-4 py-3 font-semibold\">\r\n {{ t(area) }}\r\n </header>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 p-3\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, areaItems(area).length)\"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n ></div>\r\n\r\n @for (\r\n item of areaItems(area);\r\n track trackItem(item);\r\n let i = $index\r\n ) {\r\n @if (item.type === \"module\") {\r\n <div\r\n class=\"flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, item, {\r\n type: 'area',\r\n area: area,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <mt-button\r\n class=\"drag-handle\"\r\n styleClass=\"drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.name }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"grid gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.group-drag-handle'\"\r\n (onDragStart)=\"onGroupDragStart($event, item, area)\"\r\n (onDragEnd)=\"onDragEnd()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeGroupDrop($event, area, item.id)\"\r\n >\r\n <div\r\n class=\"group-header flex items-center gap-2 rounded-md px-1 py-0.5\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <mt-button\r\n class=\"expand-btn\"\r\n [icon]=\"\r\n isGroupExpanded(item.id)\r\n ? 'arrow.chevron-up'\r\n : 'arrow.chevron-down'\r\n \"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <mt-button\r\n class=\"group-drag-handle\"\r\n styleClass=\"group-drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n\r\n @if (editingGroupId() === item.id) {\r\n <mt-text-field\r\n [(ngModel)]=\"editingGroupTitle\"\r\n class=\"min-w-[12rem] flex-1\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n [text]=\"true\"\r\n severity=\"success\"\r\n size=\"small\"\r\n (onClick)=\"saveRenameGroup(item.id)\"\r\n />\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"cancelRenameGroup()\"\r\n />\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n item.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n [text]=\"true\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n (onClick)=\"deleteGroup(item.id, $event)\"\r\n />\r\n </div>\r\n\r\n @if (isGroupExpanded(item.id)) {\r\n <div\r\n class=\"group-modules grid gap-2 border-t border-dashed border-surface-300 pt-2\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToGroup($event, area, item.id, 0)\"\r\n ></div>\r\n\r\n @for (\r\n module of item.modules;\r\n track module.id;\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2 ms-2\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop($event, area, item.id, j)\r\n \"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, module, {\r\n type: 'group',\r\n area: area,\r\n groupId: item.id,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <mt-button\r\n class=\"drag-handle\"\r\n styleClass=\"drag-handle cursor-move\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n icon=\"general.menu-05\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n [text]=\"true\"\r\n severity=\"warn\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(area, item.id, module.id)\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup($event, area, item.id, j + 1)\r\n \"\r\n ></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, i + 1)\"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area rounded-lg border border-dashed border-surface-300 p-4 text-center text-surface-500\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n >\r\n {{ t(\"empty-area\") }}\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-workspace-builder.mjs","sources":["../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.actions.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.model.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.state.ts","../../../../packages/masterteam/workspace-builder/src/store/workspace-builder/workspace-builder.facade.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/create-group-dialog/workspace-builder-create-group-dialog.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/create-group-dialog/workspace-builder-create-group-dialog.html","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/workspace-builder.ts","../../../../packages/masterteam/workspace-builder/src/lib/workspace-builder/workspace-builder.html","../../../../packages/masterteam/workspace-builder/src/masterteam-workspace-builder.ts"],"sourcesContent":["import {\r\n WorkspaceArea,\r\n WorkspaceBuilderLayoutDto,\r\n} from './workspace-builder.model';\r\n\r\nexport class SetWorkspaceBuilderLevelId {\r\n static readonly type = '[WorkspaceBuilder] Set Level ID';\r\n constructor(public levelId: number) {}\r\n}\r\n\r\nexport class GetWorkspaceBuilderLayout {\r\n static readonly type = '[WorkspaceBuilder] Get Layout';\r\n}\r\n\r\nexport class PatchWorkspaceBuilderLayoutLocally {\r\n static readonly type = '[WorkspaceBuilder] Patch Layout Locally';\r\n constructor(public layout: WorkspaceBuilderLayoutDto) {}\r\n}\r\n\r\nexport class SaveWorkspaceBuilderLayout {\r\n static readonly type = '[WorkspaceBuilder] Save Layout';\r\n}\r\n\r\nexport class CreateWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Create Group';\r\n constructor(\r\n public title: string,\r\n public area: WorkspaceArea = 'main',\r\n public order?: number,\r\n ) {}\r\n}\r\n\r\nexport class RenameWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Rename Group';\r\n constructor(\r\n public groupId: string,\r\n public title: string,\r\n ) {}\r\n}\r\n\r\nexport class DeleteWorkspaceBuilderGroup {\r\n static readonly type = '[WorkspaceBuilder] Delete Group';\r\n constructor(public groupId: string) {}\r\n}\r\n\r\nexport class ResetWorkspaceBuilderState {\r\n static readonly type = '[WorkspaceBuilder] Reset State';\r\n}\r\n","import { LoadingStateShape } from '../utils/state-helpers';\r\n\r\nexport type WorkspaceArea = 'main' | 'more';\r\nexport type WorkspaceItemType = 'module' | 'group';\r\n\r\nexport interface WorkspaceModuleItem {\r\n type: 'module';\r\n id: string;\r\n name: string;\r\n order: number;\r\n}\r\n\r\nexport interface WorkspaceGroupModuleItem {\r\n id: string;\r\n name: string;\r\n order: number;\r\n}\r\n\r\nexport interface WorkspaceGroupItem {\r\n type: 'group';\r\n id: string;\r\n name: string;\r\n order: number;\r\n modules: WorkspaceGroupModuleItem[];\r\n}\r\n\r\nexport type WorkspaceItem = WorkspaceModuleItem | WorkspaceGroupItem;\r\n\r\nexport interface WorkspaceBuilderLayoutDto {\r\n levelId: number;\r\n main: WorkspaceItem[];\r\n more: WorkspaceItem[];\r\n}\r\n\r\nexport interface SaveWorkspaceModuleItemDto {\r\n id: string;\r\n order: number;\r\n}\r\n\r\nexport interface SaveWorkspaceItemDto {\r\n type: WorkspaceItemType;\r\n id: string;\r\n order: number;\r\n modules?: SaveWorkspaceModuleItemDto[];\r\n}\r\n\r\nexport interface SaveWorkspaceLayoutDto {\r\n main: SaveWorkspaceItemDto[];\r\n more: SaveWorkspaceItemDto[];\r\n}\r\n\r\nexport interface CreateWorkspaceGroupDto {\r\n title: string;\r\n area: WorkspaceArea;\r\n order: number;\r\n}\r\n\r\nexport interface CreateWorkspaceGroupResponseDto {\r\n groupId: string;\r\n}\r\n\r\nexport interface UpdateWorkspaceGroupDto {\r\n title?: string;\r\n area?: WorkspaceArea;\r\n order?: number;\r\n}\r\n\r\nexport enum WorkspaceBuilderActionKey {\r\n GetLayout = 'getLayout',\r\n SaveLayout = 'saveLayout',\r\n CreateGroup = 'createGroup',\r\n UpdateGroup = 'updateGroup',\r\n DeleteGroup = 'deleteGroup',\r\n}\r\n\r\nexport interface WorkspaceBuilderStateModel extends LoadingStateShape<WorkspaceBuilderActionKey> {\r\n levelId: number | null;\r\n layout: WorkspaceBuilderLayoutDto;\r\n originalLayout: SaveWorkspaceLayoutDto | null;\r\n validationErrors: string[];\r\n isDirty: boolean;\r\n successMessages: Partial<Record<WorkspaceBuilderActionKey, string>>;\r\n}\r\n","import { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport {\r\n CreateWorkspaceBuilderGroup,\r\n DeleteWorkspaceBuilderGroup,\r\n GetWorkspaceBuilderLayout,\r\n PatchWorkspaceBuilderLayoutLocally,\r\n RenameWorkspaceBuilderGroup,\r\n ResetWorkspaceBuilderState,\r\n SaveWorkspaceBuilderLayout,\r\n SetWorkspaceBuilderLevelId,\r\n} from './workspace-builder.actions';\r\nimport {\r\n CreateWorkspaceGroupResponseDto,\r\n SaveWorkspaceLayoutDto,\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n WorkspaceBuilderStateModel,\r\n WorkspaceGroupItem,\r\n WorkspaceGroupModuleItem,\r\n WorkspaceItem,\r\n WorkspaceModuleItem,\r\n} from './workspace-builder.model';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Response } from './api.model';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\n\r\nconst AREAS: WorkspaceArea[] = ['main', 'more'];\r\n\r\nfunction normalizeName(value: unknown): string {\r\n if (typeof value === 'string') {\r\n return value;\r\n }\r\n\r\n if (value && typeof value === 'object') {\r\n const localized = value as Record<string, unknown>;\r\n const display = localized['display'];\r\n if (typeof display === 'string' && display.trim().length > 0) {\r\n return display;\r\n }\r\n\r\n const en = localized['en'];\r\n if (typeof en === 'string' && en.trim().length > 0) {\r\n return en;\r\n }\r\n\r\n const ar = localized['ar'];\r\n if (typeof ar === 'string' && ar.trim().length > 0) {\r\n return ar;\r\n }\r\n }\r\n\r\n return '';\r\n}\r\n\r\nfunction createEmptyLayout(levelId = 0): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId,\r\n main: [],\r\n more: [],\r\n };\r\n}\r\n\r\nfunction cloneLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId: layout.levelId,\r\n main: layout.main.map(cloneItem),\r\n more: layout.more.map(cloneItem),\r\n };\r\n}\r\n\r\nfunction cloneItem(item: WorkspaceItem): WorkspaceItem {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n modules: item.modules.map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n };\r\n}\r\n\r\nfunction normalizeGroupModules(modules: any[]): WorkspaceGroupModuleItem[] {\r\n if (!Array.isArray(modules)) {\r\n return [];\r\n }\r\n\r\n return modules.map((module, index) => ({\r\n id: String(module?.id ?? ''),\r\n name: normalizeName(module?.name),\r\n order: index + 1,\r\n }));\r\n}\r\n\r\nfunction normalizeAreaItems(items: any[]): WorkspaceItem[] {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n\r\n return items.map((item, index) => {\r\n if (item?.type === 'group') {\r\n const group: WorkspaceGroupItem = {\r\n type: 'group',\r\n id: String(item?.id ?? ''),\r\n name: normalizeName(item?.name),\r\n order: index + 1,\r\n modules: normalizeGroupModules(item?.modules ?? []),\r\n };\r\n\r\n return group;\r\n }\r\n\r\n const moduleItem: WorkspaceModuleItem = {\r\n type: 'module',\r\n id: String(item?.id ?? ''),\r\n name: normalizeName(item?.name),\r\n order: index + 1,\r\n };\r\n\r\n return moduleItem;\r\n });\r\n}\r\n\r\nfunction normalizeLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): WorkspaceBuilderLayoutDto {\r\n const normalized: WorkspaceBuilderLayoutDto = {\r\n levelId: layout?.levelId ?? 0,\r\n main: normalizeAreaItems(layout?.main ?? []),\r\n more: normalizeAreaItems(layout?.more ?? []),\r\n };\r\n\r\n return normalized;\r\n}\r\n\r\nfunction toSaveLayoutDto(\r\n layout: WorkspaceBuilderLayoutDto,\r\n): SaveWorkspaceLayoutDto {\r\n return {\r\n main: layout.main.map((item, index) => {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n order: index + 1,\r\n modules: item.modules.map((module, moduleIndex) => ({\r\n id: module.id,\r\n order: moduleIndex + 1,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n order: index + 1,\r\n };\r\n }),\r\n more: layout.more.map((item, index) => {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n order: index + 1,\r\n modules: item.modules.map((module, moduleIndex) => ({\r\n id: module.id,\r\n order: moduleIndex + 1,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n order: index + 1,\r\n };\r\n }),\r\n };\r\n}\r\n\r\nfunction hasDuplicate(values: string[]): boolean {\r\n return new Set(values).size !== values.length;\r\n}\r\n\r\nfunction validateLayout(layout: WorkspaceBuilderLayoutDto): string[] {\r\n const errors: string[] = [];\r\n\r\n const moduleIds: string[] = [];\r\n const groupIds: string[] = [];\r\n\r\n for (const area of AREAS) {\r\n const items = layout[area];\r\n const orders = items.map((item) => item.order);\r\n\r\n if (hasDuplicate(orders.map(String))) {\r\n errors.push(`Duplicate order detected in ${area} list.`);\r\n }\r\n\r\n items.forEach((item) => {\r\n if (item.type === 'group') {\r\n groupIds.push(item.id);\r\n\r\n const groupOrders = item.modules.map((module) => module.order);\r\n if (hasDuplicate(groupOrders.map(String))) {\r\n errors.push(`Duplicate order detected in group ${item.id}.`);\r\n }\r\n\r\n item.modules.forEach((module) => {\r\n const typedModule: any = module as any;\r\n if (\r\n typedModule?.type === 'group' ||\r\n Array.isArray(typedModule?.modules)\r\n ) {\r\n errors.push(`Nested groups are not supported (group ${item.id}).`);\r\n }\r\n\r\n moduleIds.push(module.id);\r\n });\r\n } else {\r\n moduleIds.push(item.id);\r\n }\r\n });\r\n }\r\n\r\n if (hasDuplicate(moduleIds)) {\r\n errors.push('Duplicate module IDs detected across main, more, and groups.');\r\n }\r\n\r\n if (hasDuplicate(groupIds)) {\r\n errors.push('Duplicate group IDs detected in layout.');\r\n }\r\n\r\n return Array.from(new Set(errors));\r\n}\r\n\r\nfunction computeIsDirty(\r\n layout: WorkspaceBuilderLayoutDto,\r\n originalLayout: SaveWorkspaceLayoutDto | null,\r\n): boolean {\r\n if (!originalLayout) {\r\n return true;\r\n }\r\n\r\n return (\r\n JSON.stringify(toSaveLayoutDto(layout)) !== JSON.stringify(originalLayout)\r\n );\r\n}\r\n\r\nfunction insertGroupIntoLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n title: string,\r\n area: WorkspaceArea,\r\n order?: number,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n const list = next[area];\r\n const insertIndex = Math.max(\r\n 0,\r\n Math.min((order ?? list.length + 1) - 1, list.length),\r\n );\r\n\r\n const group: WorkspaceGroupItem = {\r\n type: 'group',\r\n id: groupId,\r\n name: title,\r\n order: 0,\r\n modules: [],\r\n };\r\n\r\n list.splice(insertIndex, 0, group);\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nfunction renameGroupInLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n title: string,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n\r\n for (const area of AREAS) {\r\n const group = next[area].find(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (group) {\r\n group.name = title;\r\n break;\r\n }\r\n }\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nfunction removeGroupAndPromoteModules(\r\n layout: WorkspaceBuilderLayoutDto,\r\n groupId: string,\r\n): WorkspaceBuilderLayoutDto {\r\n const next = cloneLayout(layout);\r\n\r\n for (const area of AREAS) {\r\n const index = next[area].findIndex(\r\n (item) => item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (index === -1) {\r\n continue;\r\n }\r\n\r\n const group = next[area][index] as WorkspaceGroupItem;\r\n const promotedModules: WorkspaceModuleItem[] = group.modules.map(\r\n (module) => ({\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n }),\r\n );\r\n\r\n next[area].splice(index, 1, ...promotedModules);\r\n break;\r\n }\r\n\r\n return normalizeLayout(next);\r\n}\r\n\r\nconst DEFAULTS: WorkspaceBuilderStateModel = {\r\n levelId: null,\r\n layout: createEmptyLayout(),\r\n originalLayout: null,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {},\r\n loadingActive: [],\r\n errors: {},\r\n};\r\n\r\n@State<WorkspaceBuilderStateModel>({\r\n name: 'workspaceBuilder',\r\n defaults: DEFAULTS,\r\n})\r\n@Injectable()\r\nexport class WorkspaceBuilderState extends CrudStateBase<\r\n WorkspaceItem,\r\n WorkspaceBuilderStateModel,\r\n WorkspaceBuilderActionKey\r\n> {\r\n private http = inject(HttpClient);\r\n\r\n @Selector()\r\n static getLevelId(state: WorkspaceBuilderStateModel): number | null {\r\n return state.levelId;\r\n }\r\n\r\n @Selector()\r\n static getLayout(\r\n state: WorkspaceBuilderStateModel,\r\n ): WorkspaceBuilderLayoutDto {\r\n return state.layout;\r\n }\r\n\r\n @Selector()\r\n static getMainItems(state: WorkspaceBuilderStateModel): WorkspaceItem[] {\r\n return state.layout.main;\r\n }\r\n\r\n @Selector()\r\n static getMoreItems(state: WorkspaceBuilderStateModel): WorkspaceItem[] {\r\n return state.layout.more;\r\n }\r\n\r\n @Selector()\r\n static getValidationErrors(state: WorkspaceBuilderStateModel): string[] {\r\n return state.validationErrors;\r\n }\r\n\r\n @Selector()\r\n static getIsDirty(state: WorkspaceBuilderStateModel): boolean {\r\n return state.isDirty;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: WorkspaceBuilderStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: WorkspaceBuilderStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n @Selector()\r\n static getSuccessMessages(\r\n state: WorkspaceBuilderStateModel,\r\n ): Partial<Record<WorkspaceBuilderActionKey, string>> {\r\n return state.successMessages;\r\n }\r\n\r\n @Action(SetWorkspaceBuilderLevelId)\r\n setLevelId(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { levelId }: SetWorkspaceBuilderLevelId,\r\n ) {\r\n const state = ctx.getState();\r\n if (state.levelId === levelId) {\r\n return;\r\n }\r\n\r\n ctx.patchState({\r\n levelId,\r\n layout: createEmptyLayout(levelId),\r\n originalLayout: null,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {},\r\n });\r\n }\r\n\r\n @Action(GetWorkspaceBuilderLayout)\r\n getLayout(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.get<Response<WorkspaceBuilderLayoutDto>>(\r\n `levels/${levelId}/workspaceBuilder`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.GetLayout,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const incoming = response.data\r\n ? { ...response.data, levelId }\r\n : createEmptyLayout(levelId);\r\n\r\n const normalized = normalizeLayout(incoming);\r\n const validationErrors = validateLayout(normalized);\r\n\r\n return {\r\n layout: normalized,\r\n originalLayout: toSaveLayoutDto(normalized),\r\n validationErrors,\r\n isDirty: false,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(PatchWorkspaceBuilderLayoutLocally)\r\n patchLayoutLocally(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { layout }: PatchWorkspaceBuilderLayoutLocally,\r\n ) {\r\n const state = ctx.getState();\r\n const normalized = normalizeLayout({\r\n ...layout,\r\n levelId: state.levelId ?? layout.levelId,\r\n });\r\n const validationErrors = validateLayout(normalized);\r\n\r\n ctx.patchState({\r\n layout: normalized,\r\n validationErrors,\r\n isDirty: computeIsDirty(normalized, state.originalLayout),\r\n });\r\n }\r\n\r\n @Action(SaveWorkspaceBuilderLayout)\r\n saveLayout(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n const state = ctx.getState();\r\n const { levelId } = state;\r\n\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const normalized = normalizeLayout({\r\n ...state.layout,\r\n levelId,\r\n });\r\n\r\n const validationErrors = validateLayout(normalized);\r\n if (validationErrors.length > 0) {\r\n ctx.patchState({\r\n validationErrors,\r\n });\r\n return;\r\n }\r\n\r\n const payload = toSaveLayoutDto(normalized);\r\n\r\n const req$ = this.http.put<Response<{ ok: boolean }>>(\r\n `levels/${levelId}/workspaceBuilder`,\r\n payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.SaveLayout,\r\n request$: req$,\r\n onSuccess: (response, state) => ({\r\n layout: normalized,\r\n originalLayout: payload,\r\n validationErrors: [],\r\n isDirty: false,\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.SaveLayout]: response.message ?? '',\r\n },\r\n }),\r\n });\r\n }\r\n\r\n @Action(CreateWorkspaceBuilderGroup)\r\n createGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { title, area, order }: CreateWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.post<Response<CreateWorkspaceGroupResponseDto>>(\r\n `levels/${levelId}/workspaceBuilder/groups`,\r\n {\r\n title,\r\n area,\r\n order: order ?? 1,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.CreateGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const groupId = response.data?.groupId;\r\n if (!groupId) {\r\n return {};\r\n }\r\n\r\n const nextLayout = insertGroupIntoLayout(\r\n state.layout,\r\n groupId,\r\n title,\r\n area,\r\n order,\r\n );\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.CreateGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(RenameWorkspaceBuilderGroup)\r\n renameGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { groupId, title }: RenameWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.patch<Response<any>>(\r\n `levels/${levelId}/workspaceBuilder/groups/${groupId}`,\r\n {\r\n title,\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.UpdateGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const nextLayout = renameGroupInLayout(state.layout, groupId, title);\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.UpdateGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteWorkspaceBuilderGroup)\r\n deleteGroup(\r\n ctx: StateContext<WorkspaceBuilderStateModel>,\r\n { groupId }: DeleteWorkspaceBuilderGroup,\r\n ) {\r\n const { levelId } = ctx.getState();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.delete<Response<void>>(\r\n `levels/${levelId}/workspaceBuilder/groups/${groupId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: WorkspaceBuilderActionKey.DeleteGroup,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const nextLayout = removeGroupAndPromoteModules(state.layout, groupId);\r\n const validationErrors = validateLayout(nextLayout);\r\n\r\n return {\r\n layout: nextLayout,\r\n validationErrors,\r\n isDirty: computeIsDirty(nextLayout, state.originalLayout),\r\n successMessages: {\r\n ...state.successMessages,\r\n [WorkspaceBuilderActionKey.DeleteGroup]: response.message ?? '',\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(ResetWorkspaceBuilderState)\r\n resetState(ctx: StateContext<WorkspaceBuilderStateModel>) {\r\n ctx.setState(DEFAULTS);\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\nimport {\r\n CreateWorkspaceBuilderGroup,\r\n DeleteWorkspaceBuilderGroup,\r\n GetWorkspaceBuilderLayout,\r\n PatchWorkspaceBuilderLayoutLocally,\r\n RenameWorkspaceBuilderGroup,\r\n ResetWorkspaceBuilderState,\r\n SaveWorkspaceBuilderLayout,\r\n SetWorkspaceBuilderLevelId,\r\n} from './workspace-builder.actions';\r\nimport {\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n} from './workspace-builder.model';\r\nimport { WorkspaceBuilderState } from './workspace-builder.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkspaceBuilderFacade {\r\n private readonly store = inject(Store);\r\n\r\n readonly levelId = select(WorkspaceBuilderState.getLevelId);\r\n readonly layout = select(WorkspaceBuilderState.getLayout);\r\n readonly mainItems = select(WorkspaceBuilderState.getMainItems);\r\n readonly moreItems = select(WorkspaceBuilderState.getMoreItems);\r\n readonly validationErrors = select(WorkspaceBuilderState.getValidationErrors);\r\n readonly isDirty = select(WorkspaceBuilderState.getIsDirty);\r\n readonly successMessages = select(WorkspaceBuilderState.getSuccessMessages);\r\n\r\n private readonly loadingActive = select(\r\n WorkspaceBuilderState.getLoadingActive,\r\n );\r\n private readonly errors = select(WorkspaceBuilderState.getErrors);\r\n\r\n readonly isLoadingLayout = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.GetLayout),\r\n );\r\n readonly isSavingLayout = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.SaveLayout),\r\n );\r\n readonly isCreatingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.CreateGroup),\r\n );\r\n readonly isUpdatingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.UpdateGroup),\r\n );\r\n readonly isDeletingGroup = computed(() =>\r\n this.loadingActive().includes(WorkspaceBuilderActionKey.DeleteGroup),\r\n );\r\n\r\n readonly layoutError = computed(\r\n () => this.errors()[WorkspaceBuilderActionKey.GetLayout] ?? null,\r\n );\r\n readonly saveError = computed(\r\n () => this.errors()[WorkspaceBuilderActionKey.SaveLayout] ?? null,\r\n );\r\n\r\n getSuccessMessage(key: WorkspaceBuilderActionKey): string | null {\r\n return this.successMessages()[key] ?? null;\r\n }\r\n\r\n getErrorMessage(key: WorkspaceBuilderActionKey): string | null {\r\n return this.errors()[key] ?? null;\r\n }\r\n\r\n setLevelId(levelId: number) {\r\n return this.store.dispatch(new SetWorkspaceBuilderLevelId(levelId));\r\n }\r\n\r\n getLayout() {\r\n return this.store.dispatch(new GetWorkspaceBuilderLayout());\r\n }\r\n\r\n patchLayout(layout: WorkspaceBuilderLayoutDto) {\r\n return this.store.dispatch(new PatchWorkspaceBuilderLayoutLocally(layout));\r\n }\r\n\r\n saveLayout() {\r\n return this.store.dispatch(new SaveWorkspaceBuilderLayout());\r\n }\r\n\r\n createGroup(title: string, area: WorkspaceArea = 'main', order?: number) {\r\n return this.store.dispatch(\r\n new CreateWorkspaceBuilderGroup(title, area, order),\r\n );\r\n }\r\n\r\n renameGroup(groupId: string, title: string) {\r\n return this.store.dispatch(new RenameWorkspaceBuilderGroup(groupId, title));\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n return this.store.dispatch(new DeleteWorkspaceBuilderGroup(groupId));\r\n }\r\n\r\n resetState() {\r\n return this.store.dispatch(new ResetWorkspaceBuilderState());\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, inject, input, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DynamicDialogConfig, ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { WorkspaceArea } from '../../../store/workspace-builder/workspace-builder.model';\r\n\r\nexport interface CreateWorkspaceGroupDialogResult {\r\n area: WorkspaceArea;\r\n title: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-workspace-builder-create-group-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n InputTextModule,\r\n Button,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './workspace-builder-create-group-dialog.html',\r\n styleUrl: './workspace-builder-create-group-dialog.css',\r\n})\r\nexport class WorkspaceBuilderCreateGroupDialog {\r\n readonly area = input<WorkspaceArea | null>(null);\r\n readonly title = signal('');\r\n\r\n readonly modal = inject(ModalService);\r\n private readonly config = inject(DynamicDialogConfig, { optional: true });\r\n private readonly ref = inject(ModalRef);\r\n\r\n resolvedArea(): WorkspaceArea {\r\n return (\r\n this.area() ??\r\n (this.config?.data?.area as WorkspaceArea | undefined) ??\r\n 'main'\r\n );\r\n }\r\n\r\n submit(): void {\r\n const trimmed = this.title().trim();\r\n if (!trimmed) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n area: this.resolvedArea(),\r\n title: trimmed,\r\n } satisfies CreateWorkspaceGroupDialogResult);\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <div [class]=\"'flex flex-col gap-3 p-4 ' + modal.contentClass\">\r\n <input\r\n pInputText\r\n [(ngModel)]=\"title\"\r\n [placeholder]=\"t('new-group-placeholder')\"\r\n class=\"group-title-input\"\r\n (keydown.enter)=\"submit()\"\r\n />\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n variant=\"outlined\"\r\n [label]=\"t('cancel')\"\r\n (click)=\"cancel()\"\r\n ></mt-button>\r\n\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n [disabled]=\"!title().trim()\"\r\n (click)=\"submit()\"\r\n ></mt-button>\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnDestroy,\r\n signal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { DialogService } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { ContextMenu, ContextMenuModule } from 'primeng/contextmenu';\r\nimport { DragDropModule } from 'primeng/dragdrop';\r\nimport { finalize } from 'rxjs';\r\nimport { WorkspaceBuilderFacade } from '../../store/workspace-builder/workspace-builder.facade';\r\nimport {\r\n WorkspaceArea,\r\n WorkspaceBuilderActionKey,\r\n WorkspaceBuilderLayoutDto,\r\n WorkspaceGroupItem,\r\n WorkspaceGroupModuleItem,\r\n WorkspaceItem,\r\n WorkspaceModuleItem,\r\n} from '../../store/workspace-builder/workspace-builder.model';\r\nimport {\r\n CreateWorkspaceGroupDialogResult,\r\n WorkspaceBuilderCreateGroupDialog,\r\n} from './create-group-dialog/workspace-builder-create-group-dialog';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Icon } from '@masterteam/icons';\r\n\r\ntype DragSource =\r\n | { type: 'area'; area: WorkspaceArea }\r\n | { type: 'group'; area: WorkspaceArea; groupId: string };\r\n\r\ntype DropTarget = DragSource;\r\n\r\ninterface ModuleDragPayload {\r\n kind: 'module';\r\n source: DragSource;\r\n modules: WorkspaceGroupModuleItem[];\r\n}\r\n\r\ninterface GroupDragPayload {\r\n kind: 'group';\r\n source: { type: 'area'; area: WorkspaceArea };\r\n groups: WorkspaceGroupItem[];\r\n}\r\n\r\ntype DragPayload = ModuleDragPayload | GroupDragPayload;\r\nconst DRAG_PAYLOAD_MIME = 'application/x-workspace-builder';\r\n\r\n@Component({\r\n selector: 'mt-workspace-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TranslocoDirective,\r\n DragDropModule,\r\n Button,\r\n Icon,\r\n Page,\r\n Card,\r\n TextField,\r\n ContextMenuModule,\r\n ],\r\n templateUrl: './workspace-builder.html',\r\n styleUrl: './workspace-builder.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [DialogService],\r\n})\r\nexport default class WorkspaceBuilder implements OnDestroy {\n readonly levelId = input<number | null>(null);\n readonly autoSave = input(false);\n readonly areas: WorkspaceArea[] = ['main', 'more'];\n\r\n readonly dropScope = 'workspace-builder-item';\r\n\r\n readonly createGroupArea = signal<WorkspaceArea>('main');\r\n readonly editingGroupId = signal<string | null>(null);\r\n readonly editingGroupTitle = signal('');\r\n readonly isDragging = signal(false);\r\n readonly activeDropSlotKey = signal<string | null>(null);\r\n\r\n private readonly expandedGroups = signal<Record<string, boolean>>({});\r\n private readonly dragPayload = signal<DragPayload | null>(null);\r\n private dragCleanupTimer: ReturnType<typeof setTimeout> | null = null;\r\n private autoSaveInFlight = false;\r\n private autoSaveQueued = false;\r\n private autoSaveQueuedNotifySuccess = false;\r\n\r\n private readonly facade = inject(WorkspaceBuilderFacade);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n ts = inject(ToastService);\r\n private readonly addGroupLabel = toSignal(\r\n this.transloco.selectTranslate('workspace-builder.add-group'),\r\n {\r\n initialValue: this.transloco.translate('workspace-builder.add-group'),\r\n },\r\n );\r\n\r\n readonly layout = this.facade.layout;\r\n readonly validationErrors = this.facade.validationErrors;\r\n readonly isSavingLayout = this.facade.isSavingLayout;\r\n readonly areaContextItems = computed<MenuItem[]>(() => [\r\n {\r\n label: this.addGroupLabel(),\r\n icon: 'pi pi-plus',\r\n command: () => this.openCreateGroupDialog(this.createGroupArea()),\r\n },\r\n ]);\r\n\r\n constructor() {\r\n effect(() => {\r\n const levelId = this.levelId();\r\n if (!levelId) {\r\n return;\r\n }\r\n\r\n this.facade.setLevelId(levelId);\r\n this.facade.getLayout();\r\n });\r\n\r\n effect(() => {\r\n const currentLayout = this.layout();\r\n this.expandedGroups.update((current) => {\r\n const next = { ...current };\r\n const existingGroupIds = new Set<string>();\r\n let changed = false;\r\n\r\n this.getAllGroups(currentLayout).forEach((group) => {\r\n existingGroupIds.add(group.id);\r\n if (next[group.id] === undefined) {\r\n next[group.id] = true;\r\n changed = true;\r\n }\r\n });\r\n\r\n Object.keys(next).forEach((groupId) => {\r\n if (!existingGroupIds.has(groupId)) {\r\n delete next[groupId];\r\n changed = true;\r\n }\r\n });\r\n\r\n return changed ? next : current;\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearDragCleanupTimer();\r\n this.facade.resetState();\r\n }\r\n\r\n areaItems(area: WorkspaceArea): WorkspaceItem[] {\r\n return this.layout()[area];\r\n }\r\n\r\n trackItem(item: WorkspaceItem): string {\r\n return `${item.type}:${item.id}`;\r\n }\r\n\r\n isGroupExpanded(groupId: string): boolean {\r\n return this.expandedGroups()[groupId] ?? true;\r\n }\r\n\r\n toggleGroup(groupId: string): void {\r\n this.expandedGroups.update((groups) => ({\r\n ...groups,\r\n [groupId]: !groups[groupId],\r\n }));\r\n }\r\n\r\n onModuleDragStart(\r\n event: unknown,\r\n module: WorkspaceModuleItem | WorkspaceGroupModuleItem,\r\n source: DragSource,\r\n ): void {\r\n this.stopEventPropagation(event);\r\n this.beginDragSession();\r\n\r\n const payload: ModuleDragPayload = {\r\n kind: 'module',\r\n source,\r\n modules: [\r\n {\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n },\r\n ],\r\n };\r\n\r\n this.dragPayload.set(payload);\r\n this.setDragTransferData(\r\n this.getNativeDragEvent(event),\r\n payload,\r\n module.id,\r\n );\r\n }\r\n\r\n onGroupDragStart(\r\n event: unknown,\r\n group: WorkspaceGroupItem,\r\n area: WorkspaceArea,\r\n ): void {\r\n this.stopEventPropagation(event);\r\n this.beginDragSession();\r\n\r\n const payload: GroupDragPayload = {\r\n kind: 'group',\r\n source: { type: 'area', area },\r\n groups: [group],\r\n };\r\n\r\n this.dragPayload.set(payload);\r\n this.setDragTransferData(this.getNativeDragEvent(event), payload, group.id);\r\n }\r\n\r\n onDragEnd(): void {\r\n this.scheduleDragSessionCleanup();\r\n }\r\n\r\n onDropToArea(\r\n event: unknown,\r\n area: WorkspaceArea,\r\n index: number,\r\n disabled = false,\r\n ): void {\r\n if (disabled) {\r\n this.stopDropEvent(event);\r\n return;\r\n }\r\n\r\n this.stopDropEvent(event);\r\n this.handleDrop({ type: 'area', area }, index, event);\r\n }\r\n\r\n onDropToGroup(\r\n event: unknown,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n disabled = false,\r\n ): void {\r\n if (disabled) {\r\n this.stopDropEvent(event);\r\n return;\r\n }\r\n\r\n this.stopDropEvent(event);\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n allowNativeDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n\r\n onDropSlotDragOver(\r\n event: DragEvent,\r\n slotKey: string,\r\n disabled = false,\r\n ): void {\r\n this.allowNativeDrop(event);\r\n if (disabled) {\r\n if (this.activeDropSlotKey() === slotKey) {\r\n this.activeDropSlotKey.set(null);\r\n }\r\n return;\r\n }\r\n\r\n if (!this.isDragging()) {\r\n return;\r\n }\r\n\r\n if (this.activeDropSlotKey() !== slotKey) {\r\n this.activeDropSlotKey.set(slotKey);\r\n }\r\n }\r\n\r\n onDropSlotDragLeave(event: DragEvent, slotKey: string): void {\r\n if (this.activeDropSlotKey() !== slotKey) {\r\n return;\r\n }\r\n\r\n const currentTarget = event.currentTarget as HTMLElement | null;\r\n const relatedTarget = event.relatedTarget as Node | null;\r\n if (\r\n currentTarget &&\r\n relatedTarget &&\r\n currentTarget.contains(relatedTarget)\r\n ) {\r\n return;\r\n }\r\n\r\n this.activeDropSlotKey.set(null);\r\n }\r\n\r\n areaDropSlotKey(area: WorkspaceArea, index: number): string {\r\n return `area:${area}:${index}`;\r\n }\r\n\r\n groupDropSlotKey(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n ): string {\r\n return `group:${area}:${groupId}:${index}`;\r\n }\r\n\r\n isAreaDropSlotDisabled(area: WorkspaceArea, index: number): boolean {\r\n const payload = this.dragPayload();\r\n if (!payload) return false;\r\n\r\n if (payload.kind === 'group') {\r\n if (payload.source.area !== area) return false;\r\n const list = this.layout()[area];\r\n const movingIds = new Set(payload.groups.map((group) => group.id));\r\n const movingIndexes = list\r\n .map((item, i) =>\r\n item.type === 'group' && movingIds.has(item.id) ? i : -1,\r\n )\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\r\n }\r\n\r\n if (payload.source.type !== 'area' || payload.source.area !== area) {\r\n return false;\r\n }\r\n\r\n const list = this.layout()[area];\r\n const movingIds = new Set(payload.modules.map((module) => module.id));\r\n const movingIndexes = list\r\n .map((item, i) =>\r\n item.type === 'module' && movingIds.has(item.id) ? i : -1,\r\n )\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\r\n }\r\n\r\n isGroupDropSlotDisabled(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n index: number,\r\n ): boolean {\r\n const payload = this.dragPayload();\r\n if (!payload || payload.kind !== 'module') return false;\r\n if (payload.source.type !== 'group') return false;\r\n if (payload.source.area !== area || payload.source.groupId !== groupId) {\r\n return false;\r\n }\r\n\r\n const group = this.findGroup(this.layout(), area, groupId);\r\n if (!group) return false;\r\n\r\n const movingIds = new Set(payload.modules.map((module) => module.id));\r\n const movingIndexes = group.modules\r\n .map((module, i) => (movingIds.has(module.id) ? i : -1))\r\n .filter((i) => i >= 0);\r\n if (movingIndexes.length !== 1) return false;\r\n\r\n const sourceIndex = movingIndexes[0];\r\n return index === sourceIndex || index === sourceIndex + 1;\r\n }\r\n\r\n onNativeAreaDrop(event: DragEvent, area: WorkspaceArea): void {\r\n this.stopDropEvent(event);\r\n const index = this.resolveAreaDropIndex(event, area);\r\n this.handleDrop({ type: 'area', area }, index, event);\r\n }\r\n\r\n onNativeGroupDrop(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n ): void {\r\n this.stopDropEvent(event);\r\n const group = this.findGroup(this.layout(), area, groupId);\r\n const index = group?.modules.length ?? 0;\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n onNativeGroupModuleDrop(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n moduleIndex: number,\r\n ): void {\r\n this.stopDropEvent(event);\r\n const index = this.resolveSiblingDropIndex(event, moduleIndex);\r\n this.handleDrop({ type: 'group', area, groupId }, index, event);\r\n }\r\n\r\n onAreaContextMenu(\r\n event: MouseEvent,\r\n area: WorkspaceArea,\r\n contextMenu: ContextMenu,\r\n ): void {\r\n event.preventDefault();\r\n this.createGroupArea.set(area);\r\n contextMenu.show(event);\r\n }\r\n\r\n openCreateGroupDialog(area: WorkspaceArea): void {\r\n const ref = this.modal.openModal(\r\n WorkspaceBuilderCreateGroupDialog,\r\n 'dialog',\r\n {\r\n header: this.transloco.translate('workspace-builder.create-group'),\r\n styleClass: '!w-[28rem]',\r\n height: 'auto',\r\n appendTo: 'body',\r\n dismissableMask: true,\r\n data: { area },\r\n inputValues: { area },\r\n },\r\n );\r\n\r\n ref.onClose.subscribe(\r\n (result: CreateWorkspaceGroupDialogResult | null | undefined) => {\r\n const title = result?.title?.trim();\r\n if (!title) {\r\n return;\r\n }\r\n\r\n const order = this.layout()[area].length + 1;\r\n this.facade.createGroup(title, area, order).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.CreateGroup,\r\n 'workspace-builder.group-create-success',\r\n ),\r\n );\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.CreateGroup,\r\n 'workspace-builder.group-create-error',\r\n ),\r\n );\r\n },\r\n });\r\n },\r\n );\r\n }\r\n\r\n startRenameGroup(group: WorkspaceGroupItem): void {\r\n this.editingGroupId.set(group.id);\r\n this.editingGroupTitle.set(group.name);\r\n }\r\n\r\n saveRenameGroup(groupId: string): void {\r\n const title = this.editingGroupTitle().trim();\r\n if (!title) {\r\n return;\r\n }\r\n\r\n this.facade.renameGroup(groupId, title).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.UpdateGroup,\r\n 'workspace-builder.group-update-success',\r\n ),\r\n );\r\n this.cancelRenameGroup();\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.UpdateGroup,\r\n 'workspace-builder.group-update-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n cancelRenameGroup(): void {\r\n this.editingGroupId.set(null);\r\n this.editingGroupTitle.set('');\r\n }\r\n\r\n onSaveClick(): void {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n }\r\n\r\n deleteGroup(groupId: string, event?: Event): void {\r\n if (!event) {\r\n return;\r\n }\r\n\r\n this.confirmationService.confirmDelete({\r\n event: event,\r\n type: 'popup',\r\n accept: () => this.executeDeleteGroup(groupId),\r\n reject: () => {},\r\n });\r\n }\r\n\r\n private executeDeleteGroup(groupId: string): void {\r\n this.facade.deleteGroup(groupId).subscribe({\r\n next: () => {\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.DeleteGroup,\r\n 'workspace-builder.group-delete-success',\r\n ),\r\n );\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.DeleteGroup,\r\n 'workspace-builder.group-delete-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n removeModuleFromGroup(\r\n area: WorkspaceArea,\r\n groupId: string,\r\n moduleId: string,\r\n ): void {\r\n const nextLayout = this.cloneLayout(this.layout());\r\n const group = this.findGroup(nextLayout, area, groupId);\r\n if (!group) {\r\n return;\r\n }\r\n\r\n const moduleIndex = group.modules.findIndex(\r\n (module) => module.id === moduleId,\r\n );\r\n if (moduleIndex === -1) {\r\n return;\r\n }\r\n\r\n const [module] = group.modules.splice(moduleIndex, 1);\r\n\r\n const areaItems = nextLayout[area];\r\n const groupIndex = areaItems.findIndex(\r\n (item) => item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n if (groupIndex === -1) {\r\n return;\r\n }\r\n\r\n areaItems.splice(groupIndex + 1, 0, {\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n });\r\n\r\n this.patchLayout(nextLayout);\r\n }\r\n\r\n private handleDrop(\r\n target: DropTarget,\r\n targetIndex: number,\r\n event?: unknown,\r\n ): void {\r\n const payload = this.resolveDropPayload(event);\r\n if (!payload) {\r\n return;\r\n }\r\n\r\n if (payload.kind === 'group' && target.type === 'group') {\r\n // Prevent nested groups.\r\n this.endDragSession();\r\n return;\r\n }\r\n\r\n const nextLayout = this.cloneLayout(this.layout());\r\n\r\n if (payload.kind === 'group') {\r\n this.moveGroups(nextLayout, payload, target, targetIndex);\r\n } else {\r\n this.moveModules(nextLayout, payload, target, targetIndex);\r\n }\r\n\r\n this.patchLayout(nextLayout);\r\n this.endDragSession();\r\n }\r\n\r\n private patchLayout(layout: WorkspaceBuilderLayoutDto): void {\n this.facade.patchLayout(layout).subscribe({\n next: () => {\n if (this.autoSave()) {\n this.triggerAutoSave();\n }\n },\n });\n }\n\r\n private triggerAutoSave(options?: { notifyOnSuccess?: boolean }): void {\r\n const notifyOnSuccess = options?.notifyOnSuccess ?? false;\r\n\r\n if (this.validationErrors().length > 0) {\r\n return;\r\n }\r\n\r\n if (this.autoSaveInFlight) {\r\n this.autoSaveQueued = true;\r\n this.autoSaveQueuedNotifySuccess =\r\n this.autoSaveQueuedNotifySuccess || notifyOnSuccess;\r\n return;\r\n }\r\n\r\n this.autoSaveInFlight = true;\r\n this.facade\r\n .saveLayout()\r\n .pipe(\r\n finalize(() => {\r\n this.autoSaveInFlight = false;\r\n if (this.autoSaveQueued) {\r\n const queuedNotifyOnSuccess = this.autoSaveQueuedNotifySuccess;\r\n this.autoSaveQueued = false;\r\n this.autoSaveQueuedNotifySuccess = false;\r\n this.triggerAutoSave({ notifyOnSuccess: queuedNotifyOnSuccess });\r\n }\r\n }),\r\n )\r\n .subscribe({\r\n next: () => {\r\n if (notifyOnSuccess) {\r\n this.ts.success(\r\n this.getSuccessMessage(\r\n WorkspaceBuilderActionKey.SaveLayout,\r\n 'workspace-builder.layout-update-success',\r\n ),\r\n );\r\n }\r\n },\r\n error: () => {\r\n this.ts.error(\r\n this.getErrorMessage(\r\n WorkspaceBuilderActionKey.SaveLayout,\r\n 'workspace-builder.layout-update-error',\r\n ),\r\n );\r\n },\r\n });\r\n }\r\n\r\n private resolveDropPayload(event?: unknown): DragPayload | null {\r\n const fromTransfer = this.getDropPayloadFromTransfer(event);\r\n if (fromTransfer) {\r\n return fromTransfer;\r\n }\r\n\r\n return this.dragPayload();\r\n }\r\n\r\n private getDropPayloadFromTransfer(event?: unknown): DragPayload | null {\r\n const transfer = this.getNativeDragEvent(event)?.dataTransfer;\r\n const raw = transfer?.getData?.(DRAG_PAYLOAD_MIME);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(raw) as DragPayload;\r\n if (parsed?.kind === 'module' || parsed?.kind === 'group') {\r\n return parsed;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private setDragTransferData(\r\n event: DragEvent | null,\r\n payload: DragPayload,\r\n plainTextFallback: string,\r\n ): void {\r\n const transfer = event?.dataTransfer;\r\n if (!transfer) {\r\n return;\r\n }\r\n\r\n transfer.effectAllowed = 'move';\r\n transfer.setData(DRAG_PAYLOAD_MIME, JSON.stringify(payload));\r\n transfer.setData('text/plain', plainTextFallback);\r\n }\r\n\r\n private beginDragSession(): void {\r\n this.isDragging.set(true);\r\n this.activeDropSlotKey.set(null);\r\n this.clearDragCleanupTimer();\r\n }\r\n\r\n private endDragSession(): void {\r\n this.isDragging.set(false);\r\n this.activeDropSlotKey.set(null);\r\n this.dragPayload.set(null);\r\n this.clearDragCleanupTimer();\r\n }\r\n\r\n private scheduleDragSessionCleanup(): void {\r\n this.isDragging.set(false);\r\n this.activeDropSlotKey.set(null);\r\n this.clearDragCleanupTimer();\r\n this.dragCleanupTimer = setTimeout(() => {\r\n this.dragPayload.set(null);\r\n this.dragCleanupTimer = null;\r\n }, 180);\r\n }\r\n\r\n private clearDragCleanupTimer(): void {\r\n if (!this.dragCleanupTimer) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.dragCleanupTimer);\r\n this.dragCleanupTimer = null;\r\n }\r\n\r\n private stopDropEvent(event: unknown): void {\r\n const nativeEvent = this.unwrapEvent(event);\r\n nativeEvent?.preventDefault?.();\r\n nativeEvent?.stopPropagation?.();\r\n (event as any)?.preventDefault?.();\r\n (event as any)?.stopPropagation?.();\r\n }\r\n\r\n private stopEventPropagation(event: unknown): void {\r\n this.unwrapEvent(event)?.stopPropagation?.();\r\n (event as any)?.stopPropagation?.();\r\n }\r\n\r\n private getNativeDragEvent(event: unknown): DragEvent | null {\r\n const nativeEvent = this.unwrapEvent(event);\r\n if (!nativeEvent || !('dataTransfer' in nativeEvent)) {\r\n return null;\r\n }\r\n\r\n return nativeEvent as DragEvent;\r\n }\r\n\r\n private unwrapEvent(event: unknown): Event | null {\r\n if (!event) {\r\n return null;\r\n }\r\n\r\n const candidate = (event as any)?.originalEvent ?? (event as any)?.event;\r\n return (candidate ?? (event as Event)) as Event;\r\n }\r\n\r\n private resolveAreaDropIndex(event: DragEvent, area: WorkspaceArea): number {\r\n const y = event.clientY;\r\n const items = this.layout()[area];\r\n\r\n for (let index = 0; index < items.length; index += 1) {\r\n const element = this.getTopLevelItemElement(event, area, index);\r\n if (!element) {\r\n continue;\r\n }\r\n\r\n const rect = element.getBoundingClientRect();\r\n if (y < rect.top + rect.height / 2) {\r\n return index;\r\n }\r\n }\r\n\r\n return items.length;\r\n }\r\n\r\n private resolveSiblingDropIndex(event: DragEvent, itemIndex: number): number {\r\n const target = event.currentTarget as HTMLElement | null;\r\n if (!target) {\r\n return itemIndex;\r\n }\r\n\r\n const rect = target.getBoundingClientRect();\r\n const shouldInsertAfter = event.clientY >= rect.top + rect.height / 2;\r\n return shouldInsertAfter ? itemIndex + 1 : itemIndex;\r\n }\r\n\r\n private getTopLevelItemElement(\r\n event: DragEvent,\r\n area: WorkspaceArea,\r\n itemIndex: number,\r\n ): HTMLElement | null {\r\n const root = (event.currentTarget as HTMLElement | null) ?? null;\r\n if (!root) {\r\n return null;\r\n }\r\n\r\n const selector =\r\n area === 'main'\r\n ? `[data-area=\"main\"][data-item-index=\"${itemIndex}\"]`\r\n : `[data-area=\"more\"][data-item-index=\"${itemIndex}\"]`;\r\n return root.querySelector(selector);\r\n }\r\n\r\n private moveGroups(\r\n layout: WorkspaceBuilderLayoutDto,\r\n payload: GroupDragPayload,\r\n target: DropTarget,\r\n targetIndex: number,\r\n ): void {\r\n if (target.type !== 'area') {\r\n return;\r\n }\r\n\r\n const sourceArea = payload.source.area;\r\n const targetArea = target.area;\r\n const groupIds = new Set(payload.groups.map((group) => group.id));\r\n\r\n if (sourceArea === targetArea) {\r\n const original = layout[sourceArea];\r\n const moving = original.filter(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && groupIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter(\r\n (item) => item.type === 'group' && groupIds.has(item.id),\r\n ).length;\r\n\r\n const remaining = original.filter(\r\n (item) => !(item.type === 'group' && groupIds.has(item.id)),\r\n );\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n layout[sourceArea] = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n const sourceList = layout[sourceArea];\r\n const moving = sourceList.filter(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && groupIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n layout[sourceArea] = sourceList.filter(\r\n (item) => !(item.type === 'group' && groupIds.has(item.id)),\r\n );\r\n\r\n const targetList = layout[targetArea];\r\n const insertIndex = this.clampIndex(targetIndex, targetList.length);\r\n targetList.splice(insertIndex, 0, ...moving);\r\n }\r\n\r\n private moveModules(\r\n layout: WorkspaceBuilderLayoutDto,\r\n payload: ModuleDragPayload,\r\n target: DropTarget,\r\n targetIndex: number,\r\n ): void {\r\n const moduleIds = new Set(payload.modules.map((module) => module.id));\r\n\r\n if (\r\n payload.source.type === 'area' &&\r\n target.type === 'area' &&\r\n payload.source.area === target.area\r\n ) {\r\n const area = payload.source.area;\r\n const original = layout[area];\r\n const moving = original.filter(\r\n (item): item is WorkspaceModuleItem =>\r\n item.type === 'module' && moduleIds.has(item.id),\r\n );\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter(\r\n (item) => item.type === 'module' && moduleIds.has(item.id),\r\n ).length;\r\n\r\n const remaining = original.filter(\r\n (item) => !(item.type === 'module' && moduleIds.has(item.id)),\r\n );\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n layout[area] = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n if (\r\n payload.source.type === 'group' &&\r\n target.type === 'group' &&\r\n payload.source.area === target.area &&\r\n payload.source.groupId === target.groupId\r\n ) {\r\n const group = this.findGroup(layout, target.area, target.groupId);\r\n if (!group) {\r\n return;\r\n }\r\n\r\n const original = group.modules;\r\n const moving = original.filter((module) => moduleIds.has(module.id));\r\n\r\n if (moving.length === 0) {\r\n return;\r\n }\r\n\r\n const removedBefore = original\r\n .slice(0, targetIndex)\r\n .filter((module) => moduleIds.has(module.id)).length;\r\n\r\n const remaining = original.filter((module) => !moduleIds.has(module.id));\r\n const insertIndex = this.clampIndex(\r\n targetIndex - removedBefore,\r\n remaining.length,\r\n );\r\n\r\n group.modules = [\r\n ...remaining.slice(0, insertIndex),\r\n ...moving,\r\n ...remaining.slice(insertIndex),\r\n ];\r\n\r\n return;\r\n }\r\n\r\n const extracted = this.extractModulesFromSource(\r\n layout,\r\n payload.source,\r\n moduleIds,\r\n );\r\n if (extracted.length === 0) {\r\n return;\r\n }\r\n\r\n if (target.type === 'area') {\r\n const areaList = layout[target.area];\r\n const insertIndex = this.clampIndex(targetIndex, areaList.length);\r\n const topLevelModules: WorkspaceModuleItem[] = extracted.map(\r\n (module) => ({\r\n type: 'module',\r\n id: module.id,\r\n name: module.name,\r\n order: 0,\r\n }),\r\n );\r\n\r\n areaList.splice(insertIndex, 0, ...topLevelModules);\r\n return;\r\n }\r\n\r\n const targetGroup = this.findGroup(layout, target.area, target.groupId);\r\n if (!targetGroup) {\r\n return;\r\n }\r\n\r\n const insertIndex = this.clampIndex(\r\n targetIndex,\r\n targetGroup.modules.length,\r\n );\r\n targetGroup.modules.splice(insertIndex, 0, ...extracted);\r\n }\r\n\r\n private extractModulesFromSource(\r\n layout: WorkspaceBuilderLayoutDto,\r\n source: DragSource,\r\n moduleIds: Set<string>,\r\n ): WorkspaceGroupModuleItem[] {\r\n if (source.type === 'area') {\r\n const areaList = layout[source.area];\r\n const moving = areaList\r\n .filter(\r\n (item): item is WorkspaceModuleItem =>\r\n item.type === 'module' && moduleIds.has(item.id),\r\n )\r\n .map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n }));\r\n\r\n layout[source.area] = areaList.filter(\r\n (item) => !(item.type === 'module' && moduleIds.has(item.id)),\r\n );\r\n\r\n return moving;\r\n }\r\n\r\n const group = this.findGroup(layout, source.area, source.groupId);\r\n if (!group) {\r\n return [];\r\n }\r\n\r\n const moving = group.modules.filter((module) => moduleIds.has(module.id));\r\n group.modules = group.modules.filter((module) => !moduleIds.has(module.id));\r\n\r\n return moving;\r\n }\r\n\r\n private findGroup(\r\n layout: WorkspaceBuilderLayoutDto,\r\n area: WorkspaceArea,\r\n groupId: string,\r\n ): WorkspaceGroupItem | null {\r\n const found = layout[area].find(\r\n (item): item is WorkspaceGroupItem =>\r\n item.type === 'group' && item.id === groupId,\r\n );\r\n\r\n return found ?? null;\r\n }\r\n\r\n private clampIndex(index: number, length: number): number {\r\n return Math.max(0, Math.min(index, length));\r\n }\r\n\r\n private getAllGroups(\r\n layout: WorkspaceBuilderLayoutDto,\r\n ): WorkspaceGroupItem[] {\r\n return [...layout.main, ...layout.more].filter(\r\n (item): item is WorkspaceGroupItem => item.type === 'group',\r\n );\r\n }\r\n\r\n private cloneLayout(\r\n layout: WorkspaceBuilderLayoutDto,\r\n ): WorkspaceBuilderLayoutDto {\r\n return {\r\n levelId: layout.levelId,\r\n main: layout.main.map((item) => this.cloneItem(item)),\r\n more: layout.more.map((item) => this.cloneItem(item)),\r\n };\r\n }\r\n\r\n private cloneItem(item: WorkspaceItem): WorkspaceItem {\r\n if (item.type === 'group') {\r\n return {\r\n type: 'group',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n modules: item.modules.map((module) => ({\r\n id: module.id,\r\n name: module.name,\r\n order: module.order,\r\n })),\r\n };\r\n }\r\n\r\n return {\r\n type: 'module',\r\n id: item.id,\r\n name: item.name,\r\n order: item.order,\r\n };\r\n }\r\n\r\n private getSuccessMessage(\r\n key: WorkspaceBuilderActionKey,\r\n fallbackTranslationKey: string,\r\n ): string {\r\n const apiMessage = this.facade.getSuccessMessage(key)?.trim();\r\n if (apiMessage) {\r\n return apiMessage;\r\n }\r\n\r\n return this.transloco.translate(fallbackTranslationKey);\r\n }\r\n\r\n private getErrorMessage(\r\n key: WorkspaceBuilderActionKey,\r\n fallbackTranslationKey: string,\r\n ): string {\r\n const apiMessage = this.facade.getErrorMessage(key)?.trim();\r\n if (apiMessage) {\r\n return apiMessage;\r\n }\r\n\r\n return this.transloco.translate(fallbackTranslationKey);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'workspace-builder'\">\r\n <p-contextMenu\r\n #areaContextMenu\r\n [model]=\"areaContextItems()\"\r\n appendTo=\"body\"\r\n />\r\n\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\n <ng-template #headerEnd>\n @if (!autoSave()) {\n <div class=\"flex items-center\">\n <mt-button\n [label]=\"t('save')\"\n icon=\"general.save-02\"\n severity=\"primary\"\n variant=\"outlined\"\n size=\"small\"\n [loading]=\"isSavingLayout()\"\n [disabled]=\"isSavingLayout() || validationErrors().length > 0\"\n (onClick)=\"onSaveClick()\"\n />\n </div>\n }\n </ng-template>\n\r\n <div class=\"grid gap-4\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-300 bg-red-50 p-3 text-red-700\"\r\n >\r\n <div class=\"mb-2 font-semibold\">{{ t(\"validation-title\") }}</div>\r\n <ul class=\"m-0 list-disc ps-4\">\r\n @for (error of validationErrors(); track error) {\r\n <li>{{ error }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <div class=\"workspace-areas-grid grid gap-4\">\r\n @for (area of areas; track area) {\r\n <mt-card\r\n [title]=\"t(area)\"\r\n [paddingless]=\"true\"\r\n class=\"min-h-[24rem] overflow-hidden\"\r\n (contextmenu)=\"onAreaContextMenu($event, area, areaContextMenu)\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n >\r\n <ng-template #cardEnd>\r\n <mt-button\r\n [label]=\"t('add-group')\"\r\n icon=\"general.plus\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"openCreateGroupDialog(area)\"\r\n />\r\n </ng-template>\r\n\r\n <div\r\n class=\"workspace-area-body grid min-h-full content-start gap-2 p-3\"\r\n [class.drag-active]=\"isDragging()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeAreaDrop($event, area)\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, areaItems(area).length)\"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"isAreaDropSlotDisabled(area, 0)\"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, 0),\r\n isAreaDropSlotDisabled(area, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, 0))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea($event, area, 0, isAreaDropSlotDisabled(area, 0))\r\n \"\r\n ></div>\r\n\r\n @for (\r\n item of areaItems(area);\r\n track trackItem(item);\r\n let i = $index\r\n ) {\r\n @if (item.type === \"module\") {\r\n <div\r\n class=\"workspace-draggable-item flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, item, {\r\n type: 'area',\r\n area: area,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <span class=\"drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.name }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.group-drag-handle'\"\r\n (onDragStart)=\"onGroupDragStart($event, item, area)\"\r\n (onDragEnd)=\"onDragEnd()\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"onNativeGroupDrop($event, area, item.id)\"\r\n >\r\n <div\r\n class=\"group-header flex items-center gap-2 rounded-md px-1 py-0.5\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <mt-button\r\n class=\"expand-btn\"\r\n [icon]=\"\r\n isGroupExpanded(item.id)\r\n ? 'arrow.chevron-up'\r\n : 'arrow.chevron-down'\r\n \"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span class=\"group-drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n\r\n @if (editingGroupId() === item.id) {\r\n <mt-text-field\r\n [(ngModel)]=\"editingGroupTitle\"\r\n class=\"min-w-[12rem] flex-1\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n severity=\"success\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"saveRenameGroup(item.id)\"\r\n />\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"cancelRenameGroup()\"\r\n />\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n item.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"startRenameGroup(item)\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [tooltip]=\"t('delete-group')\"\r\n severity=\"danger\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"deleteGroup(item.id, $event)\"\r\n />\r\n </div>\r\n\r\n @if (isGroupExpanded(item.id)) {\r\n <div\r\n class=\"group-modules grid gap-2 border-t border-dashed border-surface-300 pt-2\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n item.modules.length\r\n )\r\n \"\r\n >\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, 0)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0),\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, 0)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n 0,\r\n isGroupDropSlotDisabled(area, item.id, 0)\r\n )\r\n \"\r\n ></div>\r\n\r\n @for (\r\n module of item.modules;\r\n track module.id;\r\n let j = $index\r\n ) {\r\n <div\r\n class=\"workspace-draggable-item workspace-group-module-item flex min-h-10 items-center gap-2 rounded-lg border border-surface-300 bg-surface-0 px-2.5 py-2 ms-2\"\r\n [pDraggable]=\"dropScope\"\r\n [dragHandle]=\"'.drag-handle'\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop($event, area, item.id, j)\r\n \"\r\n (onDragStart)=\"\r\n onModuleDragStart($event, module, {\r\n type: 'group',\r\n area: area,\r\n groupId: item.id,\r\n })\r\n \"\r\n (onDragEnd)=\"onDragEnd()\"\r\n >\r\n <span class=\"drag-handle\" draggable=\"false\">\r\n <mt-icon\r\n class=\"pointer-events-none text-base\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"warn\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(area, item.id, module.id)\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() ===\r\n groupDropSlotKey(area, item.id, j + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1),\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave(\r\n $event,\r\n groupDropSlotKey(area, item.id, j + 1)\r\n )\r\n \"\r\n (onDrop)=\"\r\n onDropToGroup(\r\n $event,\r\n area,\r\n item.id,\r\n j + 1,\r\n isGroupDropSlotDisabled(area, item.id, j + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"drop-slot\"\r\n [class.drop-slot-active]=\"\r\n activeDropSlotKey() === areaDropSlotKey(area, i + 1)\r\n \"\r\n [class.drop-slot-disabled]=\"\r\n isAreaDropSlotDisabled(area, i + 1)\r\n \"\r\n [pDroppable]=\"dropScope\"\r\n (dragover)=\"\r\n onDropSlotDragOver(\r\n $event,\r\n areaDropSlotKey(area, i + 1),\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n (dragleave)=\"\r\n onDropSlotDragLeave($event, areaDropSlotKey(area, i + 1))\r\n \"\r\n (onDrop)=\"\r\n onDropToArea(\r\n $event,\r\n area,\r\n i + 1,\r\n isAreaDropSlotDisabled(area, i + 1)\r\n )\r\n \"\r\n ></div>\r\n }\r\n\r\n @if (areaItems(area).length === 0) {\r\n <div\r\n class=\"empty-area rounded-lg border border-dashed border-surface-300 p-4 text-center text-surface-500\"\r\n [pDroppable]=\"dropScope\"\r\n (onDrop)=\"onDropToArea($event, area, 0)\"\r\n >\r\n {{ t(\"empty-area\") }}\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masterteam/workspace-builder",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "publishConfig": {
5
5
  "directory": "../../../dist/masterteam/workspace-builder",
6
6
  "linkDirectory": false,
@@ -20,7 +20,7 @@
20
20
  "tailwindcss": "^4.1.17",
21
21
  "tailwindcss-primeui": "^0.6.1",
22
22
  "@ngxs/store": "^20.1.0",
23
- "@masterteam/components": "^0.0.92"
23
+ "@masterteam/components": "^0.0.95"
24
24
  },
25
25
  "sideEffects": false,
26
26
  "exports": {
@@ -92,14 +92,17 @@ type DragSource = {
92
92
  };
93
93
  declare class WorkspaceBuilder implements OnDestroy {
94
94
  readonly levelId: _angular_core.InputSignal<number | null>;
95
+ readonly autoSave: _angular_core.InputSignal<boolean>;
95
96
  readonly areas: WorkspaceArea[];
96
97
  readonly dropScope = "workspace-builder-item";
97
98
  readonly createGroupArea: _angular_core.WritableSignal<WorkspaceArea>;
98
99
  readonly editingGroupId: _angular_core.WritableSignal<string | null>;
99
100
  readonly editingGroupTitle: _angular_core.WritableSignal<string>;
100
- readonly autoSaveEnabled: _angular_core.WritableSignal<boolean>;
101
+ readonly isDragging: _angular_core.WritableSignal<boolean>;
102
+ readonly activeDropSlotKey: _angular_core.WritableSignal<string | null>;
101
103
  private readonly expandedGroups;
102
104
  private readonly dragPayload;
105
+ private dragCleanupTimer;
103
106
  private autoSaveInFlight;
104
107
  private autoSaveQueued;
105
108
  private autoSaveQueuedNotifySuccess;
@@ -122,9 +125,15 @@ declare class WorkspaceBuilder implements OnDestroy {
122
125
  onModuleDragStart(event: unknown, module: WorkspaceModuleItem | WorkspaceGroupModuleItem, source: DragSource): void;
123
126
  onGroupDragStart(event: unknown, group: WorkspaceGroupItem, area: WorkspaceArea): void;
124
127
  onDragEnd(): void;
125
- onDropToArea(event: unknown, area: WorkspaceArea, index: number): void;
126
- onDropToGroup(event: unknown, area: WorkspaceArea, groupId: string, index: number): void;
128
+ onDropToArea(event: unknown, area: WorkspaceArea, index: number, disabled?: boolean): void;
129
+ onDropToGroup(event: unknown, area: WorkspaceArea, groupId: string, index: number, disabled?: boolean): void;
127
130
  allowNativeDrop(event: DragEvent): void;
131
+ onDropSlotDragOver(event: DragEvent, slotKey: string, disabled?: boolean): void;
132
+ onDropSlotDragLeave(event: DragEvent, slotKey: string): void;
133
+ areaDropSlotKey(area: WorkspaceArea, index: number): string;
134
+ groupDropSlotKey(area: WorkspaceArea, groupId: string, index: number): string;
135
+ isAreaDropSlotDisabled(area: WorkspaceArea, index: number): boolean;
136
+ isGroupDropSlotDisabled(area: WorkspaceArea, groupId: string, index: number): boolean;
128
137
  onNativeAreaDrop(event: DragEvent, area: WorkspaceArea): void;
129
138
  onNativeGroupDrop(event: DragEvent, area: WorkspaceArea, groupId: string): void;
130
139
  onNativeGroupModuleDrop(event: DragEvent, area: WorkspaceArea, groupId: string, moduleIndex: number): void;
@@ -134,16 +143,19 @@ declare class WorkspaceBuilder implements OnDestroy {
134
143
  saveRenameGroup(groupId: string): void;
135
144
  cancelRenameGroup(): void;
136
145
  onSaveClick(): void;
137
- onAutoSaveToggleChange(value: boolean | null): void;
138
146
  deleteGroup(groupId: string, event?: Event): void;
139
147
  private executeDeleteGroup;
140
148
  removeModuleFromGroup(area: WorkspaceArea, groupId: string, moduleId: string): void;
141
149
  private handleDrop;
142
- private patchLayoutAndAutoSave;
150
+ private patchLayout;
143
151
  private triggerAutoSave;
144
152
  private resolveDropPayload;
145
153
  private getDropPayloadFromTransfer;
146
154
  private setDragTransferData;
155
+ private beginDragSession;
156
+ private endDragSession;
157
+ private scheduleDragSessionCleanup;
158
+ private clearDragCleanupTimer;
147
159
  private stopDropEvent;
148
160
  private stopEventPropagation;
149
161
  private getNativeDragEvent;
@@ -162,7 +174,7 @@ declare class WorkspaceBuilder implements OnDestroy {
162
174
  private getSuccessMessage;
163
175
  private getErrorMessage;
164
176
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WorkspaceBuilder, never>;
165
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WorkspaceBuilder, "mt-workspace-builder", never, { "levelId": { "alias": "levelId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
177
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WorkspaceBuilder, "mt-workspace-builder", never, { "levelId": { "alias": "levelId"; "required": false; "isSignal": true; }; "autoSave": { "alias": "autoSave"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
166
178
  }
167
179
 
168
180
  declare class SetWorkspaceBuilderLevelId {