@masterteam/workspace-builder 0.0.5 → 0.0.7

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.
@@ -9,10 +9,15 @@
9
9
  "new-group-placeholder": "عنوان المجموعة",
10
10
  "add-group": "إضافة مجموعة",
11
11
  "save": "حفظ",
12
+ "retry": "إعادة المحاولة",
12
13
  "auto-save": "حفظ تلقائي",
13
14
  "save-success": "تم حفظ تخطيط مساحة العمل",
14
15
  "layout-update-success": "تم تحديث تخطيط مساحة العمل بنجاح",
15
16
  "layout-update-error": "فشل تحديث تخطيط مساحة العمل",
17
+ "loading-title": "جار تحميل تخطيط مساحة العمل",
18
+ "loading-description": "يتم جلب الوحدات والمجموعات لهذا المستوى.",
19
+ "load-error-title": "تعذر تحميل تخطيط مساحة العمل",
20
+ "load-error-description": "حاول مرة أخرى لإعادة تحميل تخطيط مساحة العمل.",
16
21
  "empty-area": "أسقط الوحدات أو المجموعات هنا",
17
22
  "remove": "إزالة",
18
23
  "group-modules": "وحدات المجموعة",
@@ -9,10 +9,15 @@
9
9
  "new-group-placeholder": "Group title",
10
10
  "add-group": "Add Group",
11
11
  "save": "Save",
12
+ "retry": "Retry",
12
13
  "auto-save": "Auto Save",
13
14
  "save-success": "Workspace layout saved",
14
15
  "layout-update-success": "Workspace layout updated successfully",
15
16
  "layout-update-error": "Failed to update workspace layout",
17
+ "loading-title": "Loading workspace layout",
18
+ "loading-description": "Fetching modules and groups for this level.",
19
+ "load-error-title": "Couldn't load workspace layout",
20
+ "load-error-description": "Try again to reload the workspace layout.",
16
21
  "empty-area": "Drop modules or groups here",
17
22
  "remove": "Remove",
18
23
  "group-modules": "Group Modules",
@@ -1,2 +1,2 @@
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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--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)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.flex{display:flex}.grid{display:grid}.h-full{height:100%}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[24rem\]{min-height:24rem}.min-h-full{min-height:100%}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[12rem\]{min-width:12rem}.flex-1{flex:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.content-start{align-content:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.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}.overflow-y-auto{overflow-y:auto}.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)}.p-5{padding:calc(var(--spacing) * 5)}.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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
1
+ /*! tailwindcss v4.2.2 | 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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@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-200:oklch(88.5% .062 18.334);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--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)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.ms-3{margin-inline-start:calc(var(--spacing) * 3)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.flex{display:flex}.grid{display:grid}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-\[26rem\]{min-height:26rem}.min-h-full{min-height:100%}.\!w-\[28rem\]{width:28rem!important}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[12rem\]{min-width:12rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-grab{cursor:grab}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-red-200{border-color:var(--color-red-200)}.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)}}.bg-surface-0\/80{background-color:var(--p-surface-0)}@supports (color:color-mix(in lab, red, red)){.bg-surface-0\/80{background-color:color-mix(in oklab, color-mix(in srgb, var(--p-surface-0) calc(100% * 1), transparent) 80%, transparent)}}.bg-surface-50\/60{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50\/60{background-color:color-mix(in oklab, color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent) 60%, transparent)}}.bg-surface-50\/80{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50\/80{background-color:color-mix(in oklab, color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent) 80%, transparent)}}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-primary{color:var(--p-primary-color)}@supports (color:color-mix(in lab, red, red)){.text-primary{color:color-mix(in srgb, var(--p-primary-color) calc(100% * 1), transparent)}}.text-red-600{color:var(--color-red-600)}.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)}}.text-surface-600{color:var(--p-surface-600)}@supports (color:color-mix(in lab, red, red)){.text-surface-600{color:color-mix(in srgb, var(--p-surface-600) calc(100% * 1), transparent)}}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}@media (hover:hover){.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-surface-300:hover{border-color:var(--p-surface-300)}@supports (color:color-mix(in lab, red, red)){.hover\:border-surface-300:hover{border-color:color-mix(in srgb, var(--p-surface-300) calc(100% * 1), transparent)}}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.active\:cursor-grabbing:active{cursor:grabbing}@media (min-width:80rem){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
@@ -18,6 +18,8 @@ import * as i4 from 'primeng/contextmenu';
18
18
  import { ContextMenuModule } from 'primeng/contextmenu';
19
19
  import * as i3$1 from 'primeng/dragdrop';
20
20
  import { DragDropModule } from 'primeng/dragdrop';
21
+ import * as i5 from 'primeng/skeleton';
22
+ import { SkeletonModule } from 'primeng/skeleton';
21
23
  import { finalize } from 'rxjs';
22
24
  import { Action, Selector, State, Store, select } from '@ngxs/store';
23
25
  import { HttpClient } from '@angular/common/http';
@@ -703,6 +705,7 @@ class WorkspaceBuilder {
703
705
  autoSave = input(true, { ...(ngDevMode ? { debugName: "autoSave" } : {}), transform: booleanAttribute });
704
706
  areas = ['main', 'more'];
705
707
  dropScope = 'workspace-builder-item';
708
+ loadingSkeletonRows = [0, 1, 2, 3];
706
709
  createGroupArea = signal('main', ...(ngDevMode ? [{ debugName: "createGroupArea" }] : []));
707
710
  editingGroupId = signal(null, ...(ngDevMode ? [{ debugName: "editingGroupId" }] : []));
708
711
  editingGroupTitle = signal('', ...(ngDevMode ? [{ debugName: "editingGroupTitle" }] : []));
@@ -724,6 +727,8 @@ class WorkspaceBuilder {
724
727
  });
725
728
  layout = this.facade.layout;
726
729
  validationErrors = this.facade.validationErrors;
730
+ isLoadingLayout = this.facade.isLoadingLayout;
731
+ layoutError = this.facade.layoutError;
727
732
  isSavingLayout = this.facade.isSavingLayout;
728
733
  areaContextItems = computed(() => [
729
734
  {
@@ -945,7 +950,7 @@ class WorkspaceBuilder {
945
950
  openCreateGroupDialog(area) {
946
951
  const ref = this.modal.openModal(WorkspaceBuilderCreateGroupDialog, 'dialog', {
947
952
  header: this.transloco.translate('workspace-builder.create-group'),
948
- responsivePreset: 'dialog-narrow',
953
+ styleClass: '!w-[28rem]',
949
954
  height: 'auto',
950
955
  appendTo: 'body',
951
956
  dismissableMask: true,
@@ -994,6 +999,9 @@ class WorkspaceBuilder {
994
999
  onSaveClick() {
995
1000
  this.triggerAutoSave({ notifyOnSuccess: true });
996
1001
  }
1002
+ reloadLayout() {
1003
+ this.facade.getLayout();
1004
+ }
997
1005
  deleteGroup(groupId, event) {
998
1006
  if (!event) {
999
1007
  return;
@@ -1401,7 +1409,7 @@ class WorkspaceBuilder {
1401
1409
  return this.transloco.translate(fallbackTranslationKey);
1402
1410
  }
1403
1411
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: WorkspaceBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
1404
- 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 }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", 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 <ng-template #builderContent>\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 </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\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 }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"h-full w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\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 }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\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: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: i3$1.Draggable, selector: "[pDraggable]", inputs: ["pDraggable", "dragEffect", "dragHandle", "pDraggableDisabled"], outputs: ["onDragStart", "onDragEnd", "onDrag"] }, { kind: "directive", type: i3$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: i4.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 });
1412
+ 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 }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", 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 <ng-template #builderContent>\r\n @if (isLoadingLayout()) {\r\n <div class=\"grid gap-5\">\r\n <div class=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\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-[26rem] overflow-hidden bg-surface-0\"\r\n >\r\n <div\r\n class=\"grid min-h-full content-start gap-4 bg-surface-50/60 p-5 pt-4\"\r\n >\r\n @for (row of loadingSkeletonRows; track row) {\r\n <div\r\n class=\"rounded-lg border border-surface-200 bg-surface-0 px-3 py-3 shadow-sm\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton size=\"2rem\" borderRadius=\"0.75rem\" />\r\n <div class=\"grid flex-1 gap-2\">\r\n <p-skeleton width=\"75%\" height=\"1rem\" />\r\n <p-skeleton width=\"45%\" height=\"0.8rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n } @else if (layoutError(); as error) {\r\n <div\r\n class=\"grid gap-4 rounded-xl border border-red-200 bg-red-50 px-5 py-6 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"grid gap-1\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"load-error-title\") }}\r\n </div>\r\n <p class=\"m-0 text-sm text-red-600\">\r\n {{ error || t(\"load-error-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <mt-button\r\n [label]=\"t('retry')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"reloadLayout()\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-5\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3.5 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"mb-2 text-sm font-semibold\">\r\n {{ t(\"validation-title\") }}\r\n </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=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\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-[26rem] overflow-hidden bg-surface-0\"\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 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 bg-surface-50/60 p-5 pt-2\"\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(\r\n $event,\r\n area,\r\n 0,\r\n isAreaDropSlotDisabled(area, 0)\r\n )\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-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n item.name\r\n }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid cursor-grab gap-3 rounded-md border border-surface-200 bg-surface-0 p-3 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 flex-wrap items-center gap-2 rounded-lg border-2 border-surface-200 bg-surface-50/80 px-2 py-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 <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=\"text\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span\r\n class=\"group-drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\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\r\n class=\"min-w-0 flex-1 truncate text-lg mx-1 font-semibold text-surface-600\"\r\n >{{ item.name }}</span\r\n >\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\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-2 border-dashed border-surface-300 pt-3\"\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 ms-3 flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [pDraggable]=\"dropScope\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop(\r\n $event,\r\n area,\r\n item.id,\r\n j\r\n )\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\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(\r\n area,\r\n item.id,\r\n module.id\r\n )\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 grid min-h-32 place-items-center rounded-lg border border-dashed border-surface-300 bg-surface-0/80 px-4 py-6 text-center text-sm 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 }\r\n </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\r\n</ng-container>\r\n", styles: [".workspace-area-body{transition:background-color .18s ease,box-shadow .18s ease}.workspace-area-body.drag-active{cursor:grabbing}.workspace-draggable-item.p-draggable-dragging,.workspace-group-card.p-draggable-dragging{transform:scale(.985);box-shadow:0 12px 30px color-mix(in srgb,var(--p-text-color) 14%,transparent)}.drag-handle,.group-drag-handle{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:active,.group-drag-handle:active{transform:scale(.96)}.workspace-area-body.drag-active .drag-handle,.workspace-area-body.drag-active .group-drag-handle{cursor:grabbing}.drop-slot{width:100%;height:.4rem;border:1px solid transparent;border-radius:9999px;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: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: i3$1.Draggable, selector: "[pDraggable]", inputs: ["pDraggable", "dragEffect", "dragHandle", "pDraggableDisabled"], outputs: ["onDragStart", "onDragEnd", "onDrag"] }, { kind: "directive", type: i3$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: i4.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"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i5.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1405
1413
  }
1406
1414
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: WorkspaceBuilder, decorators: [{
1407
1415
  type: Component,
@@ -1416,7 +1424,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
1416
1424
  Card,
1417
1425
  TextField,
1418
1426
  ContextMenuModule,
1419
- ], 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 <ng-template #builderContent>\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 </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\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 }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"h-full w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\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 }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\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"] }]
1427
+ SkeletonModule,
1428
+ ], 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 <ng-template #builderContent>\r\n @if (isLoadingLayout()) {\r\n <div class=\"grid gap-5\">\r\n <div class=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\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-[26rem] overflow-hidden bg-surface-0\"\r\n >\r\n <div\r\n class=\"grid min-h-full content-start gap-4 bg-surface-50/60 p-5 pt-4\"\r\n >\r\n @for (row of loadingSkeletonRows; track row) {\r\n <div\r\n class=\"rounded-lg border border-surface-200 bg-surface-0 px-3 py-3 shadow-sm\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton size=\"2rem\" borderRadius=\"0.75rem\" />\r\n <div class=\"grid flex-1 gap-2\">\r\n <p-skeleton width=\"75%\" height=\"1rem\" />\r\n <p-skeleton width=\"45%\" height=\"0.8rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n } @else if (layoutError(); as error) {\r\n <div\r\n class=\"grid gap-4 rounded-xl border border-red-200 bg-red-50 px-5 py-6 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"grid gap-1\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"load-error-title\") }}\r\n </div>\r\n <p class=\"m-0 text-sm text-red-600\">\r\n {{ error || t(\"load-error-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <mt-button\r\n [label]=\"t('retry')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"reloadLayout()\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-5\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3.5 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"mb-2 text-sm font-semibold\">\r\n {{ t(\"validation-title\") }}\r\n </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=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\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-[26rem] overflow-hidden bg-surface-0\"\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 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 bg-surface-50/60 p-5 pt-2\"\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(\r\n $event,\r\n area,\r\n 0,\r\n isAreaDropSlotDisabled(area, 0)\r\n )\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-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n item.name\r\n }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid cursor-grab gap-3 rounded-md border border-surface-200 bg-surface-0 p-3 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 flex-wrap items-center gap-2 rounded-lg border-2 border-surface-200 bg-surface-50/80 px-2 py-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 <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=\"text\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span\r\n class=\"group-drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\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\r\n class=\"min-w-0 flex-1 truncate text-lg mx-1 font-semibold text-surface-600\"\r\n >{{ item.name }}</span\r\n >\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\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-2 border-dashed border-surface-300 pt-3\"\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 ms-3 flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [pDraggable]=\"dropScope\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop(\r\n $event,\r\n area,\r\n item.id,\r\n j\r\n )\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\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(\r\n area,\r\n item.id,\r\n module.id\r\n )\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 grid min-h-32 place-items-center rounded-lg border border-dashed border-surface-300 bg-surface-0/80 px-4 py-6 text-center text-sm 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 }\r\n </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\r\n</ng-container>\r\n", styles: [".workspace-area-body{transition:background-color .18s ease,box-shadow .18s ease}.workspace-area-body.drag-active{cursor:grabbing}.workspace-draggable-item.p-draggable-dragging,.workspace-group-card.p-draggable-dragging{transform:scale(.985);box-shadow:0 12px 30px color-mix(in srgb,var(--p-text-color) 14%,transparent)}.drag-handle,.group-drag-handle{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:active,.group-drag-handle:active{transform:scale(.96)}.workspace-area-body.drag-active .drag-handle,.workspace-area-body.drag-active .group-drag-handle{cursor:grabbing}.drop-slot{width:100%;height:.4rem;border:1px solid transparent;border-radius:9999px;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"] }]
1420
1429
  }], ctorParameters: () => [], propDecorators: { levelId: [{ type: i0.Input, args: [{ isSignal: true, alias: "levelId", required: false }] }], showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], autoSave: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoSave", required: false }] }] } });
1421
1430
 
1422
1431
  /**
@@ -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 booleanAttribute,\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 {\r\n readonly levelId = input<number | null>(null);\r\n readonly showHeader = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly autoSave = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\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 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 == null) {\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 responsivePreset: 'dialog-narrow',\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 {\r\n this.facade.patchLayout(layout).subscribe({\r\n next: () => {\r\n if (this.autoSave()) {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n }\r\n },\r\n });\r\n }\r\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 <ng-template #builderContent>\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 </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\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 }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"h-full w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\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 }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAKa,0BAA0B,CAAA;AAElB,IAAA,OAAA;AADnB,IAAA,OAAgB,IAAI,GAAG,iCAAiC;AACxD,IAAA,WAAA,CAAmB,OAAe,EAAA;QAAf,IAAA,CAAA,OAAO,GAAP,OAAO;IAAW;;MAG1B,yBAAyB,CAAA;AACpC,IAAA,OAAgB,IAAI,GAAG,+BAA+B;;MAG3C,kCAAkC,CAAA;AAE1B,IAAA,MAAA;AADnB,IAAA,OAAgB,IAAI,GAAG,yCAAyC;AAChE,IAAA,WAAA,CAAmB,MAAiC,EAAA;QAAjC,IAAA,CAAA,MAAM,GAAN,MAAM;IAA8B;;MAG5C,0BAA0B,CAAA;AACrC,IAAA,OAAgB,IAAI,GAAG,gCAAgC;;MAG5C,2BAA2B,CAAA;AAG7B,IAAA,KAAA;AACA,IAAA,IAAA;AACA,IAAA,KAAA;AAJT,IAAA,OAAgB,IAAI,GAAG,iCAAiC;AACxD,IAAA,WAAA,CACS,KAAa,EACb,IAAA,GAAsB,MAAM,EAC5B,KAAc,EAAA;QAFd,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,KAAK,GAAL,KAAK;IACX;;MAGQ,2BAA2B,CAAA;AAG7B,IAAA,OAAA;AACA,IAAA,KAAA;AAHT,IAAA,OAAgB,IAAI,GAAG,iCAAiC;IACxD,WAAA,CACS,OAAe,EACf,KAAa,EAAA;QADb,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,KAAK,GAAL,KAAK;IACX;;MAGQ,2BAA2B,CAAA;AAEnB,IAAA,OAAA;AADnB,IAAA,OAAgB,IAAI,GAAG,iCAAiC;AACxD,IAAA,WAAA,CAAmB,OAAe,EAAA;QAAf,IAAA,CAAA,OAAO,GAAP,OAAO;IAAW;;MAG1B,0BAA0B,CAAA;AACrC,IAAA,OAAgB,IAAI,GAAG,gCAAgC;;;ICqB7C;AAAZ,CAAA,UAAY,yBAAyB,EAAA;AACnC,IAAA,yBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,yBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,yBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,yBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,yBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC7B,CAAC,EANW,yBAAyB,KAAzB,yBAAyB,GAAA,EAAA,CAAA,CAAA;;;;;;;;ACvCrC,MAAM,KAAK,GAAoB,CAAC,MAAM,EAAE,MAAM,CAAC;AAE/C,SAAS,aAAa,CAAC,KAAc,EAAA;AACnC,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACtC,MAAM,SAAS,GAAG,KAAgC;AAClD,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC;AACpC,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5D,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAClD,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAClD,YAAA,OAAO,EAAE;QACX;IACF;AAEA,IAAA,OAAO,EAAE;AACX;AAEA,SAAS,iBAAiB,CAAC,OAAO,GAAG,CAAC,EAAA;IACpC,OAAO;QACL,OAAO;AACP,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,IAAI,EAAE,EAAE;KACT;AACH;AAEA,SAAS,WAAW,CAClB,MAAiC,EAAA;IAEjC,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;KACjC;AACH;AAEA,SAAS,SAAS,CAAC,IAAmB,EAAA;AACpC,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;QACzB,OAAO;AACL,YAAA,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;gBACrC,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,aAAA,CAAC,CAAC;SACJ;IACH;IAEA,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB;AACH;AAEA,SAAS,qBAAqB,CAAC,OAAc,EAAA;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC3B,QAAA,OAAO,EAAE;IACX;IAEA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,MAAM;QACrC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC;AAC5B,QAAA,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;QACjC,KAAK,EAAE,KAAK,GAAG,CAAC;AACjB,KAAA,CAAC,CAAC;AACL;AAEA,SAAS,kBAAkB,CAAC,KAAY,EAAA;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,EAAE;IACX;IAEA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC/B,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE;AAC1B,YAAA,MAAM,KAAK,GAAuB;AAChC,gBAAA,IAAI,EAAE,OAAO;gBACb,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;AAC1B,gBAAA,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC/B,KAAK,EAAE,KAAK,GAAG,CAAC;gBAChB,OAAO,EAAE,qBAAqB,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;aACpD;AAED,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,UAAU,GAAwB;AACtC,YAAA,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;AAC1B,YAAA,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;YAC/B,KAAK,EAAE,KAAK,GAAG,CAAC;SACjB;AAED,QAAA,OAAO,UAAU;AACnB,IAAA,CAAC,CAAC;AACJ;AAEA,SAAS,eAAe,CACtB,MAAiC,EAAA;AAEjC,IAAA,MAAM,UAAU,GAA8B;AAC5C,QAAA,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC;QAC7B,IAAI,EAAE,kBAAkB,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QAC5C,IAAI,EAAE,kBAAkB,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;KAC7C;AAED,IAAA,OAAO,UAAU;AACnB;AAEA,SAAS,eAAe,CACtB,MAAiC,EAAA;IAEjC,OAAO;AACL,QAAA,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACpC,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;gBACzB,OAAO;AACL,oBAAA,IAAI,EAAE,OAAO;oBACb,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,KAAK,EAAE,KAAK,GAAG,CAAC;AAChB,oBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,MAAM;wBAClD,EAAE,EAAE,MAAM,CAAC,EAAE;wBACb,KAAK,EAAE,WAAW,GAAG,CAAC;AACvB,qBAAA,CAAC,CAAC;iBACJ;YACH;YAEA,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,KAAK,GAAG,CAAC;aACjB;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACpC,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;gBACzB,OAAO;AACL,oBAAA,IAAI,EAAE,OAAO;oBACb,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,KAAK,EAAE,KAAK,GAAG,CAAC;AAChB,oBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,MAAM;wBAClD,EAAE,EAAE,MAAM,CAAC,EAAE;wBACb,KAAK,EAAE,WAAW,GAAG,CAAC;AACvB,qBAAA,CAAC,CAAC;iBACJ;YACH;YAEA,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,KAAK,GAAG,CAAC;aACjB;AACH,QAAA,CAAC,CAAC;KACH;AACH;AAEA,SAAS,YAAY,CAAC,MAAgB,EAAA;IACpC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;AAC/C;AAEA,SAAS,cAAc,CAAC,MAAiC,EAAA;IACvD,MAAM,MAAM,GAAa,EAAE;IAE3B,MAAM,SAAS,GAAa,EAAE;IAC9B,MAAM,QAAQ,GAAa,EAAE;AAE7B,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AAC1B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;QAE9C,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE;AACpC,YAAA,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAA,MAAA,CAAQ,CAAC;QAC1D;AAEA,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;AACzB,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAEtB,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC;gBAC9D,IAAI,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE;oBACzC,MAAM,CAAC,IAAI,CAAC,CAAA,kCAAA,EAAqC,IAAI,CAAC,EAAE,CAAA,CAAA,CAAG,CAAC;gBAC9D;gBAEA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;oBAC9B,MAAM,WAAW,GAAQ,MAAa;AACtC,oBAAA,IACE,WAAW,EAAE,IAAI,KAAK,OAAO;wBAC7B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,EACnC;wBACA,MAAM,CAAC,IAAI,CAAC,CAAA,uCAAA,EAA0C,IAAI,CAAC,EAAE,CAAA,EAAA,CAAI,CAAC;oBACpE;AAEA,oBAAA,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAC3B,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE;AAC3B,QAAA,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC;IAC7E;AAEA,IAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE;AAC1B,QAAA,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC;IACxD;IAEA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;AACpC;AAEA,SAAS,cAAc,CACrB,MAAiC,EACjC,cAA6C,EAAA;IAE7C,IAAI,CAAC,cAAc,EAAE;AACnB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,QACE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;AAE9E;AAEA,SAAS,qBAAqB,CAC5B,MAAiC,EACjC,OAAe,EACf,KAAa,EACb,IAAmB,EACnB,KAAc,EAAA;AAEd,IAAA,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;AAChC,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AACvB,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CACtD;AAED,IAAA,MAAM,KAAK,GAAuB;AAChC,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,EAAE,EAAE,OAAO;AACX,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,OAAO,EAAE,EAAE;KACZ;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC;AAElC,IAAA,OAAO,eAAe,CAAC,IAAI,CAAC;AAC9B;AAEA,SAAS,mBAAmB,CAC1B,MAAiC,EACjC,OAAe,EACf,KAAa,EAAA;AAEb,IAAA,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;AAEhC,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAC3B,CAAC,IAAI,KACH,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,CAC/C;QAED,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,CAAC,IAAI,GAAG,KAAK;YAClB;QACF;IACF;AAEA,IAAA,OAAO,eAAe,CAAC,IAAI,CAAC;AAC9B;AAEA,SAAS,4BAA4B,CACnC,MAAiC,EACjC,OAAe,EAAA;AAEf,IAAA,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;AAEhC,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAChC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,CACvD;AAED,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB;QACF;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAuB;AACrD,QAAA,MAAM,eAAe,GAA0B,KAAK,CAAC,OAAO,CAAC,GAAG,CAC9D,CAAC,MAAM,MAAM;AACX,YAAA,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,EAAE,CAAC;AACT,SAAA,CAAC,CACH;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC;QAC/C;IACF;AAEA,IAAA,OAAO,eAAe,CAAC,IAAI,CAAC;AAC9B;AAEA,MAAM,QAAQ,GAA+B;AAC3C,IAAA,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,iBAAiB,EAAE;AAC3B,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,gBAAgB,EAAE,EAAE;AACpB,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,eAAe,EAAE,EAAE;AACnB,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,MAAM,EAAE,EAAE;CACX;AAOM,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,aAI1C,CAAA;AACS,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAG1B,IAAP,OAAO,UAAU,CAAC,KAAiC,EAAA;QACjD,OAAO,KAAK,CAAC,OAAO;IACtB;AAGO,IAAP,OAAO,SAAS,CACd,KAAiC,EAAA;QAEjC,OAAO,KAAK,CAAC,MAAM;IACrB;AAGO,IAAP,OAAO,YAAY,CAAC,KAAiC,EAAA;AACnD,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI;IAC1B;AAGO,IAAP,OAAO,YAAY,CAAC,KAAiC,EAAA;AACnD,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI;IAC1B;AAGO,IAAP,OAAO,mBAAmB,CAAC,KAAiC,EAAA;QAC1D,OAAO,KAAK,CAAC,gBAAgB;IAC/B;AAGO,IAAP,OAAO,UAAU,CAAC,KAAiC,EAAA;QACjD,OAAO,KAAK,CAAC,OAAO;IACtB;AAGO,IAAP,OAAO,gBAAgB,CAAC,KAAiC,EAAA;QACvD,OAAO,KAAK,CAAC,aAAa;IAC5B;AAGO,IAAP,OAAO,SAAS,CACd,KAAiC,EAAA;QAEjC,OAAO,KAAK,CAAC,MAAM;IACrB;AAGO,IAAP,OAAO,kBAAkB,CACvB,KAAiC,EAAA;QAEjC,OAAO,KAAK,CAAC,eAAe;IAC9B;AAGA,IAAA,UAAU,CACR,GAA6C,EAC7C,EAAE,OAAO,EAA8B,EAAA;AAEvC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;AAC5B,QAAA,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE;YAC7B;QACF;QAEA,GAAG,CAAC,UAAU,CAAC;YACb,OAAO;AACP,YAAA,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC;AAClC,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,gBAAgB,EAAE,EAAE;AACpB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,eAAe,EAAE,EAAE;AACpB,SAAA,CAAC;IACJ;AAGA,IAAA,SAAS,CAAC,GAA6C,EAAA;QACrD,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,OAAA,EAAU,OAAO,CAAA,iBAAA,CAAmB,CACrC;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,yBAAyB,CAAC,SAAS;AACxC,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,QAAQ,KAAI;AACtB,gBAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC;sBACtB,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO;AAC7B,sBAAE,iBAAiB,CAAC,OAAO,CAAC;AAE9B,gBAAA,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC;AAC5C,gBAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC;gBAEnD,OAAO;AACL,oBAAA,MAAM,EAAE,UAAU;AAClB,oBAAA,cAAc,EAAE,eAAe,CAAC,UAAU,CAAC;oBAC3C,gBAAgB;AAChB,oBAAA,OAAO,EAAE,KAAK;iBACf;YACH,CAAC;AACF,SAAA,CAAC;IACJ;AAGA,IAAA,kBAAkB,CAChB,GAA6C,EAC7C,EAAE,MAAM,EAAsC,EAAA;AAE9C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;QAC5B,MAAM,UAAU,GAAG,eAAe,CAAC;AACjC,YAAA,GAAG,MAAM;AACT,YAAA,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;AACzC,SAAA,CAAC;AACF,QAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC;QAEnD,GAAG,CAAC,UAAU,CAAC;AACb,YAAA,MAAM,EAAE,UAAU;YAClB,gBAAgB;YAChB,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC;AAC1D,SAAA,CAAC;IACJ;AAGA,IAAA,UAAU,CAAC,GAA6C,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE;AAC5B,QAAA,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK;QAEzB,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QAEA,MAAM,UAAU,GAAG,eAAe,CAAC;YACjC,GAAG,KAAK,CAAC,MAAM;YACf,OAAO;AACR,SAAA,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC;AACnD,QAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,GAAG,CAAC,UAAU,CAAC;gBACb,gBAAgB;AACjB,aAAA,CAAC;YACF;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC;AAE3C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACxB,CAAA,OAAA,EAAU,OAAO,CAAA,iBAAA,CAAmB,EACpC,OAAO,CACR;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,yBAAyB,CAAC,UAAU;AACzC,YAAA,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,MAAM;AAC/B,gBAAA,MAAM,EAAE,UAAU;AAClB,gBAAA,cAAc,EAAE,OAAO;AACvB,gBAAA,gBAAgB,EAAE,EAAE;AACpB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,eAAe,EAAE;oBACf,GAAG,KAAK,CAAC,eAAe;oBACxB,CAAC,yBAAyB,CAAC,UAAU,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE;AAC/D,iBAAA;aACF,CAAC;AACH,SAAA,CAAC;IACJ;IAGA,WAAW,CACT,GAA6C,EAC7C,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAA+B,EAAA;QAEnD,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CACzB,CAAA,OAAA,EAAU,OAAO,CAAA,wBAAA,CAA0B,EAC3C;YACE,KAAK;YACL,IAAI;YACJ,KAAK,EAAE,KAAK,IAAI,CAAC;AAClB,SAAA,CACF;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,yBAAyB,CAAC,WAAW;AAC1C,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAI;AAC7B,gBAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO;gBACtC,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,OAAO,EAAE;gBACX;AAEA,gBAAA,MAAM,UAAU,GAAG,qBAAqB,CACtC,KAAK,CAAC,MAAM,EACZ,OAAO,EACP,KAAK,EACL,IAAI,EACJ,KAAK,CACN;AACD,gBAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC;gBAEnD,OAAO;AACL,oBAAA,MAAM,EAAE,UAAU;oBAClB,gBAAgB;oBAChB,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC;AACzD,oBAAA,eAAe,EAAE;wBACf,GAAG,KAAK,CAAC,eAAe;wBACxB,CAAC,yBAAyB,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE;AAChE,qBAAA;iBACF;YACH,CAAC;AACF,SAAA,CAAC;IACJ;AAGA,IAAA,WAAW,CACT,GAA6C,EAC7C,EAAE,OAAO,EAAE,KAAK,EAA+B,EAAA;QAE/C,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAC1B,CAAA,OAAA,EAAU,OAAO,CAAA,yBAAA,EAA4B,OAAO,EAAE,EACtD;YACE,KAAK;AACN,SAAA,CACF;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,yBAAyB,CAAC,WAAW;AAC1C,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAI;AAC7B,gBAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;AACpE,gBAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC;gBAEnD,OAAO;AACL,oBAAA,MAAM,EAAE,UAAU;oBAClB,gBAAgB;oBAChB,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC;AACzD,oBAAA,eAAe,EAAE;wBACf,GAAG,KAAK,CAAC,eAAe;wBACxB,CAAC,yBAAyB,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE;AAChE,qBAAA;iBACF;YACH,CAAC;AACF,SAAA,CAAC;IACJ;AAGA,IAAA,WAAW,CACT,GAA6C,EAC7C,EAAE,OAAO,EAA+B,EAAA;QAExC,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAC3B,CAAA,OAAA,EAAU,OAAO,CAAA,yBAAA,EAA4B,OAAO,CAAA,CAAE,CACvD;AAED,QAAA,OAAO,gBAAgB,CAAC;YACtB,GAAG;YACH,GAAG,EAAE,yBAAyB,CAAC,WAAW;AAC1C,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAI;gBAC7B,MAAM,UAAU,GAAG,4BAA4B,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;AACtE,gBAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC;gBAEnD,OAAO;AACL,oBAAA,MAAM,EAAE,UAAU;oBAClB,gBAAgB;oBAChB,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC;AACzD,oBAAA,eAAe,EAAE;wBACf,GAAG,KAAK,CAAC,eAAe;wBACxB,CAAC,yBAAyB,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE;AAChE,qBAAA;iBACF;YACH,CAAC;AACF,SAAA,CAAC;IACJ;AAGA,IAAA,UAAU,CAAC,GAA6C,EAAA;AACtD,QAAA,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxB;uGA/SW,qBAAqB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAArB,qBAAqB,EAAA,CAAA;;AA2DhC,UAAA,CAAA;IADC,MAAM,CAAC,0BAA0B;AAkBjC,CAAA,EAAA,qBAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,yBAAyB;AA+BhC,CAAA,EAAA,qBAAA,CAAA,SAAA,EAAA,WAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,kCAAkC;AAiBzC,CAAA,EAAA,qBAAA,CAAA,SAAA,EAAA,oBAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,0BAA0B;AA4CjC,CAAA,EAAA,qBAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,2BAA2B;AAiDlC,CAAA,EAAA,qBAAA,CAAA,SAAA,EAAA,aAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,2BAA2B;AAoClC,CAAA,EAAA,qBAAA,CAAA,SAAA,EAAA,aAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,2BAA2B;AAiClC,CAAA,EAAA,qBAAA,CAAA,SAAA,EAAA,aAAA,EAAA,IAAA,CAAA;AAGD,UAAA,CAAA;IADC,MAAM,CAAC,0BAA0B;AAGjC,CAAA,EAAA,qBAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA;AAvSM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAGR,CAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,IAAA,CAAA;AAGM,UAAA,CAAA;AADN,IAAA,QAAQ;AAKR,CAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,IAAA,CAAA;AAxDU,qBAAqB,GAAA,UAAA,CAAA;AALjC,IAAA,KAAK,CAA6B;AACjC,QAAA,IAAI,EAAE,kBAAkB;AACxB,QAAA,QAAQ,EAAE,QAAQ;KACnB;AAEY,CAAA,EAAA,qBAAqB,CAgTjC;2FAhTY,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC;;;MCnVY,sBAAsB,CAAA;AAChB,IAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAE7B,IAAA,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC;AAClD,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC;AAChD,IAAA,SAAS,GAAG,MAAM,CAAC,qBAAqB,CAAC,YAAY,CAAC;AACtD,IAAA,SAAS,GAAG,MAAM,CAAC,qBAAqB,CAAC,YAAY,CAAC;AACtD,IAAA,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC,mBAAmB,CAAC;AACpE,IAAA,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC;AAClD,IAAA,eAAe,GAAG,MAAM,CAAC,qBAAqB,CAAC,kBAAkB,CAAC;AAE1D,IAAA,aAAa,GAAG,MAAM,CACrC,qBAAqB,CAAC,gBAAgB,CACvC;AACgB,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC;AAExD,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC,SAAS,CAAC,2DACnE;AACQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC,UAAU,CAAC,0DACpE;AACQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC,WAAW,CAAC,2DACrE;AACQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC,WAAW,CAAC,2DACrE;AACQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC,WAAW,CAAC,2DACrE;AAEQ,IAAA,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,yBAAyB,CAAC,SAAS,CAAC,IAAI,IAAI,uDACjE;AACQ,IAAA,SAAS,GAAG,QAAQ,CAC3B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,yBAAyB,CAAC,UAAU,CAAC,IAAI,IAAI,qDAClE;AAED,IAAA,iBAAiB,CAAC,GAA8B,EAAA;QAC9C,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI;IAC5C;AAEA,IAAA,eAAe,CAAC,GAA8B,EAAA;QAC5C,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI;IACnC;AAEA,IAAA,UAAU,CAAC,OAAe,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACrE;IAEA,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,yBAAyB,EAAE,CAAC;IAC7D;AAEA,IAAA,WAAW,CAAC,MAAiC,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,kCAAkC,CAAC,MAAM,CAAC,CAAC;IAC5E;IAEA,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,0BAA0B,EAAE,CAAC;IAC9D;AAEA,IAAA,WAAW,CAAC,KAAa,EAAE,IAAA,GAAsB,MAAM,EAAE,KAAc,EAAA;AACrE,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,IAAI,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CACpD;IACH;IAEA,WAAW,CAAC,OAAe,EAAE,KAAa,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,2BAA2B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7E;AAEA,IAAA,WAAW,CAAC,OAAe,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACtE;IAEA,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,0BAA0B,EAAE,CAAC;IAC9D;uGA/EW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADT,MAAM,EAAA,CAAA;;2FACnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCSrB,iCAAiC,CAAA;AACnC,IAAA,IAAI,GAAG,KAAK,CAAuB,IAAI,gDAAC;AACxC,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,iDAAC;AAElB,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;IACpB,MAAM,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxD,IAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEvC,YAAY,GAAA;AACV,QAAA,QACE,IAAI,CAAC,IAAI,EAAE;AACV,YAAA,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAkC;AACtD,YAAA,MAAM;IAEV;IAEA,MAAM,GAAA;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACb,YAAA,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE;AACzB,YAAA,KAAK,EAAE,OAAO;AAC4B,SAAA,CAAC;IAC/C;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;IACtB;uGA9BW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0CAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5B9C,0sBAyBA,EAAA,MAAA,EAAA,CAAA,4GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDNI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKN,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAb7C,SAAS;+BACE,0CAA0C,EAAA,UAAA,EACxC,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,MAAM;wBACN,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,0sBAAA,EAAA,MAAA,EAAA,CAAA,4GAAA,CAAA,EAAA;;;AEsCH,MAAM,iBAAiB,GAAG,iCAAiC;AAsB7C,MAAO,gBAAgB,CAAA;AAC1B,IAAA,OAAO,GAAG,KAAK,CAAgB,IAAI,mDAAC;IACpC,UAAU,GAAG,KAAK,CAAmB,IAAI,uDAChD,SAAS,EAAE,gBAAgB,EAAA,CAC3B;IACO,QAAQ,GAAG,KAAK,CAAmB,IAAI,qDAC9C,SAAS,EAAE,gBAAgB,EAAA,CAC3B;AACO,IAAA,KAAK,GAAoB,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzC,SAAS,GAAG,wBAAwB;AAEpC,IAAA,eAAe,GAAG,MAAM,CAAgB,MAAM,2DAAC;AAC/C,IAAA,cAAc,GAAG,MAAM,CAAgB,IAAI,0DAAC;AAC5C,IAAA,iBAAiB,GAAG,MAAM,CAAC,EAAE,6DAAC;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,IAAA,iBAAiB,GAAG,MAAM,CAAgB,IAAI,6DAAC;AAEvC,IAAA,cAAc,GAAG,MAAM,CAA0B,EAAE,0DAAC;AACpD,IAAA,WAAW,GAAG,MAAM,CAAqB,IAAI,uDAAC;IACvD,gBAAgB,GAAyC,IAAI;IAC7D,gBAAgB,GAAG,KAAK;IACxB,cAAc,GAAG,KAAK;IACtB,2BAA2B,GAAG,KAAK;AAE1B,IAAA,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC;AACvC,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAC5B,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACrD,IAAA,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;IACR,aAAa,GAAG,QAAQ,CACvC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,6BAA6B,CAAC,EAC7D;QACE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,6BAA6B,CAAC;AACtE,KAAA,CACF;AAEQ,IAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;AAC3B,IAAA,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB;AAC/C,IAAA,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;AAC3C,IAAA,gBAAgB,GAAG,QAAQ,CAAa,MAAM;AACrD,QAAA;AACE,YAAA,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;AAC3B,YAAA,IAAI,EAAE,YAAY;AAClB,YAAA,OAAO,EAAE,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AAClE,SAAA;AACF,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,IAAI,OAAO,IAAI,IAAI,EAAE;gBACnB;YACF;AAEA,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;AAC/B,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACzB,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE;YACnC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACrC,gBAAA,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE;AAC3B,gBAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU;gBAC1C,IAAI,OAAO,GAAG,KAAK;gBAEnB,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACjD,oBAAA,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE;AAChC,wBAAA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;wBACrB,OAAO,GAAG,IAAI;oBAChB;AACF,gBAAA,CAAC,CAAC;gBAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;oBACpC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AAClC,wBAAA,OAAO,IAAI,CAAC,OAAO,CAAC;wBACpB,OAAO,GAAG,IAAI;oBAChB;AACF,gBAAA,CAAC,CAAC;gBAEF,OAAO,OAAO,GAAG,IAAI,GAAG,OAAO;AACjC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;IAC1B;AAEA,IAAA,SAAS,CAAC,IAAmB,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,SAAS,CAAC,IAAmB,EAAA;QAC3B,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAA,CAAE;IAClC;AAEA,IAAA,eAAe,CAAC,OAAe,EAAA;QAC7B,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI;IAC/C;AAEA,IAAA,WAAW,CAAC,OAAe,EAAA;QACzB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,MAAM;AACtC,YAAA,GAAG,MAAM;AACT,YAAA,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5B,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,iBAAiB,CACf,KAAc,EACd,MAAsD,EACtD,MAAkB,EAAA;AAElB,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,MAAM,OAAO,GAAsB;AACjC,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM;AACN,YAAA,OAAO,EAAE;AACP,gBAAA;oBACE,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,iBAAA;AACF,aAAA;SACF;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;AAC7B,QAAA,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAC9B,OAAO,EACP,MAAM,CAAC,EAAE,CACV;IACH;AAEA,IAAA,gBAAgB,CACd,KAAc,EACd,KAAyB,EACzB,IAAmB,EAAA;AAEnB,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,MAAM,OAAO,GAAqB;AAChC,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YAC9B,MAAM,EAAE,CAAC,KAAK,CAAC;SAChB;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;AAC7B,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IAC7E;IAEA,SAAS,GAAA;QACP,IAAI,CAAC,0BAA0B,EAAE;IACnC;IAEA,YAAY,CACV,KAAc,EACd,IAAmB,EACnB,KAAa,EACb,QAAQ,GAAG,KAAK,EAAA;QAEhB,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC;IACvD;IAEA,aAAa,CACX,KAAc,EACd,IAAmB,EACnB,OAAe,EACf,KAAa,EACb,QAAQ,GAAG,KAAK,EAAA;QAEhB,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC;IACjE;AAEA,IAAA,eAAe,CAAC,KAAgB,EAAA;QAC9B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,YAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM;QACxC;IACF;AAEA,IAAA,kBAAkB,CAChB,KAAgB,EAChB,OAAe,EACf,QAAQ,GAAG,KAAK,EAAA;AAEhB,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAC3B,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,OAAO,EAAE;AACxC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAClC;YACA;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACtB;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,OAAO,EAAE;AACxC,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;QACrC;IACF;IAEA,mBAAmB,CAAC,KAAgB,EAAE,OAAe,EAAA;AACnD,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,OAAO,EAAE;YACxC;QACF;AAEA,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAAmC;AAC/D,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAA4B;AACxD,QAAA,IACE,aAAa;YACb,aAAa;AACb,YAAA,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EACrC;YACA;QACF;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;IAEA,eAAe,CAAC,IAAmB,EAAE,KAAa,EAAA;AAChD,QAAA,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,KAAK,EAAE;IAChC;AAEA,IAAA,gBAAgB,CACd,IAAmB,EACnB,OAAe,EACf,KAAa,EAAA;AAEb,QAAA,OAAO,SAAS,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,KAAK,EAAE;IAC5C;IAEA,sBAAsB,CAAC,IAAmB,EAAE,KAAa,EAAA;AACvD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;AAE1B,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE;AAC5B,YAAA,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI;AAAE,gBAAA,OAAO,KAAK;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;YAChC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,aAAa,GAAG;AACnB,iBAAA,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KACX,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAEzD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxB,YAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;AAE5C,YAAA,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC;YACpC,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,CAAC;QAC3D;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;AAClE,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,aAAa,GAAG;AACnB,aAAA,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KACX,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAE1D,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxB,QAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAE5C,QAAA,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC;QACpC,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,CAAC;IAC3D;AAEA,IAAA,uBAAuB,CACrB,IAAmB,EACnB,OAAe,EACf,KAAa,EAAA;AAEb,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AACvD,QAAA,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE;AACtE,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC;AAC1D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QAExB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AACrE,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC;aACzB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;aACtD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxB,QAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAE5C,QAAA,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC;QACpC,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,CAAC;IAC3D;IAEA,gBAAgB,CAAC,KAAgB,EAAE,IAAmB,EAAA;AACpD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC;AACpD,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC;IACvD;AAEA,IAAA,iBAAiB,CACf,KAAgB,EAChB,IAAmB,EACnB,OAAe,EAAA;AAEf,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC;QAC1D,MAAM,KAAK,GAAG,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC;IACjE;AAEA,IAAA,uBAAuB,CACrB,KAAgB,EAChB,IAAmB,EACnB,OAAe,EACf,WAAmB,EAAA;AAEnB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC;AAC9D,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC;IACjE;AAEA,IAAA,iBAAiB,CACf,KAAiB,EACjB,IAAmB,EACnB,WAAwB,EAAA;QAExB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB;AAEA,IAAA,qBAAqB,CAAC,IAAmB,EAAA;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAC9B,iCAAiC,EACjC,QAAQ,EACR;YACE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,gCAAgC,CAAC;AAClE,YAAA,gBAAgB,EAAE,eAAe;AACjC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,eAAe,EAAE,IAAI;YACrB,IAAI,EAAE,EAAE,IAAI,EAAE;YACd,WAAW,EAAE,EAAE,IAAI,EAAE;AACtB,SAAA,CACF;QAED,GAAG,CAAC,OAAO,CAAC,SAAS,CACnB,CAAC,MAA2D,KAAI;YAC9D,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;YACnC,IAAI,CAAC,KAAK,EAAE;gBACV;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;AAC5C,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC;gBACpD,IAAI,EAAE,MAAK;AACT,oBAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,IAAI,CAAC,iBAAiB,CACpB,yBAAyB,CAAC,WAAW,EACrC,wCAAwC,CACzC,CACF;gBACH,CAAC;gBACD,KAAK,EAAE,MAAK;AACV,oBAAA,IAAI,CAAC,EAAE,CAAC,KAAK,CACX,IAAI,CAAC,eAAe,CAClB,yBAAyB,CAAC,WAAW,EACrC,sCAAsC,CACvC,CACF;gBACH,CAAC;AACF,aAAA,CAAC;AACJ,QAAA,CAAC,CACF;IACH;AAEA,IAAA,gBAAgB,CAAC,KAAyB,EAAA;QACxC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;IACxC;AAEA,IAAA,eAAe,CAAC,OAAe,EAAA;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE;QAC7C,IAAI,CAAC,KAAK,EAAE;YACV;QACF;QAEA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC;YAChD,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,IAAI,CAAC,iBAAiB,CACpB,yBAAyB,CAAC,WAAW,EACrC,wCAAwC,CACzC,CACF;gBACD,IAAI,CAAC,iBAAiB,EAAE;YAC1B,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,EAAE,CAAC,KAAK,CACX,IAAI,CAAC,eAAe,CAClB,yBAAyB,CAAC,WAAW,EACrC,sCAAsC,CACvC,CACF;YACH,CAAC;AACF,SAAA,CAAC;IACJ;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IACjD;IAEA,WAAW,CAAC,OAAe,EAAE,KAAa,EAAA;QACxC,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC;AACrC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;AAC9C,YAAA,MAAM,EAAE,MAAK,EAAE,CAAC;AACjB,SAAA,CAAC;IACJ;AAEQ,IAAA,kBAAkB,CAAC,OAAe,EAAA;QACxC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;YACzC,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,IAAI,CAAC,iBAAiB,CACpB,yBAAyB,CAAC,WAAW,EACrC,wCAAwC,CACzC,CACF;YACH,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,EAAE,CAAC,KAAK,CACX,IAAI,CAAC,eAAe,CAClB,yBAAyB,CAAC,WAAW,EACrC,sCAAsC,CACvC,CACF;YACH,CAAC;AACF,SAAA,CAAC;IACJ;AAEA,IAAA,qBAAqB,CACnB,IAAmB,EACnB,OAAe,EACf,QAAgB,EAAA;QAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAClD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CACzC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,QAAQ,CACnC;AACD,QAAA,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE;YACtB;QACF;AAEA,QAAA,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAErD,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC;QAClC,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CACpC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,CACvD;AAED,QAAA,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE;YACrB;QACF;QAEA,SAAS,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE;AAClC,YAAA,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,EAAE,CAAC;AACT,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;IAC9B;AAEQ,IAAA,UAAU,CAChB,MAAkB,EAClB,WAAmB,EACnB,KAAe,EAAA;QAEf,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;;YAEvD,IAAI,CAAC,cAAc,EAAE;YACrB;QACF;QAEA,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAElD,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE;YAC5B,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC;QAC3D;aAAO;YACL,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC;QAC5D;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC5B,IAAI,CAAC,cAAc,EAAE;IACvB;AAEQ,IAAA,WAAW,CAAC,MAAiC,EAAA;QACnD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;YACxC,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;oBACnB,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;gBACjD;YACF,CAAC;AACF,SAAA,CAAC;IACJ;AAEQ,IAAA,eAAe,CAAC,OAAuC,EAAA;AAC7D,QAAA,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,KAAK;QAEzD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;YACtC;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,YAAA,IAAI,CAAC,2BAA2B;AAC9B,gBAAA,IAAI,CAAC,2BAA2B,IAAI,eAAe;YACrD;QACF;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC;AACF,aAAA,UAAU;AACV,aAAA,IAAI,CACH,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAC7B,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,gBAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,2BAA2B;AAC9D,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,gBAAA,IAAI,CAAC,2BAA2B,GAAG,KAAK;gBACxC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,qBAAqB,EAAE,CAAC;YAClE;AACF,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;gBACT,IAAI,eAAe,EAAE;AACnB,oBAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,IAAI,CAAC,iBAAiB,CACpB,yBAAyB,CAAC,UAAU,EACpC,yCAAyC,CAC1C,CACF;gBACH;YACF,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,EAAE,CAAC,KAAK,CACX,IAAI,CAAC,eAAe,CAClB,yBAAyB,CAAC,UAAU,EACpC,uCAAuC,CACxC,CACF;YACH,CAAC;AACF,SAAA,CAAC;IACN;AAEQ,IAAA,kBAAkB,CAAC,KAAe,EAAA;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;QAC3D,IAAI,YAAY,EAAE;AAChB,YAAA,OAAO,YAAY;QACrB;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B;AAEQ,IAAA,0BAA0B,CAAC,KAAe,EAAA;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,YAAY;QAC7D,MAAM,GAAG,GAAG,QAAQ,EAAE,OAAO,GAAG,iBAAiB,CAAC;QAClD,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB;AAC7C,YAAA,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,MAAM,EAAE,IAAI,KAAK,OAAO,EAAE;AACzD,gBAAA,OAAO,MAAM;YACf;QACF;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,mBAAmB,CACzB,KAAuB,EACvB,OAAoB,EACpB,iBAAyB,EAAA;AAEzB,QAAA,MAAM,QAAQ,GAAG,KAAK,EAAE,YAAY;QACpC,IAAI,CAAC,QAAQ,EAAE;YACb;QACF;AAEA,QAAA,QAAQ,CAAC,aAAa,GAAG,MAAM;AAC/B,QAAA,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC5D,QAAA,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACnD;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,qBAAqB,EAAE;IAC9B;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,qBAAqB,EAAE;IAC9B;IAEQ,0BAA0B,GAAA;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAK;AACtC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B,CAAC,EAAE,GAAG,CAAC;IACT;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B;QACF;AAEA,QAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACnC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;AAEQ,IAAA,aAAa,CAAC,KAAc,EAAA;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3C,QAAA,WAAW,EAAE,cAAc,IAAI;AAC/B,QAAA,WAAW,EAAE,eAAe,IAAI;AAC/B,QAAA,KAAa,EAAE,cAAc,IAAI;AACjC,QAAA,KAAa,EAAE,eAAe,IAAI;IACrC;AAEQ,IAAA,oBAAoB,CAAC,KAAc,EAAA;QACzC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,eAAe,IAAI;AAC3C,QAAA,KAAa,EAAE,eAAe,IAAI;IACrC;AAEQ,IAAA,kBAAkB,CAAC,KAAc,EAAA;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAC3C,IAAI,CAAC,WAAW,IAAI,EAAE,cAAc,IAAI,WAAW,CAAC,EAAE;AACpD,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,WAAwB;IACjC;AAEQ,IAAA,WAAW,CAAC,KAAc,EAAA;QAChC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,SAAS,GAAI,KAAa,EAAE,aAAa,IAAK,KAAa,EAAE,KAAK;AACxE,QAAA,QAAQ,SAAS,IAAK,KAAe;IACvC;IAEQ,oBAAoB,CAAC,KAAgB,EAAE,IAAmB,EAAA;AAChE,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;AAEjC,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AACpD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;YAC/D,IAAI,CAAC,OAAO,EAAE;gBACZ;YACF;AAEA,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;AAC5C,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAClC,gBAAA,OAAO,KAAK;YACd;QACF;QAEA,OAAO,KAAK,CAAC,MAAM;IACrB;IAEQ,uBAAuB,CAAC,KAAgB,EAAE,SAAiB,EAAA;AACjE,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAmC;QACxD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC3C,QAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QACrE,OAAO,iBAAiB,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS;IACtD;AAEQ,IAAA,sBAAsB,CAC5B,KAAgB,EAChB,IAAmB,EACnB,SAAiB,EAAA;AAEjB,QAAA,MAAM,IAAI,GAAI,KAAK,CAAC,aAAoC,IAAI,IAAI;QAChE,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,QAAQ,GACZ,IAAI,KAAK;cACL,CAAA,oCAAA,EAAuC,SAAS,CAAA,EAAA;AAClD,cAAE,CAAA,oCAAA,EAAuC,SAAS,CAAA,EAAA,CAAI;AAC1D,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;IACrC;AAEQ,IAAA,UAAU,CAChB,MAAiC,EACjC,OAAyB,EACzB,MAAkB,EAClB,WAAmB,EAAA;AAEnB,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE;YAC1B;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI;AACtC,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI;QAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;AAEjE,QAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC7B,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;YACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAC5B,CAAC,IAAI,KACH,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACjD;AAED,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB;YACF;YAEA,MAAM,aAAa,GAAG;AACnB,iBAAA,KAAK,CAAC,CAAC,EAAE,WAAW;iBACpB,MAAM,CACL,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACzD,CAAC,MAAM;AAEV,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC5D;AAED,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CACjC,WAAW,GAAG,aAAa,EAC3B,SAAS,CAAC,MAAM,CACjB;YAED,MAAM,CAAC,UAAU,CAAC,GAAG;AACnB,gBAAA,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;AAClC,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;aAChC;YAED;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAC9B,CAAC,IAAI,KACH,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACjD;AAED,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB;QACF;AAEA,QAAA,MAAM,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,MAAM,CACpC,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC5D;AAED,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACrC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC;QACnE,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;IAC9C;AAEQ,IAAA,WAAW,CACjB,MAAiC,EACjC,OAA0B,EAC1B,MAAkB,EAClB,WAAmB,EAAA;QAEnB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AAErE,QAAA,IACE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM;YAC9B,MAAM,CAAC,IAAI,KAAK,MAAM;YACtB,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EACnC;AACA,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI;AAChC,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;YAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAC5B,CAAC,IAAI,KACH,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACnD;AAED,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB;YACF;YAEA,MAAM,aAAa,GAAG;AACnB,iBAAA,KAAK,CAAC,CAAC,EAAE,WAAW;iBACpB,MAAM,CACL,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3D,CAAC,MAAM;AAEV,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC9D;AAED,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CACjC,WAAW,GAAG,aAAa,EAC3B,SAAS,CAAC,MAAM,CACjB;YAED,MAAM,CAAC,IAAI,CAAC,GAAG;AACb,gBAAA,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;AAClC,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;aAChC;YAED;QACF;AAEA,QAAA,IACE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;YAC/B,MAAM,CAAC,IAAI,KAAK,OAAO;AACvB,YAAA,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;YACnC,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,EACzC;AACA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;YACjE,IAAI,CAAC,KAAK,EAAE;gBACV;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO;YAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEpE,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB;YACF;YAEA,MAAM,aAAa,GAAG;AACnB,iBAAA,KAAK,CAAC,CAAC,EAAE,WAAW;AACpB,iBAAA,MAAM,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;YAEtD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACxE,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CACjC,WAAW,GAAG,aAAa,EAC3B,SAAS,CAAC,MAAM,CACjB;YAED,KAAK,CAAC,OAAO,GAAG;AACd,gBAAA,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;AAClC,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;aAChC;YAED;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAC7C,MAAM,EACN,OAAO,CAAC,MAAM,EACd,SAAS,CACV;AACD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B;QACF;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE;YAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AACpC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC;YACjE,MAAM,eAAe,GAA0B,SAAS,CAAC,GAAG,CAC1D,CAAC,MAAM,MAAM;AACX,gBAAA,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,gBAAA,KAAK,EAAE,CAAC;AACT,aAAA,CAAC,CACH;YAED,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC;YACnD;QACF;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;QACvE,IAAI,CAAC,WAAW,EAAE;YAChB;QACF;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CACjC,WAAW,EACX,WAAW,CAAC,OAAO,CAAC,MAAM,CAC3B;AACD,QAAA,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;IAC1D;AAEQ,IAAA,wBAAwB,CAC9B,MAAiC,EACjC,MAAkB,EAClB,SAAsB,EAAA;AAEtB,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE;YAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACpC,MAAM,MAAM,GAAG;iBACZ,MAAM,CACL,CAAC,IAAI,KACH,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAEnD,iBAAA,GAAG,CAAC,CAAC,MAAM,MAAM;gBAChB,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,aAAA,CAAC,CAAC;AAEL,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CACnC,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC9D;AAED,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;QACjE,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE3E,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,SAAS,CACf,MAAiC,EACjC,IAAmB,EACnB,OAAe,EAAA;QAEf,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAC7B,CAAC,IAAI,KACH,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,CAC/C;QAED,OAAO,KAAK,IAAI,IAAI;IACtB;IAEQ,UAAU,CAAC,KAAa,EAAE,MAAc,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C;AAEQ,IAAA,YAAY,CAClB,MAAiC,EAAA;QAEjC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAC5C,CAAC,IAAI,KAAiC,IAAI,CAAC,IAAI,KAAK,OAAO,CAC5D;IACH;AAEQ,IAAA,WAAW,CACjB,MAAiC,EAAA;QAEjC,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;AACvB,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACrD,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SACtD;IACH;AAEQ,IAAA,SAAS,CAAC,IAAmB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;YACzB,OAAO;AACL,gBAAA,IAAI,EAAE,OAAO;gBACb,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;oBACrC,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,iBAAA,CAAC,CAAC;aACJ;QACH;QAEA,OAAO;AACL,YAAA,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB;IACH;IAEQ,iBAAiB,CACvB,GAA8B,EAC9B,sBAA8B,EAAA;AAE9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAC7D,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,UAAU;QACnB;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,sBAAsB,CAAC;IACzD;IAEQ,eAAe,CACrB,GAA8B,EAC9B,sBAA8B,EAAA;AAE9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAC3D,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,UAAU;QACnB;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,sBAAsB,CAAC;IACzD;uGA/hCmB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAFxB,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClF5B,8giBAoZA,EAAA,MAAA,EAAA,CAAA,0lFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhVI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,kBAAkB,+LAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,oBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,SAAS,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACT,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,IAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAOA,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBApBpC,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,kBAAkB;wBAClB,cAAc;wBACd,MAAM;wBACN,IAAI;wBACJ,IAAI;wBACJ,IAAI;wBACJ,SAAS;wBACT,iBAAiB;AAClB,qBAAA,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,8giBAAA,EAAA,MAAA,EAAA,CAAA,0lFAAA,CAAA,EAAA;;;AElF5B;;AAEG;;;;"}
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 booleanAttribute,\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 { SkeletonModule } from 'primeng/skeleton';\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 SkeletonModule,\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 showHeader = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly autoSave = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly areas: WorkspaceArea[] = ['main', 'more'];\r\n\r\n readonly dropScope = 'workspace-builder-item';\r\n readonly loadingSkeletonRows = [0, 1, 2, 3];\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 isLoadingLayout = this.facade.isLoadingLayout;\r\n readonly layoutError = this.facade.layoutError;\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 == null) {\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 reloadLayout(): void {\r\n this.facade.getLayout();\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 {\r\n this.facade.patchLayout(layout).subscribe({\r\n next: () => {\r\n if (this.autoSave()) {\r\n this.triggerAutoSave({ notifyOnSuccess: true });\r\n }\r\n },\r\n });\r\n }\r\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 <ng-template #builderContent>\r\n @if (isLoadingLayout()) {\r\n <div class=\"grid gap-5\">\r\n <div class=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\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-[26rem] overflow-hidden bg-surface-0\"\r\n >\r\n <div\r\n class=\"grid min-h-full content-start gap-4 bg-surface-50/60 p-5 pt-4\"\r\n >\r\n @for (row of loadingSkeletonRows; track row) {\r\n <div\r\n class=\"rounded-lg border border-surface-200 bg-surface-0 px-3 py-3 shadow-sm\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <p-skeleton size=\"2rem\" borderRadius=\"0.75rem\" />\r\n <div class=\"grid flex-1 gap-2\">\r\n <p-skeleton width=\"75%\" height=\"1rem\" />\r\n <p-skeleton width=\"45%\" height=\"0.8rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n }\r\n </div>\r\n </div>\r\n } @else if (layoutError(); as error) {\r\n <div\r\n class=\"grid gap-4 rounded-xl border border-red-200 bg-red-50 px-5 py-6 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"grid gap-1\">\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"load-error-title\") }}\r\n </div>\r\n <p class=\"m-0 text-sm text-red-600\">\r\n {{ error || t(\"load-error-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <mt-button\r\n [label]=\"t('retry')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"reloadLayout()\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-5\">\r\n @if (validationErrors().length > 0) {\r\n <div\r\n class=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3.5 text-red-700 shadow-sm\"\r\n >\r\n <div class=\"mb-2 text-sm font-semibold\">\r\n {{ t(\"validation-title\") }}\r\n </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=\"grid grid-cols-1 gap-5 xl:grid-cols-2\">\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-[26rem] overflow-hidden bg-surface-0\"\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 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 bg-surface-50/60 p-5 pt-2\"\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(\r\n $event,\r\n area,\r\n 0,\r\n isAreaDropSlotDisabled(area, 0)\r\n )\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-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n item.name\r\n }}</span>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"workspace-group-card grid cursor-grab gap-3 rounded-md border border-surface-200 bg-surface-0 p-3 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [attr.data-area]=\"area\"\r\n [attr.data-item-index]=\"i\"\r\n [pDraggable]=\"dropScope\"\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 flex-wrap items-center gap-2 rounded-lg border-2 border-surface-200 bg-surface-50/80 px-2 py-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 <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=\"text\"\r\n (onClick)=\"toggleGroup(item.id)\"\r\n />\r\n <span\r\n class=\"group-drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\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\r\n class=\"min-w-0 flex-1 truncate text-lg mx-1 font-semibold text-surface-600\"\r\n >{{ item.name }}</span\r\n >\r\n <mt-button\r\n icon=\"general.edit-05\"\r\n [tooltip]=\"t('rename-group')\"\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-2 border-dashed border-surface-300 pt-3\"\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 ms-3 flex min-h-11 cursor-grab items-center gap-3 rounded-lg border border-surface-200 bg-surface-0 px-3 py-2.5 transition-all duration-150 hover:-translate-y-0.5 hover:border-surface-300 hover:shadow-sm active:cursor-grabbing\"\r\n [pDraggable]=\"dropScope\"\r\n (dragover)=\"allowNativeDrop($event)\"\r\n (drop)=\"\r\n onNativeGroupModuleDrop(\r\n $event,\r\n area,\r\n item.id,\r\n j\r\n )\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\r\n class=\"drag-handle flex size-8 shrink-0 items-center justify-center text-surface-500\"\r\n draggable=\"false\"\r\n >\r\n <mt-icon\r\n class=\"pointer-events-none text-xl text-primary\"\r\n icon=\"general.menu-05\"\r\n />\r\n </span>\r\n <span class=\"min-w-0 flex-1 truncate py-1.5\">{{\r\n module.name\r\n }}</span>\r\n <mt-button\r\n icon=\"general.minus\"\r\n [tooltip]=\"t('remove')\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n (onClick)=\"\r\n removeModuleFromGroup(\r\n area,\r\n item.id,\r\n module.id\r\n )\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 grid min-h-32 place-items-center rounded-lg border border-dashed border-surface-300 bg-surface-0/80 px-4 py-6 text-center text-sm 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 }\r\n </ng-template>\r\n\r\n @if (showHeader()) {\r\n <mt-page [title]=\"t('title')\" avatarIcon=\"layout.layout-grid-01\">\r\n <ng-template #headerEnd>\r\n @if (!autoSave()) {\r\n <div class=\"flex items-center\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </mt-page>\r\n } @else {\r\n <div class=\"w-full overflow-y-auto p-5\">\r\n @if (!autoSave()) {\r\n <div class=\"mb-4 flex justify-end\">\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-02\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n [loading]=\"isSavingLayout()\"\r\n [disabled]=\"\r\n isLoadingLayout() ||\r\n !!layoutError() ||\r\n isSavingLayout() ||\r\n validationErrors().length > 0\r\n \"\r\n (onClick)=\"onSaveClick()\"\r\n />\r\n </div>\r\n }\r\n\r\n <ng-container [ngTemplateOutlet]=\"builderContent\" />\r\n </div>\r\n }\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","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.5",
3
+ "version": "0.0.7",
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.102"
23
+ "@masterteam/components": "^0.0.114"
24
24
  },
25
25
  "sideEffects": false,
26
26
  "exports": {
@@ -96,6 +96,7 @@ declare class WorkspaceBuilder implements OnDestroy {
96
96
  readonly autoSave: _angular_core.InputSignalWithTransform<boolean, unknown>;
97
97
  readonly areas: WorkspaceArea[];
98
98
  readonly dropScope = "workspace-builder-item";
99
+ readonly loadingSkeletonRows: number[];
99
100
  readonly createGroupArea: _angular_core.WritableSignal<WorkspaceArea>;
100
101
  readonly editingGroupId: _angular_core.WritableSignal<string | null>;
101
102
  readonly editingGroupTitle: _angular_core.WritableSignal<string>;
@@ -115,6 +116,8 @@ declare class WorkspaceBuilder implements OnDestroy {
115
116
  private readonly addGroupLabel;
116
117
  readonly layout: _angular_core.Signal<WorkspaceBuilderLayoutDto>;
117
118
  readonly validationErrors: _angular_core.Signal<string[]>;
119
+ readonly isLoadingLayout: _angular_core.Signal<boolean>;
120
+ readonly layoutError: _angular_core.Signal<string | null>;
118
121
  readonly isSavingLayout: _angular_core.Signal<boolean>;
119
122
  readonly areaContextItems: _angular_core.Signal<MenuItem[]>;
120
123
  constructor();
@@ -144,6 +147,7 @@ declare class WorkspaceBuilder implements OnDestroy {
144
147
  saveRenameGroup(groupId: string): void;
145
148
  cancelRenameGroup(): void;
146
149
  onSaveClick(): void;
150
+ reloadLayout(): void;
147
151
  deleteGroup(groupId: string, event?: Event): void;
148
152
  private executeDeleteGroup;
149
153
  removeModuleFromGroup(area: WorkspaceArea, groupId: string, moduleId: string): void;