@topvisor/ui 1.0.42-TopSelector.3 → 1.0.42-TopSelector.4
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.
package/assets/forms.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.top-avatar{width:var(--52a765e6);height:var(--52a765e6);display:flex;flex-grow:0;flex-shrink:0;position:relative;top:0;left:0}.top-avatar_image{border-radius:50%;width:100%;height:100%}.top-avatar_status{border-radius:50%;border:2px solid var(--color-layout-front-1);background-color:var(--color-bg-positive-1);width:25%;height:25%;position:absolute;right:0;bottom:0}.top-button{cursor:pointer;box-sizing:border-box;box-shadow:var(--top-button-box-shadow);border-radius:var(--top-forms-radius);border:var(--top-forms-border-width) solid var(--top-forms-border-color);background-color:var(--top-button-background-color);height:var(--top-forms-base-height);padding-right:var(--top-forms-padding);padding-left:var(--top-forms-padding);color:var(--top-button-color);line-height:1;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;transition:background-color .15s,border-color .15s,box-shadow .15s}.top-button:hover{box-shadow:var(--top-button-box-shadow-hover);background-color:var(--top-button-background-color-hover)}.top-button:active{box-shadow:var(--top-button-box-shadow-active);background-color:var(--top-button-background-color-active)}.top-button.top-active{box-shadow:var(--top-button-box-shadow-selected);background-color:var(--top-button-background-color-selected)}.top-button.top-button-progress{cursor:help;box-shadow:inset #00000080 0 0 64px;background-image:linear-gradient(-45deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-size:32px 32px;animation:progress 1s linear infinite}@keyframes progress{0%{background-position-x:0px}to{background-position-x:32px}}a.top-button,button.top-button{min-width:100px;text-decoration:none}button.top-button.top-selector2{width:180px}a.top-button,a.top-button:hover{min-width:var(--top-forms-base-height);text-decoration:none}.top-button[data-top-icon]:not(:empty):not(.top-button-withoutText),.top-button[data-top-icon2]:not(:empty):not(.top-button-withoutText){justify-content:flex-start;text-align:left}.top-button[data-top-icon]{padding-left:0}.top-button[data-top-icon2]{padding-right:var(--top-selector-arrow-width)}.top-button[data-top-icon2]:after{margin-left:auto}.top-button:empty,.top-button.top-button-withoutText{min-width:var(--top-forms-base-height)}.top-button[data-top-icon]:empty,.top-button[data-top-icon2]:empty,.top-button[data-top-icon].top-button-withoutText,.top-button[data-top-icon2].top-button-withoutText{padding-right:0;padding-left:0}.top-button.top-color_blue{--top-button-background-color: var(--color-bg-primary-1)}.top-button.top-color_green{--top-button-background-color: var(--color-bg-positive-1)}.top-button.top-color_orange{--top-button-background-color: var(--color-bg-warning-1)}.top-button.top-color_red{--top-button-background-color: var(--color-bg-negative-1)}.top-button.top-color_pink{--top-button-background-color: var(--color-bg-info-1)}.top-button.top-color_brand{--top-button-color: var(--color-text-1-inverse);--top-button-background-color: var(--color-brand-1)}.top-button.top-color_theme{--top-button-box-shadow-hover: none;--top-button-box-shadow-active: none;--top-button-box-shadow-selected: none;--top-icon-color: var(--color-text-2);--top-icon2-color: var(--color-text-2);--top-button-color: var(--color-text-1);--top-button-background-color: transparent;--top-button-background-color-hover: var(--color-layer-1);--top-button-background-color-active: var(--color-layer-3);--top-button-background-color-selected: var(--color-layer-2)}.top-button.top-color_theme:hover{--top-icon-color: var(--color-text-1);--top-icon2-color: var(--color-text-1)}.top-button.top-color_theme.top-active{--top-icon-color: var(--color-text-2);--top-icon2-color: var(--color-text-2)}.top-button.top-style_outline{--top-button-box-shadow: none;--top-button-box-shadow-hover: none;--top-button-box-shadow-active: none;--top-button-box-shadow-selected: none;--top-button-background-color: var(--color-layout-front-1);--top-forms-border-width: 1px}.top-button.top-style_outline.top-color_theme{--top-button-color: var(--color-text-2);--top-icon-color: var(--color-text-2);--top-icon2-color: var(--color-text-2);--top-button-background-color-hover: var(--color-layer-1);--top-button-background-color-active: var(--color-layer-2);--top-button-background-color-selected: var(--color-layer-3);--top-forms-border-color: var(--color-line-3)}.top-button.top-style_outline.top-color_theme:hover{--top-forms-border-color: var(--color-line-4)}.top-button.top-style_outline.top-color_blue{--top-button-color: var(--color-text-primary);--top-icon-color: var(--color-text-primary);--top-icon2-color: var(--color-text-primary);--top-button-background-color-hover: var(--color-layer-primary-1);--top-button-background-color-active: var(--color-layer-primary-2);--top-button-background-color-selected: var(--color-layer-primary-3);--top-forms-border-color: var(--color-line-primary-1)}.top-button.top-style_outline.top-color_blue:hover{--top-forms-border-color: var(--color-line-primary-2)}.top-button.top-style_outline.top-color_green{--top-button-color: var(--color-text-positive);--top-icon-color: var(--color-text-positive);--top-icon2-color: var(--color-text-positive);--top-button-background-color-hover: var(--color-layer-positive-1);--top-button-background-color-active: var(--color-layer-positive-2);--top-button-background-color-selected: var(--color-layer-positive-3);--top-forms-border-color: var(--color-line-positive-1)}.top-button.top-style_outline.top-color_green:hover{--top-forms-border-color: var(--color-line-positive-2)}.top-button.top-style_outline.top-color_orange{--top-button-color: var(--color-text-warning);--top-icon-color: var(--color-text-warning);--top-icon2-color: var(--color-text-warning);--top-button-background-color-hover: var(--color-layer-warning-1);--top-button-background-color-active: var(--color-layer-warning-2);--top-button-background-color-selected: var(--color-layer-warning-3);--top-forms-border-color: var(--color-line-warning-1)}.top-button.top-style_outline.top-color_orange:hover{--top-forms-border-color: var(--color-line-warning-2)}.top-button.top-style_outline.top-color_red{--top-button-color: var(--color-text-negative);--top-icon-color: var(--color-text-negative);--top-icon2-color: var(--color-text-negative);--top-button-background-color-hover: var(--color-layer-negative-1);--top-button-background-color-active: var(--color-layer-negative-2);--top-button-background-color-selected: var(--color-layer-negative-3);--top-forms-border-color: var(--color-line-negative-1)}.top-button.top-style_outline.top-color_red:hover{--top-forms-border-color: var(--color-line-negative-2)}.top-button.top-style_outline.top-color_pink{--top-button-color: var(--color-text-info);--top-icon-color: var(--color-text-info);--top-icon2-color: var(--color-text-info);--top-button-background-color-hover: var(--color-layer-info-1);--top-button-background-color-active: var(--color-layer-info-2);--top-button-background-color-selected: var(--color-layer-info-3);--top-forms-border-color: var(--color-line-info-1)}.top-button.top-style_outline.top-color_pink:hover{--top-forms-border-color: var(--color-line-info-2)}.top-button.top-style_outline.top-color_brand{--top-button-color: var(--color-brand-1);--top-icon-color: var(--color-brand-1);--top-icon2-color: var(--color-brand-1);--top-button-background-color-hover: var(--color-layer-1);--top-button-background-color-active: var(--color-layer-2);--top-button-background-color-selected: var(--color-layer-3);--top-forms-border-color: var(--color-brand-1)}.top-button.top-style_outline.top-color_brand:hover{--top-forms-border-color: var(--color-brand-2)}.top-button.top-style_soft{--top-shadow-darken-1: none;--top-shadow-darken-2: none;--top-shadow-darken-3: none}.top-button.top-style_soft.top-color_theme{--top-button-color: var(--color-text-1);--top-icon-color: var(--color-text-1);--top-icon2-color: var(--color-text-1);--top-button-background-color: var(--color-layer-1);--top-button-background-color-hover: var(--color-layer-2);--top-button-background-color-active: var(--color-layer-3);--top-button-background-color-selected: var(--color-layer-3)}.top-button.top-style_soft.top-color_blue{--top-button-color: var(--color-text-primary);--top-icon-color: var(--color-text-primary);--top-icon2-color: var(--color-text-primary);--top-button-background-color: var(--color-layer-primary-1);--top-button-background-color-hover: var(--color-layer-primary-2);--top-button-background-color-active: var(--color-layer-primary-3);--top-button-background-color-selected: var(--color-layer-primary-3)}.top-button.top-style_soft.top-color_green{--top-button-color: var(--color-text-positive);--top-icon-color: var(--color-text-positive);--top-icon2-color: var(--color-text-positive);--top-button-background-color: var(--color-layer-positive-1);--top-button-background-color-hover: var(--color-layer-positive-2);--top-button-background-color-active: var(--color-layer-positive-3);--top-button-background-color-selected: var(--color-layer-positive-3)}.top-button.top-style_soft.top-color_orange{--top-button-color: var(--color-text-warning);--top-icon-color: var(--color-text-warning);--top-icon2-color: var(--color-text-warning);--top-button-background-color: var(--color-layer-warning-1);--top-button-background-color-hover: var(--color-layer-warning-2);--top-button-background-color-active: var(--color-layer-warning-3);--top-button-background-color-selected: var(--color-layer-warning-3)}.top-button.top-style_soft.top-color_red{--top-button-color: var(--color-text-negative);--top-icon-color: var(--color-text-negative);--top-icon2-color: var(--color-text-negative);--top-button-background-color: var(--color-layer-negative-1);--top-button-background-color-hover: var(--color-layer-negative-2);--top-button-background-color-active: var(--color-layer-negative-3);--top-button-background-color-selected: var(--color-layer-negative-3)}.top-button.top-style_soft.top-color_pink{--top-button-color: var(--color-text-info);--top-icon-color: var(--color-text-info);--top-icon2-color: var(--color-text-info);--top-button-background-color: var(--color-layer-info-1);--top-button-background-color-hover: var(--color-layer-info-2);--top-button-background-color-active: var(--color-layer-info-3);--top-button-background-color-selected: var(--color-layer-info-3)}.top-button.top-style_soft.top-color_brand{--top-button-color: var(--color-brand-1);--top-icon-color: var(--color-brand-1);--top-icon2-color: var(--color-brand-1);--top-button-background-color: var(--color-layer-1);--top-button-background-color-hover: var(--color-layer-2);--top-button-background-color-active: var(--color-layer-3);--top-button-background-color-selected: var(--color-layer-3)}.top-button.top-style_transparent{--top-shadow-darken-1: none;--top-shadow-darken-2: none;--top-shadow-darken-3: none;--top-button-color: var(--color-text);--top-button-background-color: transparent;--top-button-background-color-hover: transparent;--top-button-background-color-active: transparent;--top-button-background-color-selected: var(--color-layer-3)}.top-button.top-style_transparent:hover{opacity:.8}.top-button.top-style_transparent.top-color_blue{--top-button-color: var(--color-text-primary)}.top-button.top-style_transparent.top-color_green{--top-button-color: var(--color-text-positive)}.top-button.top-style_transparent.top-color_orange{--top-button-color: var(--color-text-warning)}.top-button.top-style_transparent.top-color_red{--top-button-color: var(--color-text-negative)}.top-button.top-style_transparent.top-color_pink{--top-button-color: var(--color-text-info)}.top-button.top-style_transparent.top-color_brand{--top-button-color: var(--color-brand-1)}.top-button{--top-button-color: var(--color-white);--top-button-background-color: transparent;--top-button-background-color-hover: var(--top-button-background-color);--top-button-background-color-active: var(--top-button-background-color-hover);--top-button-background-color-selected: var(--top-button-background-color-hover);--top-button-box-shadow: none;--top-button-box-shadow-hover: var(--top-shadow-darken-2);--top-button-box-shadow-active: var(--top-shadow-darken-3);--top-button-box-shadow-selected: var(--top-shadow-darken-3);--top-forms-border-width: 0px;--top-icon-width: calc(var(--top-icon-size) + var(--top-forms-padding));--top-icon2-width: calc(var(--top-icon2-size) + var(--top-forms-padding))}.top-button>span{pointer-events:none}.top-button>.top-ellipsis{flex-grow:0}.top-button.top-size_xs{--top-forms-padding: var(--top-forms-padding_xs);--top-forms-base-height: var(--top-forms-base-height_xs)}.top-button.top-size_m{--top-forms-padding: var(--top-forms-padding_m);--top-forms-base-height: var(--top-forms-base-height_m)}.top-button.top-size_l{--top-forms-padding: var(--top-forms-padding_l);--top-forms-base-height: var(--top-forms-base-height_l)}.top-button_badge-afterText{order:100}.top-button:not([data-top-icon2])>.top-button_badge-afterText{margin-left:0}.top-caption{display:flex;flex-direction:column;gap:var(--top-gap-1)}.top-caption_title{color:var(--color-text-3);font-size:12px}.top-forms-optionLabel{flex-grow:1}.top-forms-optionLabel_title{color:var(--color-text-1);min-height:var(--top-forms-option-height);display:flex;align-items:center}.top-forms-optionLabel_title-disabled{color:var(--color-text-3)}.top-forms-optionLabel_description{color:var(--color-text-2);font-size:.85em;line-height:var(--top-forms-option-height)}.top-forms-optionLabel_description-disabled{color:var(--color-text-3)}.top-checkbox{cursor:pointer;display:inline-flex}.top-checkbox_input{cursor:inherit;border-radius:4px;background:var(--color-layout-front-1);border:1px solid var(--top-forms-border-color);width:calc(var(--top-forms-option-height) - 3px * 2);height:calc(var(--top-forms-option-height) - 3px * 2)}.top-checkbox_input:before{content:" ";color:#fff;font-family:Topvisor-2;font-size:16px;line-height:1}.top-checkbox_input:hover{border-color:var(--top-forms-border-color-hover);background:var(--color-layer-primary-1)}.top-checkbox_input:checked,.top-checkbox_input:indeterminate{border-color:var(--top-forms-option-color);background:var(--top-forms-option-color)}.top-checkbox_input:checked:before{content:""}.top-checkbox_input:indeterminate:before{content:""}.top-checkbox_input:checked:hover,.top-checkbox_input:indeterminate:hover{border-color:var(--top-forms-option-color-hover);background:var(--top-forms-option-color-hover)}.top-checkbox_input.top-error{border-color:var(--color-bg-negative-1)}.top-checkbox_input.top-error:hover{border-color:var(--color-bg-negative-2)}.top-checkbox_input:checked.top-error,.top-checkbox_input:indeterminate.top-error{background:var(--color-bg-negative-1)}.top-checkbox_input:checked.top-error:hover,.top-checkbox_input:indeterminate.top-error:hover{background:var(--color-bg-negative-2)}.top-hint{--top-icon-size: 16px;--top-icon-width: var(--top-icon-size);border-radius:50%;background:inherit;padding:1px;color:var(--color-text-3);line-height:1;z-index:1;pointer-events:all}.top-hint:hover{color:var(--color-text-2)}:root{--top-loadbar-duration: 10s;--top-loadbar-color: var(--color-line-primary-1)}.top-loadbar{background:var(--top-loadbar-color);width:0;height:4px;position:absolute;top:0;left:0;animation:top-loadbar var(--top-loadbar-duration) forwards}@keyframes top-loadbar{0%{width:4px}4%{width:4%}5%{width:5%}to{width:95%}}.top-input{--top-forms_clear-width: 0px;width:180px;position:relative;display:inline-flex;align-items:center;gap:var(--top-gap-1)}.top-input_input{color:var(--color-text-2);height:var(--top-forms-base-height);padding:0;padding-right:max(var(--top-forms-padding),calc(var(--top-icon2-width) + var(--top-forms_clear-width)));padding-left:max(var(--top-forms-padding),var(--top-icon-width))}.top-input[data-top-icon]:before,.top-input[data-top-icon2]:after{--top-icon-color: var(--color-text-4);--top-icon2-color: var(--color-text-4);position:absolute;z-index:3;font-size:20px}.top-input[data-top-icon]:before{left:0}.top-input[data-top-icon2]:after{right:0}.top-input-withCleaner{--top-forms_clear-width: 24px}.top-input_cleaner[data-top-icon]{--top-icon-size: 16px;--top-icon-width: 20px;--top-icon-color: var(--color-text-3);cursor:pointer;border-radius:50%;width:20px;height:16px;position:absolute;right:calc(var(--top-forms-border-width) + max(var(--top-icon2-width),var(--top-forms-padding) / 2));z-index:1;display:flex;align-items:center;justify-content:center}.top-input_cleaner[data-top-icon]:hover{--top-icon-color: var(--color-text-2)}.top-input_input{width:50%;flex-grow:1}.top-input .top-loadbar{border-radius:var(--top-forms-radius) 0 0 0}.top-input-datepicker{width:calc(105px + var(--top-icon-width) + var(--top-icon2-width))}.top-input_input-date{opacity:0;position:absolute;inset:0;z-index:-1}.top-input_input-date::-webkit-inner-spin-button{display:none}.top-input_input-date::-webkit-calendar-picker-indicator{opacity:0}.top-inputRange{max-width:320px;vertical-align:baseline;display:inline-flex;gap:8px}.top-inputRange_dash{height:var(--top-forms-base-height);color:var(--color-text-4);align-self:flex-end;display:inline-flex;align-items:center}.top-inputRange>.top-input{flex-grow:1}:root{--top-radio-background-color: var(--color-layout-front-1);--top-radio-background-color-hover: var(--top-radio-background-color);--top-radio-background-color-active: var(--top-radio-background-color)}.top-radio{cursor:pointer}.top-radio_input{border-radius:50%;background:var(--color-layout-front-1);border:1px solid var(--top-forms-border-color);width:calc(var(--top-forms-option-height) - 3px * 2);height:calc(var(--top-forms-option-height) - 3px * 2)}.top-radio_input:hover{border-color:var(--top-forms-border-color-hover);background:var(--color-layer-primary-1)}.top-radio_input:checked{border-color:var(--top-forms-option-color);border-width:5px}.top-radio_input:checked:hover{border-color:var(--color-bg-primary-2)}.top-radio_input.top-error,.top-radio_input.top-error:hover{border-color:var(--color-bg-negative-1)}.top-checkboxSwitcher{cursor:pointer;display:inline-flex;gap:4px}.top-checkboxSwitcher_input{border-radius:9px;border:none;background:var(--color-layer-3);width:36px;height:18px;position:relative}.top-checkboxSwitcher_input:before{content:"";border-radius:50%;background:var(--color-white);width:12px;height:12px;margin:3px;position:absolute;top:0;left:0;transition:left .1s}.top-checkboxSwitcher_input:hover{background:var(--color-layer-4)}.top-checkboxSwitcher_input:checked{background:var(--top-forms-option-color)}.top-checkboxSwitcher_input:checked:hover{background:var(--top-forms-option-color-hover)}.top-checkboxSwitcher_input:checked:before{left:50%}.top-checkboxSwitcher_input.top-error{background:var(--color-layer-negative-3)}.top-checkboxSwitcher_input.top-error:hover{background:var(--color-layer-negative-4)}.top-checkboxSwitcher_input.top-error:checked{background:var(--color-bg-negative-2)}.top-checkboxSwitcher_input.top-error:checked:hover{background:var(--color-bg-negative-1)}.top-textarea{width:180px;display:inline-flex;align-items:center;position:relative}.top-textarea_textarea{color:var(--color-text-1);width:100%;padding:var(--top-forms-padding);resize:none}html .top-textarea_textarea.top-textarea_textarea-expandable{width:100%;height:calc(100% + var(--top-forms-border-width) * 2);position:absolute;top:0;left:0}.top-textarea_pseudoContent{pointer-events:none;box-sizing:border-box;min-height:var(--186a22be);max-height:60vh;padding:var(--top-forms-padding);font-size:14px;white-space:pre-wrap;overflow-wrap:anywhere;display:block;opacity:0;z-index:-1}.top-textarea_hint{height:var(--top-icon-width);display:flex;position:absolute;top:2px;right:2px}.top-textarea_counter{box-shadow:var(--top-forms-background-color) -2px -2px 4px;border-radius:8px;background:var(--top-forms-background-color);padding:var(--top-padding-1);color:var(--color-text-4);position:absolute;right:var(--document-scrollbar-width, var(--top-forms-border-width));bottom:var(--top-forms-border-width);z-index:1}.top-textarea_counter-max{color:var(--color-text-negative)}.top-select{color:var(--color-text-1);--top-icon-color: var(--color-text-2);--top-icon2-color: var(--color-text-2);align-items:center;width:180px;max-width:100%;display:inline-flex}.top-select-error{--top-icon-color: var(--color-text-negative);--top-icon2-color: var(--color-text-negative)}.top-select_select{padding-left:var(--top-forms-padding);text-indent:clamp(0px,calc(var(--top-icon-both-width) - var(--top-forms-padding)),calc(var(--top-icon-both-width) - var(--top-forms-padding)));width:100%;height:var(--top-forms-base-height);text-overflow:ellipsis;white-space:nowrap;flex-grow:1;overflow:hidden}.top-select optgroup{color:var(--color-text-1);font-style:normal}.top-select option:not(:disabled){background:var(--color-layout-front-1);color:var(--color-text-1)}.top-select option:disabled{background:unset;color:unset}@-moz-document url-prefix(){.top-select_select{text-indent:calc(clamp(0px,calc(var(--top-icon-both-width) - var(--top-forms-padding)),calc(var(--top-icon-both-width) - var(--top-forms-padding)))/2)}}@media only screen and (min-width: 900px){.top-changer{cursor:pointer;border-radius:100%;width:0;transform:translate(-44px);color:var(--color-text-2);font-size:16px;line-height:1;display:none;z-index:2;order:4}.top-changer:hover{color:var(--color-text-primary)}.top-changer:after{content:"";background-color:var(--top-forms-background-color);font-family:Topvisor-2}*:hover>.top-changer{display:block}}:root{--top-preloader-size: 12px;--top-preloader-color: var(--color-bg-primary-1)}.top-preloader-throbber{border-radius:50%;border:2px solid var(--top-preloader-color);border-top-color:transparent;border-left-color:transparent;width:var(--top-preloader-size);height:var(--top-preloader-size);display:inline-block;animation:top-preloader-throbber .9s linear infinite}@keyframes top-preloader-throbber{to{transform:rotate(360deg)}}.top-preloader-circles{--top-preloader-color: var(--color-line-1-opacity)}.top-preloader-circles>i{border-radius:100%;background-color:var(--top-preloader-color);width:var(--top-preloader-size);height:var(--top-preloader-size);vertical-align:middle;display:inline-block;animation-duration:.5s;animation-timing-function:linear;animation-iteration-count:infinite}.top-preloader-circles>i:first-child{animation-name:top-preloader-circles_1}.top-preloader-circles>i:not(:first-child):not(:last-child){animation-name:top-preloader-circles_2}.top-preloader-circles>i:last-child{animation-name:top-preloader-circles_3}@keyframes top-preloader-circles_1{0%{opacity:0;transform:translate(-12px)}30%{opacity:1;transform:translate(-2px)}to{transform:translate(6px)}}@keyframes top-preloader-circles_2{0%{transform:translate(-6px)}to{transform:translate(6px)}}@keyframes top-preloader-circles_3{0%{transform:translate(-6px)}70%{opacity:1;transform:translate(2px)}to{opacity:0;transform:translate(12px)}}
|
|
1
|
+
.top-avatar{width:var(--52a765e6);height:var(--52a765e6);display:flex;flex-grow:0;flex-shrink:0;position:relative;top:0;left:0}.top-avatar_image{border-radius:50%;width:100%;height:100%}.top-avatar_status{border-radius:50%;border:2px solid var(--color-layout-front-1);background-color:var(--color-bg-positive-1);width:25%;height:25%;position:absolute;right:0;bottom:0}.top-button{cursor:pointer;box-sizing:border-box;box-shadow:var(--top-button-box-shadow);border-radius:var(--top-forms-radius);border:var(--top-forms-border-width) solid var(--top-forms-border-color);background-color:var(--top-button-background-color);height:var(--top-forms-base-height);padding-right:var(--top-forms-padding);padding-left:var(--top-forms-padding);color:var(--top-button-color);line-height:1;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;transition:background-color .15s,border-color .15s,box-shadow .15s}.top-button:hover{box-shadow:var(--top-button-box-shadow-hover);background-color:var(--top-button-background-color-hover)}.top-button:active{box-shadow:var(--top-button-box-shadow-active);background-color:var(--top-button-background-color-active)}.top-button.top-active{box-shadow:var(--top-button-box-shadow-selected);background-color:var(--top-button-background-color-selected)}.top-button.top-button-progress{cursor:help;box-shadow:inset #00000080 0 0 64px;background-image:linear-gradient(-45deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-size:32px 32px;animation:progress 1s linear infinite}@keyframes progress{0%{background-position-x:0px}to{background-position-x:32px}}a.top-button,button.top-button{min-width:100px;text-decoration:none}button.top-selector2{width:180px}a.top-button,a.top-button:hover{min-width:var(--top-forms-base-height);text-decoration:none}.top-button[data-top-icon]:not(:empty):not(.top-button-withoutText),.top-button[data-top-icon2]:not(:empty):not(.top-button-withoutText){justify-content:flex-start;text-align:left}.top-button[data-top-icon]{padding-left:0}.top-button[data-top-icon2]{padding-right:var(--top-selector-arrow-width)}.top-button[data-top-icon2]:after{margin-left:auto}.top-button:empty,.top-button.top-button-withoutText{min-width:var(--top-forms-base-height)}.top-button[data-top-icon]:empty,.top-button[data-top-icon2]:empty,.top-button[data-top-icon].top-button-withoutText,.top-button[data-top-icon2].top-button-withoutText{padding-right:0;padding-left:0}.top-button.top-color_blue{--top-button-background-color: var(--color-bg-primary-1)}.top-button.top-color_green{--top-button-background-color: var(--color-bg-positive-1)}.top-button.top-color_orange{--top-button-background-color: var(--color-bg-warning-1)}.top-button.top-color_red{--top-button-background-color: var(--color-bg-negative-1)}.top-button.top-color_pink{--top-button-background-color: var(--color-bg-info-1)}.top-button.top-color_brand{--top-button-color: var(--color-text-1-inverse);--top-button-background-color: var(--color-brand-1)}.top-button.top-color_theme{--top-button-box-shadow-hover: none;--top-button-box-shadow-active: none;--top-button-box-shadow-selected: none;--top-icon-color: var(--color-text-2);--top-icon2-color: var(--color-text-2);--top-button-color: var(--color-text-1);--top-button-background-color: transparent;--top-button-background-color-hover: var(--color-layer-1);--top-button-background-color-active: var(--color-layer-3);--top-button-background-color-selected: var(--color-layer-2)}.top-button.top-color_theme:hover{--top-icon-color: var(--color-text-1);--top-icon2-color: var(--color-text-1)}.top-button.top-color_theme.top-active{--top-icon-color: var(--color-text-2);--top-icon2-color: var(--color-text-2)}.top-button.top-style_outline{--top-button-box-shadow: none;--top-button-box-shadow-hover: none;--top-button-box-shadow-active: none;--top-button-box-shadow-selected: none;--top-button-background-color: var(--color-layout-front-1);--top-forms-border-width: 1px}.top-button.top-style_outline.top-color_theme{--top-button-color: var(--color-text-2);--top-icon-color: var(--color-text-2);--top-icon2-color: var(--color-text-2);--top-button-background-color-hover: var(--color-layer-1);--top-button-background-color-active: var(--color-layer-2);--top-button-background-color-selected: var(--color-layer-3);--top-forms-border-color: var(--color-line-3)}.top-button.top-style_outline.top-color_theme:hover{--top-forms-border-color: var(--color-line-4)}.top-button.top-style_outline.top-color_blue{--top-button-color: var(--color-text-primary);--top-icon-color: var(--color-text-primary);--top-icon2-color: var(--color-text-primary);--top-button-background-color-hover: var(--color-layer-primary-1);--top-button-background-color-active: var(--color-layer-primary-2);--top-button-background-color-selected: var(--color-layer-primary-3);--top-forms-border-color: var(--color-line-primary-1)}.top-button.top-style_outline.top-color_blue:hover{--top-forms-border-color: var(--color-line-primary-2)}.top-button.top-style_outline.top-color_green{--top-button-color: var(--color-text-positive);--top-icon-color: var(--color-text-positive);--top-icon2-color: var(--color-text-positive);--top-button-background-color-hover: var(--color-layer-positive-1);--top-button-background-color-active: var(--color-layer-positive-2);--top-button-background-color-selected: var(--color-layer-positive-3);--top-forms-border-color: var(--color-line-positive-1)}.top-button.top-style_outline.top-color_green:hover{--top-forms-border-color: var(--color-line-positive-2)}.top-button.top-style_outline.top-color_orange{--top-button-color: var(--color-text-warning);--top-icon-color: var(--color-text-warning);--top-icon2-color: var(--color-text-warning);--top-button-background-color-hover: var(--color-layer-warning-1);--top-button-background-color-active: var(--color-layer-warning-2);--top-button-background-color-selected: var(--color-layer-warning-3);--top-forms-border-color: var(--color-line-warning-1)}.top-button.top-style_outline.top-color_orange:hover{--top-forms-border-color: var(--color-line-warning-2)}.top-button.top-style_outline.top-color_red{--top-button-color: var(--color-text-negative);--top-icon-color: var(--color-text-negative);--top-icon2-color: var(--color-text-negative);--top-button-background-color-hover: var(--color-layer-negative-1);--top-button-background-color-active: var(--color-layer-negative-2);--top-button-background-color-selected: var(--color-layer-negative-3);--top-forms-border-color: var(--color-line-negative-1)}.top-button.top-style_outline.top-color_red:hover{--top-forms-border-color: var(--color-line-negative-2)}.top-button.top-style_outline.top-color_pink{--top-button-color: var(--color-text-info);--top-icon-color: var(--color-text-info);--top-icon2-color: var(--color-text-info);--top-button-background-color-hover: var(--color-layer-info-1);--top-button-background-color-active: var(--color-layer-info-2);--top-button-background-color-selected: var(--color-layer-info-3);--top-forms-border-color: var(--color-line-info-1)}.top-button.top-style_outline.top-color_pink:hover{--top-forms-border-color: var(--color-line-info-2)}.top-button.top-style_outline.top-color_brand{--top-button-color: var(--color-brand-1);--top-icon-color: var(--color-brand-1);--top-icon2-color: var(--color-brand-1);--top-button-background-color-hover: var(--color-layer-1);--top-button-background-color-active: var(--color-layer-2);--top-button-background-color-selected: var(--color-layer-3);--top-forms-border-color: var(--color-brand-1)}.top-button.top-style_outline.top-color_brand:hover{--top-forms-border-color: var(--color-brand-2)}.top-button.top-style_soft{--top-shadow-darken-1: none;--top-shadow-darken-2: none;--top-shadow-darken-3: none}.top-button.top-style_soft.top-color_theme{--top-button-color: var(--color-text-1);--top-icon-color: var(--color-text-1);--top-icon2-color: var(--color-text-1);--top-button-background-color: var(--color-layer-1);--top-button-background-color-hover: var(--color-layer-2);--top-button-background-color-active: var(--color-layer-3);--top-button-background-color-selected: var(--color-layer-3)}.top-button.top-style_soft.top-color_blue{--top-button-color: var(--color-text-primary);--top-icon-color: var(--color-text-primary);--top-icon2-color: var(--color-text-primary);--top-button-background-color: var(--color-layer-primary-1);--top-button-background-color-hover: var(--color-layer-primary-2);--top-button-background-color-active: var(--color-layer-primary-3);--top-button-background-color-selected: var(--color-layer-primary-3)}.top-button.top-style_soft.top-color_green{--top-button-color: var(--color-text-positive);--top-icon-color: var(--color-text-positive);--top-icon2-color: var(--color-text-positive);--top-button-background-color: var(--color-layer-positive-1);--top-button-background-color-hover: var(--color-layer-positive-2);--top-button-background-color-active: var(--color-layer-positive-3);--top-button-background-color-selected: var(--color-layer-positive-3)}.top-button.top-style_soft.top-color_orange{--top-button-color: var(--color-text-warning);--top-icon-color: var(--color-text-warning);--top-icon2-color: var(--color-text-warning);--top-button-background-color: var(--color-layer-warning-1);--top-button-background-color-hover: var(--color-layer-warning-2);--top-button-background-color-active: var(--color-layer-warning-3);--top-button-background-color-selected: var(--color-layer-warning-3)}.top-button.top-style_soft.top-color_red{--top-button-color: var(--color-text-negative);--top-icon-color: var(--color-text-negative);--top-icon2-color: var(--color-text-negative);--top-button-background-color: var(--color-layer-negative-1);--top-button-background-color-hover: var(--color-layer-negative-2);--top-button-background-color-active: var(--color-layer-negative-3);--top-button-background-color-selected: var(--color-layer-negative-3)}.top-button.top-style_soft.top-color_pink{--top-button-color: var(--color-text-info);--top-icon-color: var(--color-text-info);--top-icon2-color: var(--color-text-info);--top-button-background-color: var(--color-layer-info-1);--top-button-background-color-hover: var(--color-layer-info-2);--top-button-background-color-active: var(--color-layer-info-3);--top-button-background-color-selected: var(--color-layer-info-3)}.top-button.top-style_soft.top-color_brand{--top-button-color: var(--color-brand-1);--top-icon-color: var(--color-brand-1);--top-icon2-color: var(--color-brand-1);--top-button-background-color: var(--color-layer-1);--top-button-background-color-hover: var(--color-layer-2);--top-button-background-color-active: var(--color-layer-3);--top-button-background-color-selected: var(--color-layer-3)}.top-button.top-style_transparent{--top-shadow-darken-1: none;--top-shadow-darken-2: none;--top-shadow-darken-3: none;--top-button-color: var(--color-text);--top-button-background-color: transparent;--top-button-background-color-hover: transparent;--top-button-background-color-active: transparent;--top-button-background-color-selected: var(--color-layer-3)}.top-button.top-style_transparent:hover{opacity:.8}.top-button.top-style_transparent.top-color_blue{--top-button-color: var(--color-text-primary)}.top-button.top-style_transparent.top-color_green{--top-button-color: var(--color-text-positive)}.top-button.top-style_transparent.top-color_orange{--top-button-color: var(--color-text-warning)}.top-button.top-style_transparent.top-color_red{--top-button-color: var(--color-text-negative)}.top-button.top-style_transparent.top-color_pink{--top-button-color: var(--color-text-info)}.top-button.top-style_transparent.top-color_brand{--top-button-color: var(--color-brand-1)}.top-button{--top-button-color: var(--color-white);--top-button-background-color: transparent;--top-button-background-color-hover: var(--top-button-background-color);--top-button-background-color-active: var(--top-button-background-color-hover);--top-button-background-color-selected: var(--top-button-background-color-hover);--top-button-box-shadow: none;--top-button-box-shadow-hover: var(--top-shadow-darken-2);--top-button-box-shadow-active: var(--top-shadow-darken-3);--top-button-box-shadow-selected: var(--top-shadow-darken-3);--top-forms-border-width: 0px;--top-icon-width: calc(var(--top-icon-size) + var(--top-forms-padding));--top-icon2-width: calc(var(--top-icon2-size) + var(--top-forms-padding))}.top-button>span{pointer-events:none}.top-button>.top-ellipsis{flex-grow:0}.top-button.top-size_xs{--top-forms-padding: var(--top-forms-padding_xs);--top-forms-base-height: var(--top-forms-base-height_xs)}.top-button.top-size_m{--top-forms-padding: var(--top-forms-padding_m);--top-forms-base-height: var(--top-forms-base-height_m)}.top-button.top-size_l{--top-forms-padding: var(--top-forms-padding_l);--top-forms-base-height: var(--top-forms-base-height_l)}.top-button_badge-afterText{order:100}.top-button:not([data-top-icon2])>.top-button_badge-afterText{margin-left:0}.top-caption{display:flex;flex-direction:column;gap:var(--top-gap-1)}.top-caption_title{color:var(--color-text-3);font-size:12px}.top-forms-optionLabel{flex-grow:1}.top-forms-optionLabel_title{color:var(--color-text-1);min-height:var(--top-forms-option-height);display:flex;align-items:center}.top-forms-optionLabel_title-disabled{color:var(--color-text-3)}.top-forms-optionLabel_description{color:var(--color-text-2);font-size:.85em;line-height:var(--top-forms-option-height)}.top-forms-optionLabel_description-disabled{color:var(--color-text-3)}.top-checkbox{cursor:pointer;display:inline-flex}.top-checkbox_input{cursor:inherit;border-radius:4px;background:var(--color-layout-front-1);border:1px solid var(--top-forms-border-color);width:calc(var(--top-forms-option-height) - 3px * 2);height:calc(var(--top-forms-option-height) - 3px * 2)}.top-checkbox_input:before{content:" ";color:#fff;font-family:Topvisor-2;font-size:16px;line-height:1}.top-checkbox_input:hover{border-color:var(--top-forms-border-color-hover);background:var(--color-layer-primary-1)}.top-checkbox_input:checked,.top-checkbox_input:indeterminate{border-color:var(--top-forms-option-color);background:var(--top-forms-option-color)}.top-checkbox_input:checked:before{content:""}.top-checkbox_input:indeterminate:before{content:""}.top-checkbox_input:checked:hover,.top-checkbox_input:indeterminate:hover{border-color:var(--top-forms-option-color-hover);background:var(--top-forms-option-color-hover)}.top-checkbox_input.top-error{border-color:var(--color-bg-negative-1)}.top-checkbox_input.top-error:hover{border-color:var(--color-bg-negative-2)}.top-checkbox_input:checked.top-error,.top-checkbox_input:indeterminate.top-error{background:var(--color-bg-negative-1)}.top-checkbox_input:checked.top-error:hover,.top-checkbox_input:indeterminate.top-error:hover{background:var(--color-bg-negative-2)}.top-hint{--top-icon-size: 16px;--top-icon-width: var(--top-icon-size);border-radius:50%;background:inherit;padding:1px;color:var(--color-text-3);line-height:1;z-index:1;pointer-events:all}.top-hint:hover{color:var(--color-text-2)}:root{--top-loadbar-duration: 10s;--top-loadbar-color: var(--color-line-primary-1)}.top-loadbar{background:var(--top-loadbar-color);width:0;height:4px;position:absolute;top:0;left:0;animation:top-loadbar var(--top-loadbar-duration) forwards}@keyframes top-loadbar{0%{width:4px}4%{width:4%}5%{width:5%}to{width:95%}}.top-input{--top-forms_clear-width: 0px;width:180px;position:relative;display:inline-flex;align-items:center;gap:var(--top-gap-1)}.top-input_input{color:var(--color-text-2);height:var(--top-forms-base-height);padding:0;padding-right:max(var(--top-forms-padding),calc(var(--top-icon2-width) + var(--top-forms_clear-width)));padding-left:max(var(--top-forms-padding),var(--top-icon-width))}.top-input[data-top-icon]:before,.top-input[data-top-icon2]:after{--top-icon-color: var(--color-text-4);--top-icon2-color: var(--color-text-4);position:absolute;z-index:3;font-size:20px}.top-input[data-top-icon]:before{left:0}.top-input[data-top-icon2]:after{right:0}.top-input-withCleaner{--top-forms_clear-width: 24px}.top-input_cleaner[data-top-icon]{--top-icon-size: 16px;--top-icon-width: 20px;--top-icon-color: var(--color-text-3);cursor:pointer;border-radius:50%;width:20px;height:16px;position:absolute;right:calc(var(--top-forms-border-width) + max(var(--top-icon2-width),var(--top-forms-padding) / 2));z-index:1;display:flex;align-items:center;justify-content:center}.top-input_cleaner[data-top-icon]:hover{--top-icon-color: var(--color-text-2)}.top-input_input{width:50%;flex-grow:1}.top-input .top-loadbar{border-radius:var(--top-forms-radius) 0 0 0}.top-input-datepicker{width:calc(105px + var(--top-icon-width) + var(--top-icon2-width))}.top-input_input-date{opacity:0;position:absolute;inset:0;z-index:-1}.top-input_input-date::-webkit-inner-spin-button{display:none}.top-input_input-date::-webkit-calendar-picker-indicator{opacity:0}.top-inputRange{max-width:320px;vertical-align:baseline;display:inline-flex;gap:8px}.top-inputRange_dash{height:var(--top-forms-base-height);color:var(--color-text-4);align-self:flex-end;display:inline-flex;align-items:center}.top-inputRange>.top-input{flex-grow:1}:root{--top-radio-background-color: var(--color-layout-front-1);--top-radio-background-color-hover: var(--top-radio-background-color);--top-radio-background-color-active: var(--top-radio-background-color)}.top-radio{cursor:pointer}.top-radio_input{border-radius:50%;background:var(--color-layout-front-1);border:1px solid var(--top-forms-border-color);width:calc(var(--top-forms-option-height) - 3px * 2);height:calc(var(--top-forms-option-height) - 3px * 2)}.top-radio_input:hover{border-color:var(--top-forms-border-color-hover);background:var(--color-layer-primary-1)}.top-radio_input:checked{border-color:var(--top-forms-option-color);border-width:5px}.top-radio_input:checked:hover{border-color:var(--color-bg-primary-2)}.top-radio_input.top-error,.top-radio_input.top-error:hover{border-color:var(--color-bg-negative-1)}.top-checkboxSwitcher{cursor:pointer;display:inline-flex;gap:4px}.top-checkboxSwitcher_input{border-radius:9px;border:none;background:var(--color-layer-3);width:36px;height:18px;position:relative}.top-checkboxSwitcher_input:before{content:"";border-radius:50%;background:var(--color-white);width:12px;height:12px;margin:3px;position:absolute;top:0;left:0;transition:left .1s}.top-checkboxSwitcher_input:hover{background:var(--color-layer-4)}.top-checkboxSwitcher_input:checked{background:var(--top-forms-option-color)}.top-checkboxSwitcher_input:checked:hover{background:var(--top-forms-option-color-hover)}.top-checkboxSwitcher_input:checked:before{left:50%}.top-checkboxSwitcher_input.top-error{background:var(--color-layer-negative-3)}.top-checkboxSwitcher_input.top-error:hover{background:var(--color-layer-negative-4)}.top-checkboxSwitcher_input.top-error:checked{background:var(--color-bg-negative-2)}.top-checkboxSwitcher_input.top-error:checked:hover{background:var(--color-bg-negative-1)}.top-textarea{width:180px;display:inline-flex;align-items:center;position:relative}.top-textarea_textarea{color:var(--color-text-1);width:100%;padding:var(--top-forms-padding);resize:none}html .top-textarea_textarea.top-textarea_textarea-expandable{width:100%;height:calc(100% + var(--top-forms-border-width) * 2);position:absolute;top:0;left:0}.top-textarea_pseudoContent{pointer-events:none;box-sizing:border-box;min-height:var(--186a22be);max-height:60vh;padding:var(--top-forms-padding);font-size:14px;white-space:pre-wrap;overflow-wrap:anywhere;display:block;opacity:0;z-index:-1}.top-textarea_hint{height:var(--top-icon-width);display:flex;position:absolute;top:2px;right:2px}.top-textarea_counter{box-shadow:var(--top-forms-background-color) -2px -2px 4px;border-radius:8px;background:var(--top-forms-background-color);padding:var(--top-padding-1);color:var(--color-text-4);position:absolute;right:var(--document-scrollbar-width, var(--top-forms-border-width));bottom:var(--top-forms-border-width);z-index:1}.top-textarea_counter-max{color:var(--color-text-negative)}.top-select{color:var(--color-text-1);--top-icon-color: var(--color-text-2);--top-icon2-color: var(--color-text-2);align-items:center;width:180px;max-width:100%;display:inline-flex}.top-select-error{--top-icon-color: var(--color-text-negative);--top-icon2-color: var(--color-text-negative)}.top-select_select{padding-left:var(--top-forms-padding);text-indent:clamp(0px,calc(var(--top-icon-both-width) - var(--top-forms-padding)),calc(var(--top-icon-both-width) - var(--top-forms-padding)));width:100%;height:var(--top-forms-base-height);text-overflow:ellipsis;white-space:nowrap;flex-grow:1;overflow:hidden}.top-select optgroup{color:var(--color-text-1);font-style:normal}.top-select option:not(:disabled){background:var(--color-layout-front-1);color:var(--color-text-1)}.top-select option:disabled{background:unset;color:unset}@-moz-document url-prefix(){.top-select_select{text-indent:calc(clamp(0px,calc(var(--top-icon-both-width) - var(--top-forms-padding)),calc(var(--top-icon-both-width) - var(--top-forms-padding)))/2)}}@media only screen and (min-width: 900px){.top-changer{cursor:pointer;border-radius:100%;width:0;transform:translate(-44px);color:var(--color-text-2);font-size:16px;line-height:1;display:none;z-index:2;order:4}.top-changer:hover{color:var(--color-text-primary)}.top-changer:after{content:"";background-color:var(--top-forms-background-color);font-family:Topvisor-2}*:hover>.top-changer{display:block}}:root{--top-preloader-size: 12px;--top-preloader-color: var(--color-bg-primary-1)}.top-preloader-throbber{border-radius:50%;border:2px solid var(--top-preloader-color);border-top-color:transparent;border-left-color:transparent;width:var(--top-preloader-size);height:var(--top-preloader-size);display:inline-block;animation:top-preloader-throbber .9s linear infinite}@keyframes top-preloader-throbber{to{transform:rotate(360deg)}}.top-preloader-circles{--top-preloader-color: var(--color-line-1-opacity)}.top-preloader-circles>i{border-radius:100%;background-color:var(--top-preloader-color);width:var(--top-preloader-size);height:var(--top-preloader-size);vertical-align:middle;display:inline-block;animation-duration:.5s;animation-timing-function:linear;animation-iteration-count:infinite}.top-preloader-circles>i:first-child{animation-name:top-preloader-circles_1}.top-preloader-circles>i:not(:first-child):not(:last-child){animation-name:top-preloader-circles_2}.top-preloader-circles>i:last-child{animation-name:top-preloader-circles_3}@keyframes top-preloader-circles_1{0%{opacity:0;transform:translate(-12px)}30%{opacity:1;transform:translate(-2px)}to{transform:translate(6px)}}@keyframes top-preloader-circles_2{0%{transform:translate(-6px)}to{transform:translate(6px)}}@keyframes top-preloader-circles_3{0%{transform:translate(-6px)}70%{opacity:1;transform:translate(2px)}to{opacity:0;transform:translate(12px)}}
|
|
@@ -15,6 +15,12 @@ export interface Props {
|
|
|
15
15
|
items?: Item[];
|
|
16
16
|
title?: string;
|
|
17
17
|
disabled?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Модификатор элемента, открывающего popup
|
|
20
|
+
*
|
|
21
|
+
* Добавит класс: `top-selector2-{{ modificator }}`
|
|
22
|
+
*/
|
|
23
|
+
modificator?: string;
|
|
18
24
|
size?: Size;
|
|
19
25
|
isError?: boolean;
|
|
20
26
|
/**
|
package/formsExt/formsExt.amd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
define(["require","exports","vue","../.chunks/forms-BduN5hFf.amd","../popup/popup.amd","../utils/keyboard.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-C9cIXmj2.amd","../require/css.amd!../assets/formsExt.css"],function(pe,b,e,C,T,S,$){"use strict";if(typeof e>"u")var e=window.Vue;const I={class:"top-editArea_footer"},_=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{},maxLength:{}},emits:["submit","close","clickOnTitle"],setup(n,{emit:o}){const a=n,l=o,d=e.ref(a.defaultValue),r=e.ref(a.isFocused),s=e.computed(()=>d.value!==a.defaultValue),p=c=>{l("submit",c),d.value=a.defaultValue},m=()=>{if(a.forceShowCloseBtn&&!s.value){l("close");return}d.value=a.defaultValue},B=()=>{a.attachToKeyboard&&l("clickOnTitle")};return(c,y)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":c.attachToKeyboard})},[c.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:y[0]||(y[0]=u=>B())},e.toDisplayString(c.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-forms-focusable":!0,"top-as-input":!0,"top-error":c.isError,"top-focus":r.value})},[e.createVNode(C._sfc_main$3,{modelValue:d.value,"onUpdate:modelValue":y[1]||(y[1]=u=>d.value=u),name:c.name,placeholder:c.placeholder,rows:c.rows,minHeight:c.minHeight,expandable:c.expandable,disabled:c.disabled,readonly:c.readonly,isError:c.isError,hint:c.hint,class:"top-editArea_element",onFocus:y[2]||(y[2]=()=>r.value=!0),onBlur:y[3]||(y[3]=()=>r.value=!1),onKeyup:[e.withKeys(m,["esc"]),y[4]||(y[4]=e.withKeys(e.withModifiers(u=>p(d.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",I,[s.value||c.forceShowCloseBtn?(e.openBlock(),e.createBlock(C._sfc_main,{key:0,icon:c.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:m},e.createSlots({_:2},[c.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),s.value?(e.openBlock(),e.createBlock(C._sfc_main,{key:1,class:"top-editArea_button",icon:c.$core.state.isMobile?"":"",onClick:y[5]||(y[5]=u=>p(d.value))},e.createSlots({_:2},[c.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),N={class:"top-editInput"},L=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(n,{emit:o}){const a=n,l=e.ref(a.modelValue);e.watch(e.toRef(a.modelValue),()=>{l.value=a.modelValue});const d=o,r=()=>{d("update:modelValue",l.value)};return(s,p)=>(e.openBlock(),e.createElementBlock("div",N,[e.createVNode(C._sfc_main$2,e.mergeProps(s.input,{onKeydownCapture:p[0]||(p[0]=e.withKeys(e.withModifiers(m=>l.value=s.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(r,["stop"]),["enter"]),modelValue:l.value,"onUpdate:modelValue":p[1]||(p[1]=m=>l.value=m)}),null,16,["onKeydown","modelValue"]),l.value!==s.modelValue?(e.openBlock(),e.createBlock(C._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},s.button,{onClick:r}),null,16)):e.createCommentVNode("",!0)]))}}),M=["data-top-icon","onClick"],P={key:0,class:"top-radioGroup_circle"},D=["value","disabled"],z=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=e.useModel(n,"modelValue"),a=n,l=e.ref(null);e.watch(o,()=>{var r,s,p,m,B;(r=a.radiosProps)!=null&&r.some(c=>c.value===o.value)||(o.value=((p=(s=a.radiosProps)==null?void 0:s[0])==null?void 0:p.value)??""),(B=(m=l.value)==null?void 0:m.querySelector(".radioGroup_item-selected"))==null||B.scrollIntoView()},{immediate:!0});const d="radioGroup-"+Math.random();return(r,s)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:l,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+r.size]:!!r.size,"top-error":r.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.radiosProps,p=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":p.value===o.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":p.disabled}),"data-top-icon":p.icon,onClick:m=>o.value=p.value},[e.createTextVNode(e.toDisplayString(p.title)+" ",1),r.showIndicator?(e.openBlock(),e.createElementBlock("span",P)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":s[0]||(s[0]=m=>o.value=m),name:d,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:p.value,disabled:p.disabled},null,8,D),[[e.vModelRadio,o.value]])],10,M))),256))],2))}}),K=["data-top-icon"],O=["value","checked","disabled","onChange"],G=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},styling:{default:"outline"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=e.useModel(n,"modelValue"),a=l=>{const d=[...o.value],r=d.indexOf(l);r===-1?d.push(l):d.splice(r,1),o.value=d};return(l,d)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-checkboxGroup":!0,["top-checkboxGroup-"+l.styling]:!0,"top-scrollBarXHidding":!0,["top-size_"+l.size]:!!l.size,"top-error":l.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.items,r=>(e.openBlock(),e.createElementBlock("label",{key:r.id,class:e.normalizeClass({"top-checkboxGroup_item":!0,"top-checkboxGroup_item-selected":o.value.includes(r.id),"top-forms-focusable":!0,"top-disabled":r.disabled}),"data-top-icon":r.icon},[e.createElementVNode("input",{type:"checkbox",class:"top-unvisible",value:r.id,checked:o.value.includes(r.id),disabled:r.disabled,onChange:s=>a(r.id)},null,40,O),e.createTextVNode(" "+e.toDisplayString(r.title),1)],10,K))),128))],2))}}),F={class:"top-selector2_itemMulti top-ellipsis"},H=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(n){return(o,a)=>(e.openBlock(),e.createElementBlock("div",F,[e.createTextVNode(e.toDisplayString(o.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:a[0]||(a[0]=l=>o.$emit("delete",o.id)),onMousedown:a[1]||(a[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),R=(n,o,a)=>{const l=e.ref([]),d=e.ref(!1);let r="",s;n&&!n.params.limit&&(n.params.limit=100);const p=async()=>{if(!n)return;let u,g;if(a&&(n.cache??=new Map,g=JSON.stringify(n.params),u=n.cache.get(g),u))return u;if(d.value=!0,u=await n.call(),d.value=!1,u.errors)return;if(!Array.isArray(u.result)){console.warn("В result ожидался массив");return}const V=u.result.findIndex(w=>w.id===void 0||w.name===void 0);if(V!==-1){console.warn(`В result[${V}] нет id или name`);return}return a&&n.cache.set(g,u),u},m=async()=>{if(!n)return;n.params.offset=0,n.params.search=r;const u=await p();u&&(s=u.nextOffset,l.value=u.result)},B=async()=>{if(!n||!s||d.value)return;n.params.offset=s,n.params.search=r;const u=await p();u&&(s=u.nextOffset,l.value=l.value.concat(u.result))},c=C.debounce(()=>m(),200);return{apiRequest:n,items:l,isLoading:d,loadAppend:B,setSearchTextAndLoad:(u,g=!0)=>{n&&(u.length<o||u===r&&l.value.length||(r=u,g?c():m()))}}},U=0,A=(n,o,a=!0)=>a&&o.id===null?Array.isArray(n)?n.some(l=>l.id===o.id&&l.name===o.name):o.name===n.name:Array.isArray(n)?n.some(l=>l.id===o.id):o.id===n.id,x=(n,o,a,l,d,r,s,p)=>{const m=e.ref(""),B={id:U,name:C.useI18n().Common.All},c=()=>{m.value="",p.items.value=[]},y=()=>!(!p.apiRequest||r.value!=="inline"||m.value.length>=s),u=e.computed(()=>{var t;const v=[];return!a&&l.value&&v.push(B),(t=o.value)==null||t.forEach(i=>v.push({...i})),v}),g=e.computed(()=>{const v=m.value.toLowerCase(),t=S.invertKeyboardLayout(v);let i=[];return u.value.forEach(h=>{const f=h.name.toLowerCase();(h.id===Number(v)||f.includes(v)||f.includes(t))&&(f===v||f===t?i.unshift(h):i.push(h))}),i.push(...p.items.value),d.value&&m.value&&(!i.length||i[0].name.toLowerCase()!==v)&&i.push({id:null,name:m.value}),a&&(i=i.filter(h=>!A(n.value,h))),i});return{searchText:m,resetSearch:c,genIsShort:y,items:u,itemsForShow:g,selectItem:v=>{a&&Array.isArray(n.value)?A(n.value,v)||(n.value=[...n.value,v]):n.value=v},selectNextItem:()=>{if(!Array.isArray(n.value)){const t=(g.value.findIndex(i=>i.id===n.value.id)+1)%g.value.length;n.value={...g.value[t]}}},deleteItemById:async v=>{Array.isArray(n.value)&&(n.value=n.value.filter(t=>t.id!==v))}}},W={key:0,class:"top-selector2_activeItems"},j={key:1,class:"top-selector2_activeName top-ellipsis"},X={key:2,class:"top-selector2_placeholder top-ellipsis"},J=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},title:{},disabled:{type:Boolean},size:{default:"s"},isError:{type:Boolean},searchType:{default:"popup"},placeholder:{},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},multiselect:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},buttonProps:{},selectedAsPlaceholder:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=n,a=e.useModel(n,"modelValue"),l=e.computed(()=>o.searchType==="inline"&&o.multiselect||o.searchType==="inline"&&C.Core.state.isMobile?"popup":o.searchType);let d=0;l.value==="inline"&&o.minLength&&(d=o.minLength);const r=R(o.apiRequest,d,o.useCache),s=x(a,e.toRef(o,"items"),o.multiselect,e.toRef(o,"appendAllValue"),e.toRef(o,"appendSearchToResult"),l,d,r),p=e.computed(()=>o.buttonProps?"TopButton":l.value==="inline"?"TopInput":"div"),m=e.ref(null),B=()=>{var t;return(t=m.value)==null?void 0:t.popup};r.apiRequest&&e.watch(s.searchText,()=>{var t;r.setSearchTextAndLoad(s.searchText.value),l.value==="inline"&&s.genIsShort()&&((t=B())==null||t.close())}),e.watch(a,()=>{l.value==="inline"&&s.resetSearch()});const c=e.computed(()=>{var t;return Array.isArray(a.value)||o.multiselect||!o.selectedAsPlaceholder&&l.value!=="inline"?o.placeholder:((t=a.value)==null?void 0:t.name)||o.placeholder}),y=t=>{var f,k;let i=!1;switch(t.key){case"Delete":case"Backspace":Array.isArray(a.value)&&(t.preventDefault(),t.stopPropagation(),a.value.pop());break;case"ArrowUp":case"ArrowRight":case"ArrowDown":case"ArrowLeft":case"Enter":case" ":i=!0;break;case"Escape":l.value==="inline"&&s.resetSearch();break}const h=t.key.length===1&&!t.ctrlKey&&!t.metaKey;(l.value==="popup"||l.value==="inline")&&h&&(i=!0),(f=B())!=null&&f.elPopup&&(i=!1),i&&(l.value==="popup"&&(t.preventDefault(),t.stopPropagation(),h&&(s.searchText.value||(s.searchText.value=t.key))),(k=t.currentTarget)==null||k.click())};let u=!1;const g=t=>{var i;u||l.value==="inline"&&((i=t.currentTarget)==null||i.click())},V=t=>{var i,h;t.preventDefault(),u=!0,(h=(i=t.currentTarget)==null?void 0:i.parentElement)==null||h.focus(),u=!1,s.selectNextItem()},w=()=>{var t;if(u=!0,r.apiRequest){if(s.genIsShort()){(t=B())==null||t.close();return}r.setSearchTextAndLoad(s.searchText.value,!1)}},E=()=>{setTimeout(()=>{u=!1},100),l.value==="popup"&&s.searchText.value&&s.resetSearch()},v=t=>{const i=t.target;i.scrollTop/(i.scrollHeight-i.offsetHeight)>.8&&r.loadAppend()};return window.__STORYBOOK_PREVIEW__&&(e.watch(()=>o.multiselect,()=>{o.multiselect?Array.isArray(a.value)||(a.value=[{id:1,name:"Выбери меня"}]):Array.isArray(a.value)&&(a.value={id:null,name:""})},{immediate:!0}),e.watch(()=>o.searchType,()=>{setTimeout(()=>{location.reload()},500)})),(t,i)=>{const h=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(T.TopPopup),{ref_key:"popupRef",ref:m,onOpen:i[3]||(i[3]=f=>w()),onClose:i[4]||(i[4]=f=>E()),onScrollContentList:i[5]||(i[5]=f=>t.apiRequest?v(f):void 0),notch:l.value!=="inline",transitionDuration:0},e.createSlots({opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createBlock(e.resolveDynamicComponent(p.value),e.mergeProps(t.buttonProps,{ref:"subcomponentSelector",class:{"top-selector2":!0,"top-selector2-multiselect":t.multiselect,"top-as-input":!t.buttonProps,"top-as-selector":!0,["top-size_"+t.size]:!0,"top-disabled":t.disabled,"top-forms-focusable":!t.disabled,"top-error":t.isError},tabindex:"0",onKeydown:y,placeholder:c.value,modelValue:e.unref(s).searchText.value,"onUpdate:modelValue":i[0]||(i[0]=f=>e.unref(s).searchText.value=f),onFocus:g,onBlur:i[1]||(i[1]=f=>{var k;return(k=B())!=null&&k.isClosed?e.unref(s).resetSearch():""})}),{default:e.withCtx(()=>[t.multiselect?(e.openBlock(),e.createElementBlock("div",W,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,f=>(e.openBlock(),e.createBlock(H,{id:f.id,name:f.name,onDelete:e.unref(s).deleteItemById},null,8,["id","name","onDelete"]))),256))])):e.createCommentVNode("",!0),l.value!=="inline"&&!t.multiselect?(e.openBlock(),e.createElementBlock("span",j,e.toDisplayString(Array.isArray(a.value)?"":a.value.name),1)):e.createCommentVNode("",!0),t.multiselect&&!a.value.length?(e.openBlock(),e.createElementBlock("span",X,e.toDisplayString(c.value),1)):e.createCommentVNode("",!0),t.addChanger&&!t.buttonProps&&!t.multiselect&&e.unref(s).items.value.length>1&&!t.disabled?(e.openBlock(),e.createElementBlock("span",{key:3,class:"top-changer top-changer-selector top-popup_widget","data-top-popup-disabled":"true",onClick:V})):e.createCommentVNode("",!0)]),_:1},16,["class","placeholder","modelValue"])),[[h,t.isError,void 0,{onupdate:!0}]])]),contentList:e.withCtx(()=>{var f;return[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(s).itemsForShow.value,k=>(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(a.value)&&!t.multiselect&&a.value.id===k.id&&a.value.name===k.name}),key:k.id??void 0,closeByClick:!t.multiselect||e.unref(C.Core).state.isMobile,onClick:me=>e.unref(s).selectItem(k)},{default:e.withCtx(()=>[t.$slots.item?e.renderSlot(t.$slots,"item",{key:0,item:k}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(k.name),1)],64))]),_:2},1032,["class","closeByClick","onClick"]))),128)),!e.unref(r).isLoading.value&&!e.unref(s).itemsForShow.value.length?(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0),e.unref(r).isLoading.value&&(t.searchType!=="popup"||(f=t.apiRequest)!=null&&f.params.offset)?(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{key:1,type:"regular"},{default:e.withCtx(()=>[e.createVNode(e.unref(C.TopPreloader),{type:"circles"})]),_:1})):e.createCommentVNode("",!0)]}),_:2},[l.value==="popup"?{name:"widget",fn:e.withCtx(()=>{var f;return[e.createVNode(e.unref(T.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:e.unref(s).searchText.value,"onUpdate:modelValue":i[2]||(i[2]=k=>e.unref(s).searchText.value=k),isLoading:e.unref(r).isLoading.value&&!((f=t.apiRequest)!=null&&f.params.offset),placeholder:c.value},null,8,["modelValue","isLoading","placeholder"])]}),key:"0"}:void 0]),1032,["notch"])}}}),Y=["data-top-icon"],q={class:"top-info_text"},Q={key:0,class:"top-info_value"},Z=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(n){return(o,a)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+o.size]:!0,["top-info-styling_"+o.styling]:!0}),"data-top-icon":o.icon},[e.createElementVNode("div",q,[e.renderSlot(o.$slots,"default")]),o.$slots.additional?(e.openBlock(),e.createElementBlock("span",Q,[e.renderSlot(o.$slots,"additional")])):e.createCommentVNode("",!0)],10,Y))}}),ee={key:0,class:"top-policy"},te={class:"top-policy_title"},oe=["innerHTML"],le=e.defineComponent({__name:"policy",props:{title:{},text:{}},setup(n){const o=e.ref(!0),a=()=>{const l=location.hostname.split(".").slice(-2).join(".");document.cookie=`cookie_consent=accepted; path=/; domain=.${l}; max-age=31536000`,o.value=!1};return(l,d)=>o.value?(e.openBlock(),e.createElementBlock("div",ee,[e.createElementVNode("div",te,e.toDisplayString(l.title),1),e.createElementVNode("div",{class:"top-policy_description",innerHTML:l.text},null,8,oe),e.createVNode(e.unref(C.TopButton),{size:"m",onClick:a},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.$i18n.Common.Allow),1)]),_:1})])):e.createCommentVNode("",!0)}}),ne=_,ae=L,re=z,se=G,ie=J,ue=$._sfc_main,ce=Z,de=le;b.TopCheckboxGroup=se,b.TopEditArea=ne,b.TopEditInput=ae,b.TopInfo=ce,b.TopMenu=ue,b.TopPolicy=de,b.TopRadioGroup=re,b.TopSelector2=ie,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
define(["require","exports","vue","../.chunks/forms-BduN5hFf.amd","../popup/popup.amd","../utils/keyboard.amd","../.chunks/menu.vue_vue_type_style_index_0_lang-C9cIXmj2.amd","../require/css.amd!../assets/formsExt.css"],function(pe,b,e,C,T,S,$){"use strict";if(typeof e>"u")var e=window.Vue;const I={class:"top-editArea_footer"},N=e.defineComponent({__name:"editArea",props:{defaultValue:{default:""},title:{},cancelText:{default:"Cancel"},submitText:{default:"Send"},closeText:{default:"Close"},isFocused:{type:Boolean},forceShowCloseBtn:{type:Boolean},attachToKeyboard:{type:Boolean},modelValue:{},name:{},placeholder:{},styling:{},rows:{},minHeight:{},expandable:{type:Boolean,default:!0},disabled:{type:Boolean},readonly:{type:Boolean},isError:{type:Boolean},hint:{},maxLength:{}},emits:["submit","close","clickOnTitle"],setup(n,{emit:o}){const a=n,l=o,d=e.ref(a.defaultValue),r=e.ref(a.isFocused),s=e.computed(()=>d.value!==a.defaultValue),p=c=>{l("submit",c),d.value=a.defaultValue},m=()=>{if(a.forceShowCloseBtn&&!s.value){l("close");return}d.value=a.defaultValue},B=()=>{a.attachToKeyboard&&l("clickOnTitle")};return(c,y)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-editArea":!0,"top-editArea-attachedToKeyboard":c.attachToKeyboard})},[c.title?(e.openBlock(),e.createElementBlock("div",{key:0,class:"top-editArea_title",onClick:y[0]||(y[0]=u=>B())},e.toDisplayString(c.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass({"top-editArea_form":!0,"top-forms-focusable":!0,"top-as-input":!0,"top-error":c.isError,"top-focus":r.value})},[e.createVNode(C._sfc_main$3,{modelValue:d.value,"onUpdate:modelValue":y[1]||(y[1]=u=>d.value=u),name:c.name,placeholder:c.placeholder,rows:c.rows,minHeight:c.minHeight,expandable:c.expandable,disabled:c.disabled,readonly:c.readonly,isError:c.isError,hint:c.hint,class:"top-editArea_element",onFocus:y[2]||(y[2]=()=>r.value=!0),onBlur:y[3]||(y[3]=()=>r.value=!1),onKeyup:[e.withKeys(m,["esc"]),y[4]||(y[4]=e.withKeys(e.withModifiers(u=>p(d.value),["ctrl"]),["enter"]))]},null,8,["modelValue","name","placeholder","rows","minHeight","expandable","disabled","readonly","isError","hint"]),e.createElementVNode("div",I,[s.value||c.forceShowCloseBtn?(e.openBlock(),e.createBlock(C._sfc_main,{key:0,icon:c.$core.state.isMobile?"":"",class:"top-editArea_button",color:"theme",styling:"soft",onClick:m},e.createSlots({_:2},[c.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.cancelText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0),s.value?(e.openBlock(),e.createBlock(C._sfc_main,{key:1,class:"top-editArea_button",icon:c.$core.state.isMobile?"":"",onClick:y[5]||(y[5]=u=>p(d.value))},e.createSlots({_:2},[c.$core.state.isMobile?void 0:{name:"default",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.submitText),1)]),key:"0"}]),1032,["icon"])):e.createCommentVNode("",!0)])],2)],2))}}),_={class:"top-editInput"},L=e.defineComponent({__name:"editInput",props:{modelValue:{},input:{},button:{}},emits:["update:modelValue"],setup(n,{emit:o}){const a=n,l=e.ref(a.modelValue);e.watch(e.toRef(a.modelValue),()=>{l.value=a.modelValue});const d=o,r=()=>{d("update:modelValue",l.value)};return(s,p)=>(e.openBlock(),e.createElementBlock("div",_,[e.createVNode(C._sfc_main$2,e.mergeProps(s.input,{onKeydownCapture:p[0]||(p[0]=e.withKeys(e.withModifiers(m=>l.value=s.modelValue,["stop"]),["esc"])),onKeydown:e.withKeys(e.withModifiers(r,["stop"]),["enter"]),modelValue:l.value,"onUpdate:modelValue":p[1]||(p[1]=m=>l.value=m)}),null,16,["onKeydown","modelValue"]),l.value!==s.modelValue?(e.openBlock(),e.createBlock(C._sfc_main,e.mergeProps({key:0,icon:"",styling:"soft"},s.button,{onClick:r}),null,16)):e.createCommentVNode("",!0)]))}}),M=["data-top-icon","onClick"],P={key:0,class:"top-radioGroup_circle"},D=["value","disabled"],z=e.defineComponent({__name:"radioGroup",props:e.mergeModels({modelValue:{},radiosProps:{},showIndicator:{type:Boolean},size:{default:"s"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=e.useModel(n,"modelValue"),a=n,l=e.ref(null);e.watch(o,()=>{var r,s,p,m,B;(r=a.radiosProps)!=null&&r.some(c=>c.value===o.value)||(o.value=((p=(s=a.radiosProps)==null?void 0:s[0])==null?void 0:p.value)??""),(B=(m=l.value)==null?void 0:m.querySelector(".radioGroup_item-selected"))==null||B.scrollIntoView()},{immediate:!0});const d="radioGroup-"+Math.random();return(r,s)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"elRef",ref:l,class:e.normalizeClass({"top-radioGroup":!0,"top-scrollBarXHidding":!0,["top-size_"+r.size]:!!r.size,"top-error":r.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.radiosProps,p=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass({"top-radioGroup_item-selected":p.value===o.value,"top-radioGroup_item":!0,"top-forms-focusable":!0,"top-disabled":p.disabled}),"data-top-icon":p.icon,onClick:m=>o.value=p.value},[e.createTextVNode(e.toDisplayString(p.title)+" ",1),r.showIndicator?(e.openBlock(),e.createElementBlock("span",P)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":s[0]||(s[0]=m=>o.value=m),name:d,type:"radio",class:e.normalizeClass({"top-unvisible":!0}),value:p.value,disabled:p.disabled},null,8,D),[[e.vModelRadio,o.value]])],10,M))),256))],2))}}),K=["data-top-icon"],O=["value","checked","disabled","onChange"],G=e.defineComponent({__name:"checkboxGroup",props:e.mergeModels({modelValue:{},items:{},size:{default:"s"},styling:{default:"outline"},isError:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=e.useModel(n,"modelValue"),a=l=>{const d=[...o.value],r=d.indexOf(l);r===-1?d.push(l):d.splice(r,1),o.value=d};return(l,d)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-checkboxGroup":!0,["top-checkboxGroup-"+l.styling]:!0,"top-scrollBarXHidding":!0,["top-size_"+l.size]:!!l.size,"top-error":l.isError})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.items,r=>(e.openBlock(),e.createElementBlock("label",{key:r.id,class:e.normalizeClass({"top-checkboxGroup_item":!0,"top-checkboxGroup_item-selected":o.value.includes(r.id),"top-forms-focusable":!0,"top-disabled":r.disabled}),"data-top-icon":r.icon},[e.createElementVNode("input",{type:"checkbox",class:"top-unvisible",value:r.id,checked:o.value.includes(r.id),disabled:r.disabled,onChange:s=>a(r.id)},null,40,O),e.createTextVNode(" "+e.toDisplayString(r.title),1)],10,K))),128))],2))}}),F={class:"top-selector2_itemMulti top-ellipsis"},H=e.defineComponent({__name:"itemMulti",props:{id:{},name:{}},emits:["delete"],setup(n){return(o,a)=>(e.openBlock(),e.createElementBlock("div",F,[e.createTextVNode(e.toDisplayString(o.name)+" ",1),e.createElementVNode("span",{class:"top-selector2_itemMultiDelete","data-top-icon":"",onClick:a[0]||(a[0]=l=>o.$emit("delete",o.id)),onMousedown:a[1]||(a[1]=e.withModifiers(()=>{},["stop"]))},null,32)]))}}),R=(n,o,a)=>{const l=e.ref([]),d=e.ref(!1);let r="",s;n&&!n.params.limit&&(n.params.limit=100);const p=async()=>{if(!n)return;let u,g;if(a&&(n.cache??=new Map,g=JSON.stringify(n.params),u=n.cache.get(g),u))return u;if(d.value=!0,u=await n.call(),d.value=!1,u.errors)return;if(!Array.isArray(u.result)){console.warn("В result ожидался массив");return}const V=u.result.findIndex(w=>w.id===void 0||w.name===void 0);if(V!==-1){console.warn(`В result[${V}] нет id или name`);return}return a&&n.cache.set(g,u),u},m=async()=>{if(!n)return;n.params.offset=0,n.params.search=r;const u=await p();u&&(s=u.nextOffset,l.value=u.result)},B=async()=>{if(!n||!s||d.value)return;n.params.offset=s,n.params.search=r;const u=await p();u&&(s=u.nextOffset,l.value=l.value.concat(u.result))},c=C.debounce(()=>m(),200);return{apiRequest:n,items:l,isLoading:d,loadAppend:B,setSearchTextAndLoad:(u,g=!0)=>{n&&(u.length<o||u===r&&l.value.length||(r=u,g?c():m()))}}},U=0,A=(n,o,a=!0)=>a&&o.id===null?Array.isArray(n)?n.some(l=>l.id===o.id&&l.name===o.name):o.name===n.name:Array.isArray(n)?n.some(l=>l.id===o.id):o.id===n.id,W=(n,o,a,l,d,r,s,p)=>{const m=e.ref(""),B={id:U,name:C.useI18n().Common.All},c=()=>{m.value="",p.items.value=[]},y=()=>!(!p.apiRequest||r.value!=="inline"||m.value.length>=s),u=e.computed(()=>{var t;const v=[];return!a&&l.value&&v.push(B),(t=o.value)==null||t.forEach(i=>v.push({...i})),v}),g=e.computed(()=>{const v=m.value.toLowerCase(),t=S.invertKeyboardLayout(v);let i=[];return u.value.forEach(h=>{const f=h.name.toLowerCase();(h.id===Number(v)||f.includes(v)||f.includes(t))&&(f===v||f===t?i.unshift(h):i.push(h))}),i.push(...p.items.value),d.value&&m.value&&(!i.length||i[0].name.toLowerCase()!==v)&&i.push({id:null,name:m.value}),a&&(i=i.filter(h=>!A(n.value,h))),i});return{searchText:m,resetSearch:c,genIsShort:y,items:u,itemsForShow:g,selectItem:v=>{a&&Array.isArray(n.value)?A(n.value,v)||(n.value=[...n.value,v]):n.value=v},selectNextItem:()=>{if(!Array.isArray(n.value)){const t=(g.value.findIndex(i=>i.id===n.value.id)+1)%g.value.length;n.value={...g.value[t]}}},deleteItemById:async v=>{Array.isArray(n.value)&&(n.value=n.value.filter(t=>t.id!==v))}}},j={key:0,class:"top-selector2_activeItems"},X={key:1,class:"top-selector2_activeName top-ellipsis"},x={key:2,class:"top-selector2_placeholder top-ellipsis"},J=e.defineComponent({__name:"selector2",props:e.mergeModels({modelValue:{},items:{default:()=>[]},title:{},disabled:{type:Boolean},modificator:{},size:{default:"s"},isError:{type:Boolean},searchType:{default:"popup"},placeholder:{},apiRequest:{},minLength:{default:0},useCache:{type:Boolean},appendSearchToResult:{type:Boolean},multiselect:{type:Boolean},appendAllValue:{type:Boolean},addChanger:{type:Boolean},buttonProps:{},selectedAsPlaceholder:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(n){const o=n,a=e.useModel(n,"modelValue"),l=e.computed(()=>o.searchType==="inline"&&o.multiselect||o.searchType==="inline"&&C.Core.state.isMobile?"popup":o.searchType);let d=0;l.value==="inline"&&o.minLength&&(d=o.minLength);const r=R(o.apiRequest,d,o.useCache),s=W(a,e.toRef(o,"items"),o.multiselect,e.toRef(o,"appendAllValue"),e.toRef(o,"appendSearchToResult"),l,d,r),p=e.computed(()=>o.buttonProps?"TopButton":l.value==="inline"?"TopInput":"div"),m=e.ref(null),B=()=>{var t;return(t=m.value)==null?void 0:t.popup};r.apiRequest&&e.watch(s.searchText,()=>{var t;r.setSearchTextAndLoad(s.searchText.value),l.value==="inline"&&s.genIsShort()&&((t=B())==null||t.close())}),e.watch(a,()=>{l.value==="inline"&&s.resetSearch()});const c=e.computed(()=>{var t;return Array.isArray(a.value)||o.multiselect||!o.selectedAsPlaceholder&&l.value!=="inline"?o.placeholder:((t=a.value)==null?void 0:t.name)||o.placeholder}),y=t=>{var f,k;let i=!1;switch(t.key){case"Delete":case"Backspace":Array.isArray(a.value)&&(t.preventDefault(),t.stopPropagation(),a.value.pop());break;case"ArrowUp":case"ArrowRight":case"ArrowDown":case"ArrowLeft":case"Enter":case" ":i=!0;break;case"Escape":l.value==="inline"&&s.resetSearch();break}const h=t.key.length===1&&!t.ctrlKey&&!t.metaKey;(l.value==="popup"||l.value==="inline")&&h&&(i=!0),(f=B())!=null&&f.elPopup&&(i=!1),i&&(l.value==="popup"&&(t.preventDefault(),t.stopPropagation(),h&&(s.searchText.value||(s.searchText.value=t.key))),(k=t.currentTarget)==null||k.click())};let u=!1;const g=t=>{var i;u||l.value==="inline"&&((i=t.currentTarget)==null||i.click())},V=t=>{var i,h;t.preventDefault(),u=!0,(h=(i=t.currentTarget)==null?void 0:i.parentElement)==null||h.focus(),u=!1,s.selectNextItem()},w=()=>{var t;if(u=!0,r.apiRequest){if(s.genIsShort()){(t=B())==null||t.close();return}r.setSearchTextAndLoad(s.searchText.value,!1)}},E=()=>{setTimeout(()=>{u=!1},100),l.value==="popup"&&s.searchText.value&&s.resetSearch()},v=t=>{const i=t.target;i.scrollTop/(i.scrollHeight-i.offsetHeight)>.8&&r.loadAppend()};return window.__STORYBOOK_PREVIEW__&&(e.watch(()=>o.multiselect,()=>{o.multiselect?Array.isArray(a.value)||(a.value=[{id:1,name:"Выбери меня"}]):Array.isArray(a.value)&&(a.value={id:null,name:""})},{immediate:!0}),e.watch(()=>o.searchType,()=>{setTimeout(()=>{location.reload()},500)})),(t,i)=>{const h=e.resolveDirective("top-focus");return e.openBlock(),e.createBlock(e.unref(T.TopPopup),{ref_key:"popupRef",ref:m,onOpen:i[3]||(i[3]=f=>w()),onClose:i[4]||(i[4]=f=>E()),onScrollContentList:i[5]||(i[5]=f=>t.apiRequest?v(f):void 0),notch:l.value!=="inline",transitionDuration:0},e.createSlots({opener:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createBlock(e.resolveDynamicComponent(p.value),e.mergeProps(t.buttonProps,{ref:"subcomponentSelector",class:{"top-selector2":!0,"top-selector2-multiselect":t.multiselect,["top-selector2-"+t.modificator]:!!t.modificator,"top-as-input":!t.buttonProps,"top-as-selector":!0,["top-size_"+t.size]:!0,"top-disabled":t.disabled,"top-forms-focusable":!t.disabled,"top-error":t.isError},tabindex:"0",onKeydown:y,placeholder:c.value,modelValue:e.unref(s).searchText.value,"onUpdate:modelValue":i[0]||(i[0]=f=>e.unref(s).searchText.value=f),onFocus:g,onBlur:i[1]||(i[1]=f=>{var k;return(k=B())!=null&&k.isClosed?e.unref(s).resetSearch():""})}),{default:e.withCtx(()=>[t.multiselect?(e.openBlock(),e.createElementBlock("div",j,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,f=>(e.openBlock(),e.createBlock(H,{id:f.id,name:f.name,onDelete:e.unref(s).deleteItemById},null,8,["id","name","onDelete"]))),256))])):e.createCommentVNode("",!0),l.value!=="inline"&&!t.multiselect?(e.openBlock(),e.createElementBlock("span",X,e.toDisplayString(Array.isArray(a.value)?"":a.value.name),1)):e.createCommentVNode("",!0),t.multiselect&&!a.value.length?(e.openBlock(),e.createElementBlock("span",x,e.toDisplayString(c.value),1)):e.createCommentVNode("",!0),t.addChanger&&!t.buttonProps&&!t.multiselect&&e.unref(s).items.value.length>1&&!t.disabled?(e.openBlock(),e.createElementBlock("span",{key:3,class:"top-changer top-changer-selector top-popup_widget","data-top-popup-disabled":"true",onClick:V})):e.createCommentVNode("",!0)]),_:1},16,["class","placeholder","modelValue"])),[[h,t.isError,void 0,{onupdate:!0}]])]),contentList:e.withCtx(()=>{var f;return[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(s).itemsForShow.value,k=>(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{class:e.normalizeClass({"top-active":!Array.isArray(a.value)&&!t.multiselect&&a.value.id===k.id&&a.value.name===k.name}),key:k.id??void 0,closeByClick:!t.multiselect||e.unref(C.Core).state.isMobile,onClick:me=>e.unref(s).selectItem(k)},{default:e.withCtx(()=>[t.$slots.item?e.renderSlot(t.$slots,"item",{key:0,item:k}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(k.name),1)],64))]),_:2},1032,["class","closeByClick","onClick"]))),128)),!e.unref(r).isLoading.value&&!e.unref(s).itemsForShow.value.length?(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{key:0,type:"regular"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.$i18n.Common.No_results),1)]),_:1})):e.createCommentVNode("",!0),e.unref(r).isLoading.value&&(t.searchType!=="popup"||(f=t.apiRequest)!=null&&f.params.offset)?(e.openBlock(),e.createBlock(e.unref(T.TopPopupListItem),{key:1,type:"regular"},{default:e.withCtx(()=>[e.createVNode(e.unref(C.TopPreloader),{type:"circles"})]),_:1})):e.createCommentVNode("",!0)]}),_:2},[l.value==="popup"?{name:"widget",fn:e.withCtx(()=>{var f;return[e.createVNode(e.unref(T.TopPopupWidgetInput),{title:"Поиск",icon:"",modelValue:e.unref(s).searchText.value,"onUpdate:modelValue":i[2]||(i[2]=k=>e.unref(s).searchText.value=k),isLoading:e.unref(r).isLoading.value&&!((f=t.apiRequest)!=null&&f.params.offset),placeholder:c.value},null,8,["modelValue","isLoading","placeholder"])]}),key:"0"}:void 0]),1032,["notch"])}}}),Y=["data-top-icon"],q={class:"top-info_text"},Q={key:0,class:"top-info_value"},Z=e.defineComponent({__name:"info",props:{icon:{},styling:{default:"default"},size:{default:"default"}},setup(n){return(o,a)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass({"top-info":!0,["top-size_"+o.size]:!0,["top-info-styling_"+o.styling]:!0}),"data-top-icon":o.icon},[e.createElementVNode("div",q,[e.renderSlot(o.$slots,"default")]),o.$slots.additional?(e.openBlock(),e.createElementBlock("span",Q,[e.renderSlot(o.$slots,"additional")])):e.createCommentVNode("",!0)],10,Y))}}),ee={key:0,class:"top-policy"},te={class:"top-policy_title"},oe=["innerHTML"],le=e.defineComponent({__name:"policy",props:{title:{},text:{}},setup(n){const o=e.ref(!0),a=()=>{const l=location.hostname.split(".").slice(-2).join(".");document.cookie=`cookie_consent=accepted; path=/; domain=.${l}; max-age=31536000`,o.value=!1};return(l,d)=>o.value?(e.openBlock(),e.createElementBlock("div",ee,[e.createElementVNode("div",te,e.toDisplayString(l.title),1),e.createElementVNode("div",{class:"top-policy_description",innerHTML:l.text},null,8,oe),e.createVNode(e.unref(C.TopButton),{size:"m",onClick:a},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.$i18n.Common.Allow),1)]),_:1})])):e.createCommentVNode("",!0)}}),ne=N,ae=L,re=z,se=G,ie=J,ue=$._sfc_main,ce=Z,de=le;b.TopCheckboxGroup=se,b.TopEditArea=ne,b.TopEditInput=ae,b.TopInfo=ce,b.TopMenu=ue,b.TopPolicy=de,b.TopRadioGroup=re,b.TopSelector2=ie,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=formsExt.amd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/policy/policy.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './types';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-forms-focusable': true,\n\t\t\t\t'top-as-input': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\talign-self: flex-end;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet searchText = '';\n\tlet nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Item[] } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = nextOffset;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет произведен\n\t *\n\t * Если текст не изменился, поиск не будет произведен\n\t *\n\t * @param newSearchText - текст поиска\n\t * @param useDebounce - дедупликация загрузки списка\n\t */\n\tconst setSearchTextAndLoad = (newSearchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (newSearchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (newSearchText === searchText && items.value.length) return;\n\n\t\tsearchText = newSearchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tsearchType: Ref<Props['searchType']>,\n\tminLength: number,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Является ли строка поиска достаточной длины для отображения меню\n\t */\n\tconst genIsShort = () => {\n\t\tif (!api.apiRequest) return false;\n\t\tif (searchType.value !== 'inline') return false;\n\t\tif (searchText.value.length >= minLength) return false;\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\t/**\n\t * Выбрать элемент\n\t *\n\t * @param item Элемент для выбора\n\t */\n\tconst selectItem = (item: Item) => {\n\t\tif (multiselect && Array.isArray(model.value)) {\n\t\t\tif (!isSelected(model.value, item)) {\n\t\t\t\tmodel.value = [...model.value, item];\n\t\t\t}\n\t\t} else {\n\t\t\tmodel.value = item;\n\t\t}\n\t};\n\n\t/**\n\t * Выбрать следующее значение\n\t */\n\tconst selectNextItem = () => {\n\t\tif (!Array.isArray(model.value)) {\n\t\t\tconst currentIndex = itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\t\tconst nextIndex = (currentIndex + 1) % itemsForShow.value.length;\n\t\t\tmodel.value = { ...itemsForShow.value[nextIndex] };\n\t\t}\n\t};\n\n\t/**\n\t * Удалить выбранное значение по id\n\t *\n\t * @param id Идентификатор элемента для удаления\n\t */\n\tconst deleteItemById = async (id: Item['id']) => {\n\t\tif (Array.isArray(model.value)) {\n\t\t\tmodel.value = model.value.filter(item => item.id !== id);\n\t\t}\n\t};\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\tgenIsShort,\n\t\titems: localItems,\n\t\titemsForShow,\n\t\tselectItem,\n\t\tselectNextItem,\n\t\tdeleteItemById,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Item[],\n\tsize: 's',\n\tminLength: 0,\n\tsearchType: 'popup',\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\nconst searchTypeLocal = computed(() => {\n\t// multiselect не поддерживает inline ввода\n\tif (props.searchType === 'inline' && props.multiselect) return 'popup';\n\n\t// В мобильной версии popup работает в полноэкранном режиме\n\tif (props.searchType === 'inline' && Core.state.isMobile) return 'popup';\n\n\treturn props.searchType;\n});\n\nlet minLength = 0;\nif (searchTypeLocal.value === 'inline' && props.minLength) {\n\tminLength = props.minLength;\n}\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, minLength, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(\n\tmodel,\n\ttoRef(props, 'items'),\n\tprops.multiselect,\n\ttoRef(props, 'appendAllValue'),\n\ttoRef(props, 'appendSearchToResult'),\n\tsearchTypeLocal,\n\tminLength,\n\tapi,\n);\n\nconst component = computed(() => {\n\tif (props.buttonProps) return 'TopButton';\n\tif (searchTypeLocal.value === 'inline') return 'TopInput';\n\n\treturn 'div';\n});\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\nif (api.apiRequest) {\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => {\n\t\tapi.setSearchTextAndLoad(menu.searchText.value);\n\n\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\tif (menu.genIsShort()) {\n\t\t\t\tgetPopup()?.close();\n\t\t\t}\n\t\t}\n\t});\n}\n\nwatch(model, () => {\n\t/**\n\t * При изменении значения модели в режиме inline необходимо очистить поле поиска,\n\t * так как поиск больше не актуален после выбора значения\n\t */\n\tif (searchTypeLocal.value === 'inline') {\n\t\tmenu.resetSearch();\n\t}\n});\n\nconst placeholder = computed(() => {\n\tif (Array.isArray(model.value) || props.multiselect || !props.selectedAsPlaceholder && searchTypeLocal.value !== 'inline') {\n\t\treturn props.placeholder;\n\t}\n\n\treturn model.value?.name || props.placeholder;\n});\n\n/**\n * Обработчик ввода клавиш на кнопке или поле ввода\n */\nconst onOpenerKeydown = (e: KeyboardEvent) => {\n\tlet needOpen = false;\n\n\tswitch (e.key) {\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tmodel.value.pop();\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowRight':\n\t\tcase 'ArrowDown':\n\t\tcase 'ArrowLeft':\n\t\tcase 'Enter':\n\t\tcase ' ':\n\t\t\tneedOpen = true;\n\n\t\t\tbreak;\n\t\tcase 'Escape':\n\t\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\t\t// очистка введенного текста\n\t\t\t\tmenu.resetSearch();\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n\n\t// введен символ\n\tconst symbolPressed = e.key.length === 1 && !e.ctrlKey && !e.metaKey;\n\n\t// введен символ\n\tif (searchTypeLocal.value === 'popup' || searchTypeLocal.value === 'inline') {\n\t\tif (symbolPressed) {\n\t\t\tneedOpen = true;\n\t\t}\n\t}\n\n\t// popup уже открыт\n\tif (getPopup()?.elPopup) {\n\t\tneedOpen = false;\n\t}\n\n\tif (needOpen) {\n\t\tif (searchTypeLocal.value === 'popup') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// введен символ\n\t\t\tif (symbolPressed) {\n\t\t\t\t// начало ввода, сразу ввести первый символ вместе с открытием popup\n\t\t\t\tif (!menu.searchText.value) {\n\t\t\t\t\tmenu.searchText.value = e.key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nlet disabledFocusToOpen = false;\n\nconst onFocus = (e: FocusEvent) => {\n\tif (disabledFocusToOpen) return;\n\n\tif (searchTypeLocal.value === 'inline') {\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nconst onClickChanger = (e: MouseEvent) => {\n\te.preventDefault();\n\n\tdisabledFocusToOpen = true;\n\t(e.currentTarget as HTMLElement)?.parentElement?.focus();\n\tdisabledFocusToOpen = false;\n\n\tmenu.selectNextItem();\n};\n\n/**\n * Обработчик открытия попапа\n */\nconst onOpen = () => {\n\tdisabledFocusToOpen = true;\n\n\tif (api.apiRequest) {\n\t\tif (menu.genIsShort()) {\n\t\t\tgetPopup()?.close();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// при открытии сразу выполнить поиск\n\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tsetTimeout(() => {\n\t\tdisabledFocusToOpen = false;\n\t}, 100);\n\n\t// очистка введенного текста\n\tif (searchTypeLocal.value === 'popup') {\n\t\tif (menu.searchText.value) menu.resetSearch();\n\t}\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\n */\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tapi.loadAppend();\n\t}\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tif (props.multiselect) {\n\t\t\t\tif (!Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\t\tname: 'Выбери меня',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = {\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ immediate: true },\n\t);\n\n\twatch(\n\t\t() => props.searchType,\n\t\t() => {\n\t\t\t// пауза для установки props в адресной строке\n\t\t\tsetTimeout(() => {\n\t\t\t\tlocation.reload();\n\t\t\t}, 500);\n\t\t},\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"onOpen()\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"searchTypeLocal !== 'inline'\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<component\n\t\t\t\t:is=\"component\"\n\n\t\t\t\t:=\"buttonProps\"\n\n\t\t\t\tref=\"subcomponentSelector\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t'top-as-input': !buttonProps,\n\t\t\t\t\t'top-as-selector': true,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t@keydown=\"onOpenerKeydown\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\n\t\t\t\t:placeholder\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t@focus=\"onFocus\"\n\t\t\t\t@blur=\"getPopup()?.isClosed ? menu.resetSearch() : ''\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Item[]\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"menu.deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"searchTypeLocal !== 'inline' && !multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span v-if=\"multiselect && !model.length\" class=\"top-selector2_placeholder top-ellipsis\">\n\t\t\t\t\t{{ placeholder }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !buttonProps && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector top-popup_widget\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"onClickChanger\"\n\t\t\t\t></span>\n\t\t\t</component>\n\t\t</template>\n\n\t\t<template #widget v-if=\"searchTypeLocal === 'popup'\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t:placeholder\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"menu.selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!api.isLoading.value && !menu.itemsForShow.value.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (searchType !== 'popup' || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n}\n\n.top-selector2::placeholder,\n.top-selector2_placeholder {\n\tcolor: var(--color-text-2);\n}\n\n.top-selector2_placeholder {\n\tpadding-left: var(--top-padding-1);\n}\n\n.top-selector2-multiselect {\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\twidth: auto;\n\tpadding: var(--top-padding-1);\n\tmargin: calc(0px - var(--top-padding-1));\n\ttransform: translateX(0);\n}\n\n.top-selector2.top-button {\n\tjustify-content: start;\n}\n\n.top-selector2.top-input_input ~ .top-changer-selector {\n\ttransform: translateX(-52px);\n}\n\n.top-selector2.top-as-selector {\n\tpadding-right: calc(var(--top-selector-arrow-width) + var(--top-padding-2));\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { TopButton } from '@/components/forms/forms';\nimport type { Props } from '@/components/formsExt/policy/types';\n\ndefineProps<Props>();\n\nconst isVisible = ref(true);\n\nconst acceptCookie = () => {\n\tconst baseDomain = location.hostname.split('.').slice(-2).join('.');\n\n\tdocument.cookie = `cookie_consent=accepted; path=/; domain=.${baseDomain}; max-age=31536000`;\n\n\tisVisible.value = false;\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"isVisible\"\n\t\tclass=\"top-policy\"\n\t>\n\t\t<div class=\"top-policy_title\">\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\tclass=\"top-policy_description\"\n\t\t\tv-html=\"text\"\n\t\t></div>\n\n\t\t<TopButton\n\t\t\tsize=\"m\"\n\t\t\t@click=\"acceptCookie\"\n\t\t>\n\t\t\t{{ $i18n.Common.Allow }}\n\t\t</TopButton>\n\t</div>\n</template>\n\n<style>\n.top-policy {\n\tbox-sizing: border-box;\n\tbox-shadow: var(--top-shadow-b);\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-bg-lightning-1);\n\twidth: 600px;\n\tpadding: var(--top-padding-4);\n\tposition: fixed;\n\tright: var(--top-gap-10);\n\tbottom: var(--top-gap-10);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-4);\n\tz-index: 10000;\n}\n\n.top-policy_title {\n\tfont-size: 24px;\n\tfont-weight: 700;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-policy {\n\t\twidth: 100%;\n\t\tright: 0;\n\t\tbottom: calc(var(--top-gap-5) + var(--toolbar-height, 0px));\n\t}\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\nimport Policy from './policy/policy.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\nexport const TopPolicy = Policy as typeof Policy & ComponentCustomProps;"],"names":["isChanged","vue","localValue","props","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","onChange","id","index","newModel","items","isLoading","nextOffset","apiRequest","res","cacheKey","indexWithError","searchText","callAPIRequest","loadAppend","newSearchText","minLength","modelValue","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","searchType","api","forms","localItems","localItems2","itemAll","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","items2","isSelected","resetSearch","genIsShort","nextIndex","searchTypeLocal","useAPI","component","popupRef","menu","getPopup","placeholder","onOpenerKeydown","e","symbolPressed","onFocus","onClickChanger","onScrollContentList","el","isVisible","TopEditArea","_sfc_main$7","TopEditInput","_sfc_main$6","TopRadioGroup","_sfc_main$5","TopCheckboxGroup","_sfc_main$4","TopSelector2","_sfc_main$2","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main$1","TopPolicy","_sfc_main"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formsExt.amd.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/policy/policy.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './types';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-forms-focusable': true,\n\t\t\t\t'top-as-input': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\talign-self: flex-end;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet searchText = '';\n\tlet nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Item[] } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = nextOffset;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет произведен\n\t *\n\t * Если текст не изменился, поиск не будет произведен\n\t *\n\t * @param newSearchText - текст поиска\n\t * @param useDebounce - дедупликация загрузки списка\n\t */\n\tconst setSearchTextAndLoad = (newSearchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (newSearchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (newSearchText === searchText && items.value.length) return;\n\n\t\tsearchText = newSearchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tsearchType: Ref<Props['searchType']>,\n\tminLength: number,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Является ли строка поиска достаточной длины для отображения меню\n\t */\n\tconst genIsShort = () => {\n\t\tif (!api.apiRequest) return false;\n\t\tif (searchType.value !== 'inline') return false;\n\t\tif (searchText.value.length >= minLength) return false;\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\t/**\n\t * Выбрать элемент\n\t *\n\t * @param item Элемент для выбора\n\t */\n\tconst selectItem = (item: Item) => {\n\t\tif (multiselect && Array.isArray(model.value)) {\n\t\t\tif (!isSelected(model.value, item)) {\n\t\t\t\tmodel.value = [...model.value, item];\n\t\t\t}\n\t\t} else {\n\t\t\tmodel.value = item;\n\t\t}\n\t};\n\n\t/**\n\t * Выбрать следующее значение\n\t */\n\tconst selectNextItem = () => {\n\t\tif (!Array.isArray(model.value)) {\n\t\t\tconst currentIndex = itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\t\tconst nextIndex = (currentIndex + 1) % itemsForShow.value.length;\n\t\t\tmodel.value = { ...itemsForShow.value[nextIndex] };\n\t\t}\n\t};\n\n\t/**\n\t * Удалить выбранное значение по id\n\t *\n\t * @param id Идентификатор элемента для удаления\n\t */\n\tconst deleteItemById = async (id: Item['id']) => {\n\t\tif (Array.isArray(model.value)) {\n\t\t\tmodel.value = model.value.filter(item => item.id !== id);\n\t\t}\n\t};\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\tgenIsShort,\n\t\titems: localItems,\n\t\titemsForShow,\n\t\tselectItem,\n\t\tselectNextItem,\n\t\tdeleteItemById,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Item[],\n\tsize: 's',\n\tminLength: 0,\n\tsearchType: 'popup',\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\nconst searchTypeLocal = computed(() => {\n\t// multiselect не поддерживает inline ввода\n\tif (props.searchType === 'inline' && props.multiselect) return 'popup';\n\n\t// В мобильной версии popup работает в полноэкранном режиме\n\tif (props.searchType === 'inline' && Core.state.isMobile) return 'popup';\n\n\treturn props.searchType;\n});\n\nlet minLength = 0;\nif (searchTypeLocal.value === 'inline' && props.minLength) {\n\tminLength = props.minLength;\n}\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, minLength, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(\n\tmodel,\n\ttoRef(props, 'items'),\n\tprops.multiselect,\n\ttoRef(props, 'appendAllValue'),\n\ttoRef(props, 'appendSearchToResult'),\n\tsearchTypeLocal,\n\tminLength,\n\tapi,\n);\n\nconst component = computed(() => {\n\tif (props.buttonProps) return 'TopButton';\n\tif (searchTypeLocal.value === 'inline') return 'TopInput';\n\n\treturn 'div';\n});\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\nif (api.apiRequest) {\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => {\n\t\tapi.setSearchTextAndLoad(menu.searchText.value);\n\n\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\tif (menu.genIsShort()) {\n\t\t\t\tgetPopup()?.close();\n\t\t\t}\n\t\t}\n\t});\n}\n\nwatch(model, () => {\n\t/**\n\t * При изменении значения модели в режиме inline необходимо очистить поле поиска,\n\t * так как поиск больше не актуален после выбора значения\n\t */\n\tif (searchTypeLocal.value === 'inline') {\n\t\tmenu.resetSearch();\n\t}\n});\n\nconst placeholder = computed(() => {\n\tif (Array.isArray(model.value) || props.multiselect || !props.selectedAsPlaceholder && searchTypeLocal.value !== 'inline') {\n\t\treturn props.placeholder;\n\t}\n\n\treturn model.value?.name || props.placeholder;\n});\n\n/**\n * Обработчик ввода клавиш на кнопке или поле ввода\n */\nconst onOpenerKeydown = (e: KeyboardEvent) => {\n\tlet needOpen = false;\n\n\tswitch (e.key) {\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tmodel.value.pop();\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowRight':\n\t\tcase 'ArrowDown':\n\t\tcase 'ArrowLeft':\n\t\tcase 'Enter':\n\t\tcase ' ':\n\t\t\tneedOpen = true;\n\n\t\t\tbreak;\n\t\tcase 'Escape':\n\t\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\t\t// очистка введенного текста\n\t\t\t\tmenu.resetSearch();\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n\n\t// введен символ\n\tconst symbolPressed = e.key.length === 1 && !e.ctrlKey && !e.metaKey;\n\n\t// введен символ\n\tif (searchTypeLocal.value === 'popup' || searchTypeLocal.value === 'inline') {\n\t\tif (symbolPressed) {\n\t\t\tneedOpen = true;\n\t\t}\n\t}\n\n\t// popup уже открыт\n\tif (getPopup()?.elPopup) {\n\t\tneedOpen = false;\n\t}\n\n\tif (needOpen) {\n\t\tif (searchTypeLocal.value === 'popup') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// введен символ\n\t\t\tif (symbolPressed) {\n\t\t\t\t// начало ввода, сразу ввести первый символ вместе с открытием popup\n\t\t\t\tif (!menu.searchText.value) {\n\t\t\t\t\tmenu.searchText.value = e.key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nlet disabledFocusToOpen = false;\n\nconst onFocus = (e: FocusEvent) => {\n\tif (disabledFocusToOpen) return;\n\n\tif (searchTypeLocal.value === 'inline') {\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nconst onClickChanger = (e: MouseEvent) => {\n\te.preventDefault();\n\n\tdisabledFocusToOpen = true;\n\t(e.currentTarget as HTMLElement)?.parentElement?.focus();\n\tdisabledFocusToOpen = false;\n\n\tmenu.selectNextItem();\n};\n\n/**\n * Обработчик открытия попапа\n */\nconst onOpen = () => {\n\tdisabledFocusToOpen = true;\n\n\tif (api.apiRequest) {\n\t\tif (menu.genIsShort()) {\n\t\t\tgetPopup()?.close();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// при открытии сразу выполнить поиск\n\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tsetTimeout(() => {\n\t\tdisabledFocusToOpen = false;\n\t}, 100);\n\n\t// очистка введенного текста\n\tif (searchTypeLocal.value === 'popup') {\n\t\tif (menu.searchText.value) menu.resetSearch();\n\t}\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\n */\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tapi.loadAppend();\n\t}\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tif (props.multiselect) {\n\t\t\t\tif (!Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\t\tname: 'Выбери меня',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = {\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ immediate: true },\n\t);\n\n\twatch(\n\t\t() => props.searchType,\n\t\t() => {\n\t\t\t// пауза для установки props в адресной строке\n\t\t\tsetTimeout(() => {\n\t\t\t\tlocation.reload();\n\t\t\t}, 500);\n\t\t},\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"onOpen()\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"searchTypeLocal !== 'inline'\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<component\n\t\t\t\t:is=\"component\"\n\n\t\t\t\t:=\"buttonProps\"\n\n\t\t\t\tref=\"subcomponentSelector\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t['top-selector2-' + modificator]: !!modificator,\n\t\t\t\t\t'top-as-input': !buttonProps,\n\t\t\t\t\t'top-as-selector': true,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t@keydown=\"onOpenerKeydown\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\n\t\t\t\t:placeholder\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t@focus=\"onFocus\"\n\t\t\t\t@blur=\"getPopup()?.isClosed ? menu.resetSearch() : ''\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Item[]\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"menu.deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"searchTypeLocal !== 'inline' && !multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span v-if=\"multiselect && !model.length\" class=\"top-selector2_placeholder top-ellipsis\">\n\t\t\t\t\t{{ placeholder }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !buttonProps && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector top-popup_widget\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"onClickChanger\"\n\t\t\t\t></span>\n\t\t\t</component>\n\t\t</template>\n\n\t\t<template #widget v-if=\"searchTypeLocal === 'popup'\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t:placeholder\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"menu.selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!api.isLoading.value && !menu.itemsForShow.value.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (searchType !== 'popup' || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n}\n\n.top-selector2::placeholder,\n.top-selector2_placeholder {\n\tcolor: var(--color-text-2);\n}\n\n.top-selector2_placeholder {\n\tpadding-left: var(--top-padding-1);\n}\n\n.top-selector2-multiselect {\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\twidth: auto;\n\tpadding: var(--top-padding-1);\n\tmargin: calc(0px - var(--top-padding-1));\n\ttransform: translateX(0);\n}\n\n.top-selector2.top-button {\n\tjustify-content: start;\n}\n\n.top-selector2.top-input_input ~ .top-changer-selector {\n\ttransform: translateX(-52px);\n}\n\n.top-selector2.top-as-selector {\n\tpadding-right: calc(var(--top-selector-arrow-width) + var(--top-padding-2));\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { TopButton } from '@/components/forms/forms';\nimport type { Props } from '@/components/formsExt/policy/types';\n\ndefineProps<Props>();\n\nconst isVisible = ref(true);\n\nconst acceptCookie = () => {\n\tconst baseDomain = location.hostname.split('.').slice(-2).join('.');\n\n\tdocument.cookie = `cookie_consent=accepted; path=/; domain=.${baseDomain}; max-age=31536000`;\n\n\tisVisible.value = false;\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"isVisible\"\n\t\tclass=\"top-policy\"\n\t>\n\t\t<div class=\"top-policy_title\">\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\tclass=\"top-policy_description\"\n\t\t\tv-html=\"text\"\n\t\t></div>\n\n\t\t<TopButton\n\t\t\tsize=\"m\"\n\t\t\t@click=\"acceptCookie\"\n\t\t>\n\t\t\t{{ $i18n.Common.Allow }}\n\t\t</TopButton>\n\t</div>\n</template>\n\n<style>\n.top-policy {\n\tbox-sizing: border-box;\n\tbox-shadow: var(--top-shadow-b);\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-bg-lightning-1);\n\twidth: 600px;\n\tpadding: var(--top-padding-4);\n\tposition: fixed;\n\tright: var(--top-gap-10);\n\tbottom: var(--top-gap-10);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-4);\n\tz-index: 10000;\n}\n\n.top-policy_title {\n\tfont-size: 24px;\n\tfont-weight: 700;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-policy {\n\t\twidth: 100%;\n\t\tright: 0;\n\t\tbottom: calc(var(--top-gap-5) + var(--toolbar-height, 0px));\n\t}\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\nimport Policy from './policy/policy.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\nexport const TopPolicy = Policy as typeof Policy & ComponentCustomProps;"],"names":["isChanged","vue","localValue","props","submit","value","emit","intermediateValue","elRef","model","_a","item","_c","_b","onChange","id","index","newModel","items","isLoading","nextOffset","apiRequest","res","cacheKey","indexWithError","searchText","callAPIRequest","loadAppend","newSearchText","minLength","modelValue","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","searchType","api","forms","localItems","localItems2","itemAll","itemsForShow","searchStringInvertKeyboard","utils_keyboard","searchString","items2","isSelected","resetSearch","genIsShort","nextIndex","searchTypeLocal","useAPI","component","popupRef","menu","getPopup","placeholder","onOpenerKeydown","e","symbolPressed","onFocus","onClickChanger","onScrollContentList","el","isVisible","TopEditArea","_sfc_main$7","TopEditInput","_sfc_main$6","TopRadioGroup","_sfc_main$5","TopCheckboxGroup","_sfc_main$4","TopSelector2","_sfc_main$2","TopMenu","menu_vue_vue_type_style_index_0_lang","TopInfo","_sfc_main$1","TopPolicy","_sfc_main"],"mappings":"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"}
|
package/formsExt/formsExt.js
CHANGED
|
@@ -376,6 +376,7 @@ const me = { class: "top-editArea_footer" }, ve = /* @__PURE__ */ L({
|
|
|
376
376
|
items: { default: () => [] },
|
|
377
377
|
title: {},
|
|
378
378
|
disabled: { type: Boolean },
|
|
379
|
+
modificator: {},
|
|
379
380
|
size: { default: "s" },
|
|
380
381
|
isError: { type: Boolean },
|
|
381
382
|
searchType: { default: "popup" },
|
|
@@ -505,6 +506,7 @@ const me = { class: "top-editArea_footer" }, ve = /* @__PURE__ */ L({
|
|
|
505
506
|
class: {
|
|
506
507
|
"top-selector2": !0,
|
|
507
508
|
"top-selector2-multiselect": e.multiselect,
|
|
509
|
+
["top-selector2-" + e.modificator]: !!e.modificator,
|
|
508
510
|
"top-as-input": !e.buttonProps,
|
|
509
511
|
"top-as-selector": !0,
|
|
510
512
|
["top-size_" + e.size]: !0,
|
package/formsExt/formsExt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formsExt.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/policy/policy.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './types';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-forms-focusable': true,\n\t\t\t\t'top-as-input': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\talign-self: flex-end;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet searchText = '';\n\tlet nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Item[] } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = nextOffset;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет произведен\n\t *\n\t * Если текст не изменился, поиск не будет произведен\n\t *\n\t * @param newSearchText - текст поиска\n\t * @param useDebounce - дедупликация загрузки списка\n\t */\n\tconst setSearchTextAndLoad = (newSearchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (newSearchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (newSearchText === searchText && items.value.length) return;\n\n\t\tsearchText = newSearchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tsearchType: Ref<Props['searchType']>,\n\tminLength: number,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Является ли строка поиска достаточной длины для отображения меню\n\t */\n\tconst genIsShort = () => {\n\t\tif (!api.apiRequest) return false;\n\t\tif (searchType.value !== 'inline') return false;\n\t\tif (searchText.value.length >= minLength) return false;\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\t/**\n\t * Выбрать элемент\n\t *\n\t * @param item Элемент для выбора\n\t */\n\tconst selectItem = (item: Item) => {\n\t\tif (multiselect && Array.isArray(model.value)) {\n\t\t\tif (!isSelected(model.value, item)) {\n\t\t\t\tmodel.value = [...model.value, item];\n\t\t\t}\n\t\t} else {\n\t\t\tmodel.value = item;\n\t\t}\n\t};\n\n\t/**\n\t * Выбрать следующее значение\n\t */\n\tconst selectNextItem = () => {\n\t\tif (!Array.isArray(model.value)) {\n\t\t\tconst currentIndex = itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\t\tconst nextIndex = (currentIndex + 1) % itemsForShow.value.length;\n\t\t\tmodel.value = { ...itemsForShow.value[nextIndex] };\n\t\t}\n\t};\n\n\t/**\n\t * Удалить выбранное значение по id\n\t *\n\t * @param id Идентификатор элемента для удаления\n\t */\n\tconst deleteItemById = async (id: Item['id']) => {\n\t\tif (Array.isArray(model.value)) {\n\t\t\tmodel.value = model.value.filter(item => item.id !== id);\n\t\t}\n\t};\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\tgenIsShort,\n\t\titems: localItems,\n\t\titemsForShow,\n\t\tselectItem,\n\t\tselectNextItem,\n\t\tdeleteItemById,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Item[],\n\tsize: 's',\n\tminLength: 0,\n\tsearchType: 'popup',\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\nconst searchTypeLocal = computed(() => {\n\t// multiselect не поддерживает inline ввода\n\tif (props.searchType === 'inline' && props.multiselect) return 'popup';\n\n\t// В мобильной версии popup работает в полноэкранном режиме\n\tif (props.searchType === 'inline' && Core.state.isMobile) return 'popup';\n\n\treturn props.searchType;\n});\n\nlet minLength = 0;\nif (searchTypeLocal.value === 'inline' && props.minLength) {\n\tminLength = props.minLength;\n}\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, minLength, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(\n\tmodel,\n\ttoRef(props, 'items'),\n\tprops.multiselect,\n\ttoRef(props, 'appendAllValue'),\n\ttoRef(props, 'appendSearchToResult'),\n\tsearchTypeLocal,\n\tminLength,\n\tapi,\n);\n\nconst component = computed(() => {\n\tif (props.buttonProps) return 'TopButton';\n\tif (searchTypeLocal.value === 'inline') return 'TopInput';\n\n\treturn 'div';\n});\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\nif (api.apiRequest) {\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => {\n\t\tapi.setSearchTextAndLoad(menu.searchText.value);\n\n\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\tif (menu.genIsShort()) {\n\t\t\t\tgetPopup()?.close();\n\t\t\t}\n\t\t}\n\t});\n}\n\nwatch(model, () => {\n\t/**\n\t * При изменении значения модели в режиме inline необходимо очистить поле поиска,\n\t * так как поиск больше не актуален после выбора значения\n\t */\n\tif (searchTypeLocal.value === 'inline') {\n\t\tmenu.resetSearch();\n\t}\n});\n\nconst placeholder = computed(() => {\n\tif (Array.isArray(model.value) || props.multiselect || !props.selectedAsPlaceholder && searchTypeLocal.value !== 'inline') {\n\t\treturn props.placeholder;\n\t}\n\n\treturn model.value?.name || props.placeholder;\n});\n\n/**\n * Обработчик ввода клавиш на кнопке или поле ввода\n */\nconst onOpenerKeydown = (e: KeyboardEvent) => {\n\tlet needOpen = false;\n\n\tswitch (e.key) {\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tmodel.value.pop();\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowRight':\n\t\tcase 'ArrowDown':\n\t\tcase 'ArrowLeft':\n\t\tcase 'Enter':\n\t\tcase ' ':\n\t\t\tneedOpen = true;\n\n\t\t\tbreak;\n\t\tcase 'Escape':\n\t\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\t\t// очистка введенного текста\n\t\t\t\tmenu.resetSearch();\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n\n\t// введен символ\n\tconst symbolPressed = e.key.length === 1 && !e.ctrlKey && !e.metaKey;\n\n\t// введен символ\n\tif (searchTypeLocal.value === 'popup' || searchTypeLocal.value === 'inline') {\n\t\tif (symbolPressed) {\n\t\t\tneedOpen = true;\n\t\t}\n\t}\n\n\t// popup уже открыт\n\tif (getPopup()?.elPopup) {\n\t\tneedOpen = false;\n\t}\n\n\tif (needOpen) {\n\t\tif (searchTypeLocal.value === 'popup') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// введен символ\n\t\t\tif (symbolPressed) {\n\t\t\t\t// начало ввода, сразу ввести первый символ вместе с открытием popup\n\t\t\t\tif (!menu.searchText.value) {\n\t\t\t\t\tmenu.searchText.value = e.key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nlet disabledFocusToOpen = false;\n\nconst onFocus = (e: FocusEvent) => {\n\tif (disabledFocusToOpen) return;\n\n\tif (searchTypeLocal.value === 'inline') {\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nconst onClickChanger = (e: MouseEvent) => {\n\te.preventDefault();\n\n\tdisabledFocusToOpen = true;\n\t(e.currentTarget as HTMLElement)?.parentElement?.focus();\n\tdisabledFocusToOpen = false;\n\n\tmenu.selectNextItem();\n};\n\n/**\n * Обработчик открытия попапа\n */\nconst onOpen = () => {\n\tdisabledFocusToOpen = true;\n\n\tif (api.apiRequest) {\n\t\tif (menu.genIsShort()) {\n\t\t\tgetPopup()?.close();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// при открытии сразу выполнить поиск\n\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tsetTimeout(() => {\n\t\tdisabledFocusToOpen = false;\n\t}, 100);\n\n\t// очистка введенного текста\n\tif (searchTypeLocal.value === 'popup') {\n\t\tif (menu.searchText.value) menu.resetSearch();\n\t}\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\n */\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tapi.loadAppend();\n\t}\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tif (props.multiselect) {\n\t\t\t\tif (!Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\t\tname: 'Выбери меня',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = {\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ immediate: true },\n\t);\n\n\twatch(\n\t\t() => props.searchType,\n\t\t() => {\n\t\t\t// пауза для установки props в адресной строке\n\t\t\tsetTimeout(() => {\n\t\t\t\tlocation.reload();\n\t\t\t}, 500);\n\t\t},\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"onOpen()\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"searchTypeLocal !== 'inline'\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<component\n\t\t\t\t:is=\"component\"\n\n\t\t\t\t:=\"buttonProps\"\n\n\t\t\t\tref=\"subcomponentSelector\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t'top-as-input': !buttonProps,\n\t\t\t\t\t'top-as-selector': true,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t@keydown=\"onOpenerKeydown\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\n\t\t\t\t:placeholder\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t@focus=\"onFocus\"\n\t\t\t\t@blur=\"getPopup()?.isClosed ? menu.resetSearch() : ''\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Item[]\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"menu.deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"searchTypeLocal !== 'inline' && !multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span v-if=\"multiselect && !model.length\" class=\"top-selector2_placeholder top-ellipsis\">\n\t\t\t\t\t{{ placeholder }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !buttonProps && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector top-popup_widget\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"onClickChanger\"\n\t\t\t\t></span>\n\t\t\t</component>\n\t\t</template>\n\n\t\t<template #widget v-if=\"searchTypeLocal === 'popup'\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t:placeholder\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"menu.selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!api.isLoading.value && !menu.itemsForShow.value.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (searchType !== 'popup' || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n}\n\n.top-selector2::placeholder,\n.top-selector2_placeholder {\n\tcolor: var(--color-text-2);\n}\n\n.top-selector2_placeholder {\n\tpadding-left: var(--top-padding-1);\n}\n\n.top-selector2-multiselect {\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\twidth: auto;\n\tpadding: var(--top-padding-1);\n\tmargin: calc(0px - var(--top-padding-1));\n\ttransform: translateX(0);\n}\n\n.top-selector2.top-button {\n\tjustify-content: start;\n}\n\n.top-selector2.top-input_input ~ .top-changer-selector {\n\ttransform: translateX(-52px);\n}\n\n.top-selector2.top-as-selector {\n\tpadding-right: calc(var(--top-selector-arrow-width) + var(--top-padding-2));\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { TopButton } from '@/components/forms/forms';\nimport type { Props } from '@/components/formsExt/policy/types';\n\ndefineProps<Props>();\n\nconst isVisible = ref(true);\n\nconst acceptCookie = () => {\n\tconst baseDomain = location.hostname.split('.').slice(-2).join('.');\n\n\tdocument.cookie = `cookie_consent=accepted; path=/; domain=.${baseDomain}; max-age=31536000`;\n\n\tisVisible.value = false;\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"isVisible\"\n\t\tclass=\"top-policy\"\n\t>\n\t\t<div class=\"top-policy_title\">\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\tclass=\"top-policy_description\"\n\t\t\tv-html=\"text\"\n\t\t></div>\n\n\t\t<TopButton\n\t\t\tsize=\"m\"\n\t\t\t@click=\"acceptCookie\"\n\t\t>\n\t\t\t{{ $i18n.Common.Allow }}\n\t\t</TopButton>\n\t</div>\n</template>\n\n<style>\n.top-policy {\n\tbox-sizing: border-box;\n\tbox-shadow: var(--top-shadow-b);\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-bg-lightning-1);\n\twidth: 600px;\n\tpadding: var(--top-padding-4);\n\tposition: fixed;\n\tright: var(--top-gap-10);\n\tbottom: var(--top-gap-10);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-4);\n\tz-index: 10000;\n}\n\n.top-policy_title {\n\tfont-size: 24px;\n\tfont-weight: 700;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-policy {\n\t\twidth: 100%;\n\t\tright: 0;\n\t\tbottom: calc(var(--top-gap-5) + var(--toolbar-height, 0px));\n\t}\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\nimport Policy from './policy/policy.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\nexport const TopPolicy = Policy as typeof Policy & ComponentCustomProps;"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","submit","value","cancel","clickOnTitle","intermediateValue","watch","toRef","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","onChange","id","newModel","index","useAPI","apiRequest","minLength","useCache","items","isLoading","searchText","nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","newSearchText","useDebounce","ITEM_ID_ALL","isSelected","modelValue","checkNameForNullId","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","searchType","api","itemAll","useI18n","resetSearch","genIsShort","localItems","localItems2","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","items2","itemName","nextIndex","searchTypeLocal","Core","menu","component","popupRef","getPopup","placeholder","onOpenerKeydown","needOpen","symbolPressed","disabledFocusToOpen","onFocus","onClickChanger","onOpen","onClose","onScrollContentList","el","isVisible","acceptCookie","baseDomain","TopEditArea","_sfc_main$7","TopEditInput","_sfc_main$6","TopRadioGroup","_sfc_main$5","TopCheckboxGroup","_sfc_main$4","TopSelector2","_sfc_main$2","TopMenu","_sfc_main$b","TopInfo","_sfc_main$1","TopPolicy","_sfc_main"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formsExt.js","sources":["../../src/components/formsExt/editArea/editArea.vue","../../src/components/formsExt/editInput/editInput.vue","../../src/components/formsExt/radioGroup/radioGroup.vue","../../src/components/formsExt/checkboxGroup/checkboxGroup.vue","../../src/components/formsExt/selector2/composables/useAPI.ts","../../src/components/formsExt/selector2/utils.ts","../../src/components/formsExt/selector2/composables/useMenu.ts","../../src/components/formsExt/selector2/selector2.vue","../../src/components/formsExt/policy/policy.vue","../../src/components/formsExt/formsExt.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport Button from '@/components/forms/button/button.vue';\nimport type { Emits, Props } from './types';\nimport Textarea from '@/components/forms/textarea/textarea.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\tdefaultValue: '',\n\tcancelText: 'Cancel',\n\tsubmitText: 'Send',\n\tcloseText: 'Close',\n\texpandable: true,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst localValue = ref(props.defaultValue);\n\nconst isFocused = ref(props.isFocused);\n\nconst isChanged = computed(() => localValue.value !== props.defaultValue);\n\nconst submit = (value: string) => {\n\temit('submit', value);\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst cancel = () => {\n\tif (props.forceShowCloseBtn && !isChanged.value) {\n\t\temit('close');\n\n\t\treturn;\n\t}\n\n\tlocalValue.value = props.defaultValue;\n};\n\nconst clickOnTitle = () => {\n\tif (props.attachToKeyboard) emit('clickOnTitle');\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'top-editArea': true,\n\t\t\t'top-editArea-attachedToKeyboard': attachToKeyboard,\n\t\t}\"\n\t>\n\t\t<div\n\t\t\tv-if=\"title\"\n\t\t\tclass=\"top-editArea_title\"\n\t\t\t@click=\"clickOnTitle()\"\n\t\t>\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'top-editArea_form': true,\n\t\t\t\t'top-forms-focusable': true,\n\t\t\t\t'top-as-input': true,\n\t\t\t\t'top-error': isError,\n\t\t\t\t'top-focus': isFocused,\n\t\t\t}\"\n\t\t>\n\t\t\t<Textarea\n\t\t\t\tv-model=\"localValue\"\n\t\t\t\t:name=\"name\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:rows=\"rows\"\n\t\t\t\t:minHeight=\"minHeight\"\n\t\t\t\t:expandable=\"expandable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:hint=\"hint\"\n\t\t\t\tclass=\"top-editArea_element\"\n\t\t\t\t@focus=\"() => isFocused = true\"\n\t\t\t\t@blur=\"() => isFocused = false\"\n\t\t\t\t@keyup.esc=\"cancel\"\n\t\t\t\t@keyup.ctrl.enter=\"submit(localValue)\"\n\t\t\t/>\n\n\t\t\t<div class=\"top-editArea_footer\">\n\t\t\t\t<Button\n\t\t\t\t\tv-if=\"isChanged || forceShowCloseBtn\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\tstyling=\"soft\"\n\t\t\t\t\t@click=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ cancelText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\tclass=\"top-editArea_button\"\n\t\t\t\t\tv-if=\"isChanged\"\n\t\t\t\t\t:icon=\"$core.state.isMobile ? '': ''\"\n\t\t\t\t\t@click=\"submit(localValue)\"\n\t\t\t\t>\n\t\t\t\t\t<template\n\t\t\t\t\t\t#default\n\t\t\t\t\t\tv-if=\"!$core.state.isMobile\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ submitText }}\n\t\t\t\t\t</template>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.top-editArea {\n\t--top-editArea-bottom: env(keyboard-inset-height, 0px);\n\t--top-editArea-offset-bottom: 0px;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.top-editArea_title {\n\tfont-size: 12px;\n}\n\n.top-editArea_form {\n\tflex-direction: column;\n}\n\n/* textarea в EditArea */\n.top-textarea {\n\twidth: 100%;\n}\n\n.top-editArea_element.top-textarea_textarea {\n\t--top-forms-border-width: 0px;\n\n\toutline: none;\n\tanimation: none;\n}\n\n/* footer */\n.top-editArea_footer {\n\tpadding: var(--top-forms-padding);\n\tdisplay: flex;\n\tmin-height: 32px;\n\talign-self: flex-end;\n\tjustify-content: flex-end;\n\tgap: var(--top-forms-padding);\n}\n\n/* attachedToKeyboard */\n.top-editArea-attachedToKeyboard {\n\tbackground: var(--top-forms-background-color);\n\tposition: fixed;\n\tbottom: calc(var(--top-editArea-offset-bottom) + var(--top-editArea-bottom));\n\tright: 0;\n\tleft: 0;\n\tz-index: 2;\n\tgap: 0;\n\ttransition: bottom var(--transition-fast);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_form {\n\tborder-radius: 0;\n\tborder: none;\n\tborder-top: 1px solid var(--top-forms-border-color);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_title {\n\tcursor: pointer;\n\tborder-top: 1px solid var(--color-line-2-opacity);\n\tpadding: var(--top-forms-padding);\n}\n\n.top-editArea-attachedToKeyboard .top-editArea_footer > [data-top-icon] {\n\tborder-radius: 100%;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-editArea_form{\n\t\tflex-direction: row;\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, toRef, watch } from 'vue';\nimport type { Emits, Props } from './types';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\n\nconst props = defineProps<Props>();\n\nconst intermediateValue = ref(props.modelValue);\n\nwatch(toRef(props.modelValue), () => {\n\tintermediateValue.value = props.modelValue;\n});\n\nconst emit = defineEmits<Emits>();\n\nconst submit = () => {\n\temit('update:modelValue', intermediateValue.value);\n};\n</script>\n\n<template>\n\t<div class=\"top-editInput\">\n\t\t<TopInput\n\t\t\t:=\"input\"\n\t\t\t@keydown.esc.capture.stop=\"intermediateValue = modelValue\"\n\t\t\t@keydown.enter.stop=\"submit\"\n\t\t\tv-model=\"intermediateValue\"\n\t\t/>\n\n\t\t<TopButton\n\t\t\tv-if=\"intermediateValue !== modelValue\"\n\t\t\ticon=\"\"\n\t\t\tstyling=\"soft\"\n\t\t\t:=\"button\"\n\t\t\t@click=\"submit\"\n\t\t/>\n\t</div>\n</template>\n\n<style>\n.top-editInput {\n\twidth: 220px;\n\tflex-grow: 1;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: var(--top-gap-1);\n}\n\n.top-editInput .top-input {\n\twidth: unset;\n\tflex-grow: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Ref } from '@vue/reactivity';\nimport { ref, watch } from 'vue';\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n\tsize: 's',\n});\n\nconst elRef: Ref<HTMLElement | null> = ref(null);\n\nwatch(model, () => {\n\tif (!props.radiosProps?.some(item => item.value === model.value)) {\n\t\tmodel.value = props.radiosProps?.[0]?.value ?? '';\n\t}\n\n\telRef.value?.querySelector('.radioGroup_item-selected')?.scrollIntoView();\n}, { immediate: true });\n\nconst uid = 'radioGroup-' + Math.random();\n</script>\n\n<template>\n\t<div\n\t\tref=\"elRef\"\n\t\t:class=\"{\n\t\t\t['top-radioGroup']: true,\n\t\t\t['top-scrollBarXHidding']: true,\n\t\t\t['top-size_' + size]: !!size,\n\t\t\t['top-error']: isError,\n\t\t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item of radiosProps\"\n\t\t\t:class=\"{\n\t\t\t\t['top-radioGroup_item-selected']: item.value === model,\n\t\t\t\t['top-radioGroup_item']: true,\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t\t@click=\"model = item.value\"\n\t\t>\n\t\t\t{{ item.title }}\n\n\t\t\t<span\n\t\t\t\tv-if=\"showIndicator\"\n\t\t\t\tclass=\"top-radioGroup_circle\"\n\t\t\t></span>\n\n\t\t\t<!-- Для нативной навигации -->\n\t\t\t<input\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:name=\"uid\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t['top-unvisible']: true,\n\t\t\t\t}\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t/>\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-radioGroup {\n\tuser-select: none;\n\tbox-sizing: border-box;\n\tborder-radius: 8px;\n\tbackground-color: var(--color-layout-middle);\n\theight: var(--top-forms-base-height);\n\tpadding: 2px;\n\tgap: 2px;\n\tdisplay: flex;\n\talign-items: flex-start;\n}\n\n.top-radioGroup_item {\n\tcolor: var(--color-text-2);\n\tcursor: pointer;\n\tbox-sizing: border-box;\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n\tpadding: 0 16px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-grow: 1;\n\tgap: 4px;\n}\n\n.top-radioGroup_item:hover {\n\tbackground-color: var(--color-layout-front-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* selected */\n.top-radioGroup_item-selected {\n\tcolor: var(--color-text-1);\n\tpointer-events: none;\n\tbackground-color: var(--color-bg-lightning-1);\n\tbox-shadow: 0px 4px 32px 0px rgba(4, 9, 84, 0.10), 0px 0px 4px 0px rgba(4, 9, 84, 0.08);\n}\n\n/* circle */\n.top-radioGroup_circle {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-line-3-opacity);\n\tborder-radius: 50%;\n\tpadding: 3px;\n\tmargin-left: auto;\n\twidth: calc(var(--top-forms-option-height) - 3px * 2);\n\theight: calc(var(--top-forms-option-height) - 3px * 2);\n}\n\n.top-radioGroup_item:hover .top-radioGroup_circle:before {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* circle selected */\n.top-radioGroup_item-selected .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n\tborder-width: 5px;\n}\n\n.top-radioGroup_item-selected:hover .top-radioGroup_circle {\n\tborder-color: var(--color-line-primary-1);\n}\n\n/* top-error */\n.top-radioGroup.top-error .top-radioGroup_item:not(.top-disabled) .top-radioGroup_circle {\n\tborder-color: var(--color-line-negative-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from './types';\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nwithDefaults(defineProps<Props>(), {\n\tsize: 's',\n\tstyling: 'outline',\n});\n\nconst onChange = (id: Props['modelValue'][number]) => {\n\tconst newModel = [...model.value];\n\tconst index = newModel.indexOf(id);\n\n\tif (index === -1) {\n\t\tnewModel.push(id);\n\t} else {\n\t\tnewModel.splice(index, 1);\n\t}\n\n\tmodel.value = newModel;\n};\n</script>\n\n<template>\n\t<div\n\t\t:class=\"{\n \t\t['top-checkboxGroup']: true,\n \t\t['top-checkboxGroup-' + styling]: true,\n \t\t['top-scrollBarXHidding']: true,\n \t\t['top-size_' + size]: !!size,\n \t\t['top-error']: isError,\n \t}\"\n\t>\n\t\t<label\n\t\t\tv-for=\"item in items\"\n\t\t\t:key=\"item.id\"\n\t\t\t:class=\"{\n\t\t\t\t['top-checkboxGroup_item']: true,\n\t\t\t\t['top-checkboxGroup_item-selected']: model.includes(item.id),\n\t\t\t\t['top-forms-focusable']: true,\n\t\t\t\t['top-disabled']: item.disabled,\n\t\t\t}\"\n\t\t\t:data-top-icon=\"item.icon\"\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tclass=\"top-unvisible\"\n\t\t\t\t:value=\"item.id\"\n\t\t\t\t:checked=\"model.includes(item.id)\"\n\t\t\t\t:disabled=\"item.disabled\"\n\t\t\t\t@change=\"onChange(item.id)\"\n\t\t\t/>\n\n\t\t\t{{ item.title }}\n\t\t</label>\n\t</div>\n</template>\n\n<style>\n.top-checkboxGroup {\n\tuser-select: none;\n\tborder-radius: 8px;\n\theight: var(--top-forms-base-height);\n\tbox-sizing: border-box;\n\tdisplay: flex;\n}\n\n.top-checkboxGroup_item {\n\tbox-sizing: border-box;\n\tpadding: 1px var(--top-padding-4);\n\tcursor: pointer;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tdisplay: flex;\n\tflex-grow: 1;\n\tjustify-content: center;\n\talign-items: center;\n\tgap: var(--top-gap-1);\n}\n\n/* outline */\n.top-checkboxGroup-outline {\n\tborder: 1px solid var(--color-line-1);\n\tbackground: var(--color-layout-front-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item {\n\theight: calc(var(--top-forms-base-height) - 2px);\n\tmin-height: 100%;\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-primary-1);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-outline .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-layer-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-outline.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n\n/* borderless */\n.top-checkboxGroup-borderless {\n\tpadding: 2px;\n\tbackground: var(--color-bg-shading-2);\n\tgap: 2px;\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item {\n\tborder-radius: 6px;\n\theight: calc(var(--top-forms-base-height) - 4px);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item:hover {\n\tbox-shadow: var(--top-shadow-s);\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-primary-1);\n\tcolor: var(--color-text-white);\n\t--top-icon-color: var(--color-text-white);\n}\n\n.top-checkboxGroup-borderless .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-primary-2);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item:hover {\n\tbackground: var(--color-bg-lightning-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected {\n\tbackground: var(--color-bg-negative-1);\n}\n\n.top-checkboxGroup-borderless.top-error .top-checkboxGroup_item-selected:hover {\n\tbackground: var(--color-bg-negative-2);\n}\n</style>\n","import { ref } from 'vue';\nimport { debounce } from '../../../../core/utils/lodash';\nimport type { Item, Props } from '../types';\n\nexport type API = ReturnType<typeof useAPI>;\n\nexport const useAPI = (apiRequest: Props['apiRequest'], minLength: number, useCache: Props['useCache']) => {\n\t/**\n\t * Список, полученный через API\n\t */\n\tconst items = ref<Item[]>([]);\n\n\t/**\n\t * Флаг - идет загрузка\n\t */\n\tconst isLoading = ref(false);\n\n\tlet searchText = '';\n\tlet nextOffset: number | undefined;\n\n\tif (apiRequest && !apiRequest.params.limit) {\n\t\tapiRequest.params.limit = 100;\n\t}\n\n\t/**\n\t * Выполнить обращение к API\n\t *\n\t * При ошибке вернет undefined\n\t */\n\tconst callAPIRequest = async (): Promise<{ nextOffset?: number, result: Item[] } | undefined> => {\n\t\tif (!apiRequest) return;\n\n\t\tlet res;\n\t\tlet cacheKey;\n\n\t\tif (useCache) {\n\t\t\t// кэш для полученных ответов через apiRequest\n\t\t\t// общий для всех компонентов, использующих apiRequest\n\t\t\tapiRequest.cache ??= new Map();\n\n\t\t\tcacheKey = JSON.stringify(apiRequest.params);\n\t\t\tres = apiRequest.cache.get(cacheKey);\n\n\t\t\tif (res) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tisLoading.value = true;\n\t\tres = await apiRequest.call();\n\t\tisLoading.value = false;\n\n\t\tif (res.errors) return;\n\n\t\tif (!Array.isArray(res.result)) {\n\t\t\tconsole.warn(`В result ожидался массив`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst indexWithError = (res.result as Array<Item | any>).findIndex(item => item.id === undefined || item.name === undefined);\n\t\tif (indexWithError !== -1) {\n\t\t\tconsole.warn(`В result[${indexWithError}] нет id или name`);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (useCache) {\n\t\t\tapiRequest.cache.set(cacheKey as string, res);\n\t\t}\n\n\t\treturn res;\n\t};\n\n\t/**\n\t * Загрузить items\n\t */\n\tconst load = async () => {\n\t\tif (!apiRequest) return;\n\n\t\tapiRequest.params.offset = 0;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = res.result;\n\t};\n\n\t/**\n\t * Загрузить следующую страницу items\n\t */\n\tconst loadAppend = async () => {\n\t\tif (!apiRequest) return;\n\n\t\t// данных о следующих страницах не обнаружено\n\t\tif (!nextOffset) return;\n\n\t\t// дозагружать нельзя, если не завершена предыдущшая загрузка\n\t\tif (isLoading.value) return;\n\n\t\tapiRequest.params.offset = nextOffset;\n\t\tapiRequest.params.search = searchText;\n\n\t\tconst res = await callAPIRequest();\n\t\tif (!res) return;\n\n\t\tnextOffset = res.nextOffset;\n\n\t\titems.value = items.value.concat(res.result);\n\t};\n\n\tconst loadDebounce = debounce(() => load(), 200);\n\n\t/**\n\t * Выполнить поиск по указанному тексту\n\t *\n\t * Если длина текста меньше minLength, поиск не будет произведен\n\t *\n\t * Если текст не изменился, поиск не будет произведен\n\t *\n\t * @param newSearchText - текст поиска\n\t * @param useDebounce - дедупликация загрузки списка\n\t */\n\tconst setSearchTextAndLoad = (newSearchText: string, useDebounce = true) => {\n\t\tif (!apiRequest) return;\n\n\t\tif (newSearchText.length < minLength) return;\n\n\t\t// условия поиска не поменялись, данные загружены\n\t\tif (newSearchText === searchText && items.value.length) return;\n\n\t\tsearchText = newSearchText;\n\n\t\tif (useDebounce) {\n\t\t\tvoid loadDebounce();\n\t\t} else {\n\t\t\tvoid load();\n\t\t}\n\t};\n\n\treturn {\n\t\tapiRequest,\n\t\titems,\n\t\tisLoading,\n\t\tloadAppend,\n\t\tsetSearchTextAndLoad,\n\t};\n};\n","import type { Item, Props } from './types';\n\nexport const ITEM_ID_ALL = 0;\n\n/**\n * Выбран ли элемент\n */\nexport const isSelected = (modelValue: Props['modelValue'], item: Item, checkNameForNullId = true) => {\n\tif (checkNameForNullId && item.id === null) {\n\t\tif (Array.isArray(modelValue)) {\n\t\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id && itemSelected.name === item.name);\n\t\t} else {\n\t\t\treturn item.name === modelValue.name;\n\t\t}\n\t}\n\n\tif (Array.isArray(modelValue)) {\n\t\treturn modelValue.some(itemSelected => itemSelected.id === item.id);\n\t} else {\n\t\treturn item.id === modelValue.id;\n\t}\n};\n","import { computed, ref, type ComputedRef, type Ref } from 'vue';\nimport { invertKeyboardLayout } from '@/core/utils/keyboard';\nimport type { Item, Props } from '../types';\nimport { type API } from './useAPI';\nimport { isSelected, ITEM_ID_ALL } from '../utils';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Функционал поиска\n */\nexport const useMenu = (\n\tmodel: Ref<Props['modelValue']>,\n\titems: Ref<Props['items']>,\n\tmultiselect: Props['multiselect'],\n\tappendAllValue: Ref<Props['appendAllValue']>,\n\tappendSearchToResult: Ref<Props['appendSearchToResult']>,\n\tsearchType: Ref<Props['searchType']>,\n\tminLength: number,\n\tapi: API,\n) => {\n\t/**\n\t * Текст поиска по результатам\n\t */\n\tconst searchText = ref('');\n\n\t/**\n\t * Объект, представляющий опцию \"Все\"\n\t */\n\tconst itemAll = {\n\t\tid: ITEM_ID_ALL,\n\t\tname: useI18n().Common.All,\n\t};\n\n\t/**\n\t * Сброс поиска\n\t */\n\tconst resetSearch = () => {\n\t\tsearchText.value = '';\n\t\tapi.items.value = [];\n\t};\n\n\t/**\n\t * Является ли строка поиска достаточной длины для отображения меню\n\t */\n\tconst genIsShort = () => {\n\t\tif (!api.apiRequest) return false;\n\t\tif (searchType.value !== 'inline') return false;\n\t\tif (searchText.value.length >= minLength) return false;\n\n\t\treturn true;\n\t};\n\n\t/**\n\t * Варианты выбора: props.items + \"Выбрать все\"\n\t */\n\tconst localItems: ComputedRef<Item[]> = computed(() => {\n\t\tconst localItems: Item[] = [];\n\n\t\tif (!multiselect && appendAllValue.value) {\n\t\t\tlocalItems.push(itemAll);\n\t\t}\n\n\t\titems.value?.forEach(item => localItems.push({ ...item }));\n\n\t\treturn localItems;\n\t});\n\n\t/**\n\t * Подготовленный список меню, который содержит в сумме:\n\t * - prop.items: указанный список с учетом фильтра и опций компонента\n\t * - api.items: результаты api запроса, если используется api\n\t *\n\t * @returns Отфильтрованный массив элементов для отображения\n\t */\n\tconst itemsForShow = computed(() => {\n\t\tconst searchString = searchText.value.toLowerCase();\n\t\tconst searchStringInvertKeyboard = invertKeyboardLayout(searchString);\n\n\t\tlet items: NonNullable<Props['items']> = [];\n\n\t\tlocalItems.value.forEach((item) => {\n\t\t\tconst itemName = item.name.toLowerCase();\n\n\t\t\tif (\n\t\t\t\titem.id === Number(searchString) ||\n\t\t\t\titemName.includes(searchString) ||\n\t\t\t\titemName.includes(searchStringInvertKeyboard)\n\t\t\t) {\n\t\t\t\tif (itemName === searchString || itemName === searchStringInvertKeyboard) {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t} else {\n\t\t\t\t\titems.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titems.push(...api.items.value);\n\n\t\t// ввод произвольного значения\n\t\tif (\n\t\t\tappendSearchToResult.value &&\n\t\t\t!!searchText.value &&\n\t\t\t(!items.length || items[0].name.toLowerCase() !== searchString)\n\t\t) {\n\t\t\titems.push({\n\t\t\t\tid: null,\n\t\t\t\tname: searchText.value,\n\t\t\t});\n\t\t}\n\n\t\tif (multiselect) {\n\t\t\titems = items.filter(item => !isSelected(model.value, item));\n\t\t}\n\n\t\treturn items;\n\t});\n\n\t/**\n\t * Выбрать элемент\n\t *\n\t * @param item Элемент для выбора\n\t */\n\tconst selectItem = (item: Item) => {\n\t\tif (multiselect && Array.isArray(model.value)) {\n\t\t\tif (!isSelected(model.value, item)) {\n\t\t\t\tmodel.value = [...model.value, item];\n\t\t\t}\n\t\t} else {\n\t\t\tmodel.value = item;\n\t\t}\n\t};\n\n\t/**\n\t * Выбрать следующее значение\n\t */\n\tconst selectNextItem = () => {\n\t\tif (!Array.isArray(model.value)) {\n\t\t\tconst currentIndex = itemsForShow.value.findIndex(item => item.id === (model.value as Item).id);\n\t\t\tconst nextIndex = (currentIndex + 1) % itemsForShow.value.length;\n\t\t\tmodel.value = { ...itemsForShow.value[nextIndex] };\n\t\t}\n\t};\n\n\t/**\n\t * Удалить выбранное значение по id\n\t *\n\t * @param id Идентификатор элемента для удаления\n\t */\n\tconst deleteItemById = async (id: Item['id']) => {\n\t\tif (Array.isArray(model.value)) {\n\t\t\tmodel.value = model.value.filter(item => item.id !== id);\n\t\t}\n\t};\n\n\treturn {\n\t\tsearchText,\n\t\tresetSearch,\n\t\tgenIsShort,\n\t\titems: localItems,\n\t\titemsForShow,\n\t\tselectItem,\n\t\tselectNextItem,\n\t\tdeleteItemById,\n\t};\n};\n","<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue';\nimport Core from '@/core/core/core';\nimport { TopPopup, TopPopupListItem, TopPopupWidgetInput } from '@/components/popup/popup';\nimport { TopPreloader } from '@/components/forms/forms';\nimport type { Item, Props, Slots } from './types';\nimport Selector2ItemMulti from './itemMulti.vue';\nimport { useAPI } from './composables/useAPI';\nimport { useMenu } from './composables/useMenu';\nimport type { TopLibPopup } from '../../popup/lib/popup';\n\nconst props = withDefaults(defineProps<Props>(), {\n\titems: () => [] as Item[],\n\tsize: 's',\n\tminLength: 0,\n\tsearchType: 'popup',\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\ndefineSlots<Slots>();\n\nconst searchTypeLocal = computed(() => {\n\t// multiselect не поддерживает inline ввода\n\tif (props.searchType === 'inline' && props.multiselect) return 'popup';\n\n\t// В мобильной версии popup работает в полноэкранном режиме\n\tif (props.searchType === 'inline' && Core.state.isMobile) return 'popup';\n\n\treturn props.searchType;\n});\n\nlet minLength = 0;\nif (searchTypeLocal.value === 'inline' && props.minLength) {\n\tminLength = props.minLength;\n}\n\n/**\n * Объект для работы с API\n */\nconst api = useAPI(props.apiRequest, minLength, props.useCache);\n\n/**\n * Объект для работы с меню\n */\nconst menu = useMenu(\n\tmodel,\n\ttoRef(props, 'items'),\n\tprops.multiselect,\n\ttoRef(props, 'appendAllValue'),\n\ttoRef(props, 'appendSearchToResult'),\n\tsearchTypeLocal,\n\tminLength,\n\tapi,\n);\n\nconst component = computed(() => {\n\tif (props.buttonProps) return 'TopButton';\n\tif (searchTypeLocal.value === 'inline') return 'TopInput';\n\n\treturn 'div';\n});\n\n/**\n * Экземпляр компонента Popup\n */\nconst popupRef = ref<any>(null);\n\n/**\n * Получить доступ к объекту popup\n */\nconst getPopup = (): TopLibPopup | undefined => {\n\treturn popupRef.value?.popup;\n};\n\nif (api.apiRequest) {\n\t// отложенный поиск при вводе текста\n\twatch(menu.searchText, () => {\n\t\tapi.setSearchTextAndLoad(menu.searchText.value);\n\n\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\tif (menu.genIsShort()) {\n\t\t\t\tgetPopup()?.close();\n\t\t\t}\n\t\t}\n\t});\n}\n\nwatch(model, () => {\n\t/**\n\t * При изменении значения модели в режиме inline необходимо очистить поле поиска,\n\t * так как поиск больше не актуален после выбора значения\n\t */\n\tif (searchTypeLocal.value === 'inline') {\n\t\tmenu.resetSearch();\n\t}\n});\n\nconst placeholder = computed(() => {\n\tif (Array.isArray(model.value) || props.multiselect || !props.selectedAsPlaceholder && searchTypeLocal.value !== 'inline') {\n\t\treturn props.placeholder;\n\t}\n\n\treturn model.value?.name || props.placeholder;\n});\n\n/**\n * Обработчик ввода клавиш на кнопке или поле ввода\n */\nconst onOpenerKeydown = (e: KeyboardEvent) => {\n\tlet needOpen = false;\n\n\tswitch (e.key) {\n\t\tcase 'Delete':\n\t\tcase 'Backspace':\n\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\tmodel.value.pop();\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'ArrowUp':\n\t\tcase 'ArrowRight':\n\t\tcase 'ArrowDown':\n\t\tcase 'ArrowLeft':\n\t\tcase 'Enter':\n\t\tcase ' ':\n\t\t\tneedOpen = true;\n\n\t\t\tbreak;\n\t\tcase 'Escape':\n\t\t\tif (searchTypeLocal.value === 'inline') {\n\t\t\t\t// очистка введенного текста\n\t\t\t\tmenu.resetSearch();\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n\n\t// введен символ\n\tconst symbolPressed = e.key.length === 1 && !e.ctrlKey && !e.metaKey;\n\n\t// введен символ\n\tif (searchTypeLocal.value === 'popup' || searchTypeLocal.value === 'inline') {\n\t\tif (symbolPressed) {\n\t\t\tneedOpen = true;\n\t\t}\n\t}\n\n\t// popup уже открыт\n\tif (getPopup()?.elPopup) {\n\t\tneedOpen = false;\n\t}\n\n\tif (needOpen) {\n\t\tif (searchTypeLocal.value === 'popup') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\t// введен символ\n\t\t\tif (symbolPressed) {\n\t\t\t\t// начало ввода, сразу ввести первый символ вместе с открытием popup\n\t\t\t\tif (!menu.searchText.value) {\n\t\t\t\t\tmenu.searchText.value = e.key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nlet disabledFocusToOpen = false;\n\nconst onFocus = (e: FocusEvent) => {\n\tif (disabledFocusToOpen) return;\n\n\tif (searchTypeLocal.value === 'inline') {\n\t\t(e.currentTarget as HTMLElement)?.click();\n\t}\n};\n\nconst onClickChanger = (e: MouseEvent) => {\n\te.preventDefault();\n\n\tdisabledFocusToOpen = true;\n\t(e.currentTarget as HTMLElement)?.parentElement?.focus();\n\tdisabledFocusToOpen = false;\n\n\tmenu.selectNextItem();\n};\n\n/**\n * Обработчик открытия попапа\n */\nconst onOpen = () => {\n\tdisabledFocusToOpen = true;\n\n\tif (api.apiRequest) {\n\t\tif (menu.genIsShort()) {\n\t\t\tgetPopup()?.close();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// при открытии сразу выполнить поиск\n\t\tapi.setSearchTextAndLoad(menu.searchText.value, false);\n\t}\n};\n\n/**\n * Обработчик закрытия попапа\n */\nconst onClose = () => {\n\tsetTimeout(() => {\n\t\tdisabledFocusToOpen = false;\n\t}, 100);\n\n\t// очистка введенного текста\n\tif (searchTypeLocal.value === 'popup') {\n\t\tif (menu.searchText.value) menu.resetSearch();\n\t}\n};\n\n/**\n * Обработчик прокрутки списка контента\n *\n * Для дозагрузки элеменов через api\n *\n * @param {Event} e - Событие прокрутки\n */\nconst onScrollContentList = (e: Event) => {\n\tconst el = e.target as HTMLElement;\n\n\tif (el.scrollTop / (el.scrollHeight - el.offsetHeight) > 0.8) {\n\t\tapi.loadAppend();\n\t}\n};\n\n// для storybook\nif ((window as any).__STORYBOOK_PREVIEW__) {\n\twatch(\n\t\t() => props.multiselect,\n\t\t() => {\n\t\t\tif (props.multiselect) {\n\t\t\t\tif (!Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 1,\n\t\t\t\t\t\t\tname: 'Выбери меня',\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (Array.isArray(model.value)) {\n\t\t\t\t\tmodel.value = {\n\t\t\t\t\t\tid: null,\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ immediate: true },\n\t);\n\n\twatch(\n\t\t() => props.searchType,\n\t\t() => {\n\t\t\t// пауза для установки props в адресной строке\n\t\t\tsetTimeout(() => {\n\t\t\t\tlocation.reload();\n\t\t\t}, 500);\n\t\t},\n\t);\n}\n</script>\n\n<template>\n\t<TopPopup\n\t\tref=\"popupRef\"\n\t\t@open=\"onOpen()\"\n\t\t@close=\"onClose()\"\n\t\t@scrollContentList=\"apiRequest ? onScrollContentList($event) : undefined\"\n\t\t:notch=\"searchTypeLocal !== 'inline'\"\n\t\t:transitionDuration=\"0\"\n\t>\n\t\t<template #opener>\n\t\t\t<component\n\t\t\t\t:is=\"component\"\n\n\t\t\t\t:=\"buttonProps\"\n\n\t\t\t\tref=\"subcomponentSelector\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-selector2' : true,\n\t\t\t\t\t'top-selector2-multiselect': multiselect,\n\t\t\t\t\t['top-selector2-' + modificator]: !!modificator,\n\t\t\t\t\t'top-as-input': !buttonProps,\n\t\t\t\t\t'top-as-selector': true,\n\t\t\t\t\t['top-size_' + size]: true,\n\t\t\t\t\t['top-disabled']: disabled,\n\t\t\t\t\t['top-forms-focusable']: !disabled,\n\t\t\t\t\t['top-error']: isError,\n\t\t\t\t}\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t@keydown=\"onOpenerKeydown\"\n\t\t\t\tv-top-focus.onupdate=\"isError\"\n\n\t\t\t\t:placeholder\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t@focus=\"onFocus\"\n\t\t\t\t@blur=\"getPopup()?.isClosed ? menu.resetSearch() : ''\"\n\t\t\t>\n\t\t\t\t<template v-if=\"multiselect\">\n\t\t\t\t\t<div class=\"top-selector2_activeItems\">\n\t\t\t\t\t\t<Selector2ItemMulti\n\t\t\t\t\t\t\tv-for=\"item of model as Item[]\"\n\t\t\t\t\t\t\t:id=\"item.id\"\n\t\t\t\t\t\t\t:name=\"item.name\"\n\t\t\t\t\t\t\t@delete=\"menu.deleteItemById\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\n\t\t\t\t<span v-if=\"searchTypeLocal !== 'inline' && !multiselect\" class=\"top-selector2_activeName top-ellipsis\">\n\t\t\t\t\t{{ !Array.isArray(model) ? model.name : '' }}\n\t\t\t\t</span>\n\n\t\t\t\t<span v-if=\"multiselect && !model.length\" class=\"top-selector2_placeholder top-ellipsis\">\n\t\t\t\t\t{{ placeholder }}\n\t\t\t\t</span>\n\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"addChanger && !buttonProps && !multiselect && menu.items.value.length > 1 && !disabled\"\n\t\t\t\t\tclass=\"top-changer top-changer-selector top-popup_widget\"\n\t\t\t\t\tdata-top-popup-disabled=\"true\"\n\t\t\t\t\t@click=\"onClickChanger\"\n\t\t\t\t></span>\n\t\t\t</component>\n\t\t</template>\n\n\t\t<template #widget v-if=\"searchTypeLocal === 'popup'\">\n\t\t\t<TopPopupWidgetInput\n\t\t\t\ttitle=\"Поиск\"\n\t\t\t\ticon=\"\"\n\t\t\t\tv-model=\"menu.searchText.value\"\n\t\t\t\t:isLoading=\"api.isLoading.value && !apiRequest?.params.offset\"\n\t\t\t\t:placeholder\n\t\t\t/>\n\t\t</template>\n\n\t\t<template #contentList>\n\t\t\t<TopPopupListItem\n\t\t\t\tv-for=\"item of menu.itemsForShow.value\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'top-active': !Array.isArray(model) && !multiselect && model.id === item.id && model.name === item.name,\n\t\t\t\t}\"\n\t\t\t\t:key=\"item.id ?? undefined\"\n\t\t\t\t:closeByClick=\"!multiselect || Core.state.isMobile\"\n\t\t\t\t@click=\"menu.selectItem(item)\"\n\t\t\t>\n\t\t\t\t<slot\n\t\t\t\t\tv-if=\"$slots.item\"\n\t\t\t\t\tname=\"item\"\n\t\t\t\t\t:item\n\t\t\t\t></slot>\n\n\t\t\t\t<template\n\t\t\t\t\tv-else\n\t\t\t\t>\n\t\t\t\t\t{{ item.name }}\n\t\t\t\t</template>\n\t\t\t</TopPopupListItem>\n\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"!api.isLoading.value && !menu.itemsForShow.value.length\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t{{ $i18n.Common.No_results }}\n\t\t\t</TopPopupListItem>\n\n\t\t\t<!-- Индикатор загрузки, первичная дозагрузка отображается в поле поиска, если оно отображено -->\n\t\t\t<TopPopupListItem\n\t\t\t\tv-if=\"api.isLoading.value && (searchType !== 'popup' || apiRequest?.params.offset)\"\n\t\t\t\ttype=\"regular\"\n\t\t\t>\n\t\t\t\t<TopPreloader type=\"circles\"/>\n\t\t\t</TopPopupListItem>\n\t\t</template>\n\t</TopPopup>\n</template>\n\n<style>\n.top-selector2 {\n\twidth: 180px;\n\tpadding: var(--top-padding-1) var(--top-forms-padding);\n}\n\n.top-selector2::placeholder,\n.top-selector2_placeholder {\n\tcolor: var(--color-text-2);\n}\n\n.top-selector2_placeholder {\n\tpadding-left: var(--top-padding-1);\n}\n\n.top-selector2-multiselect {\n\tpadding: var(--top-padding-1);\n}\n\n.top-selector2.top-active {\n\t--top-forms-border-color: var(--top-forms-border-color-hover);\n}\n\n.top-selector2_activeItems {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--top-padding-1);\n\tmax-width: 100%;\n}\n\n.top-selector2_activeName {\n\twhite-space: nowrap;\n}\n\n.top-changer-selector {\n\twidth: auto;\n\tpadding: var(--top-padding-1);\n\tmargin: calc(0px - var(--top-padding-1));\n\ttransform: translateX(0);\n}\n\n.top-selector2.top-button {\n\tjustify-content: start;\n}\n\n.top-selector2.top-input_input ~ .top-changer-selector {\n\ttransform: translateX(-52px);\n}\n\n.top-selector2.top-as-selector {\n\tpadding-right: calc(var(--top-selector-arrow-width) + var(--top-padding-2));\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { TopButton } from '@/components/forms/forms';\nimport type { Props } from '@/components/formsExt/policy/types';\n\ndefineProps<Props>();\n\nconst isVisible = ref(true);\n\nconst acceptCookie = () => {\n\tconst baseDomain = location.hostname.split('.').slice(-2).join('.');\n\n\tdocument.cookie = `cookie_consent=accepted; path=/; domain=.${baseDomain}; max-age=31536000`;\n\n\tisVisible.value = false;\n};\n</script>\n\n<template>\n\t<div\n\t\tv-if=\"isVisible\"\n\t\tclass=\"top-policy\"\n\t>\n\t\t<div class=\"top-policy_title\">\n\t\t\t{{ title }}\n\t\t</div>\n\n\t\t<div\n\t\t\tclass=\"top-policy_description\"\n\t\t\tv-html=\"text\"\n\t\t></div>\n\n\t\t<TopButton\n\t\t\tsize=\"m\"\n\t\t\t@click=\"acceptCookie\"\n\t\t>\n\t\t\t{{ $i18n.Common.Allow }}\n\t\t</TopButton>\n\t</div>\n</template>\n\n<style>\n.top-policy {\n\tbox-sizing: border-box;\n\tbox-shadow: var(--top-shadow-b);\n\tborder-radius: var(--top-radius-4);\n\tbackground: var(--color-bg-lightning-1);\n\twidth: 600px;\n\tpadding: var(--top-padding-4);\n\tposition: fixed;\n\tright: var(--top-gap-10);\n\tbottom: var(--top-gap-10);\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--top-gap-4);\n\tz-index: 10000;\n}\n\n.top-policy_title {\n\tfont-size: 24px;\n\tfont-weight: 700;\n}\n\n@media screen and (max-width: 900px) {\n\t.top-policy {\n\t\twidth: 100%;\n\t\tright: 0;\n\t\tbottom: calc(var(--top-gap-5) + var(--toolbar-height, 0px));\n\t}\n}\n</style>\n","import type { ComponentCustomProps } from 'vue';\n\nimport EditArea from './editArea/editArea.vue';\nimport EditInput from './editInput/editInput.vue';\nimport RadioGroup from './radioGroup/radioGroup.vue';\nimport CheckboxGroup from './checkboxGroup/checkboxGroup.vue';\nimport Selector2 from './selector2/selector2.vue';\nimport Menu from './menu/menu.vue';\nimport Info from './info/info.vue';\nimport Policy from './policy/policy.vue';\n\nexport const TopEditArea = EditArea as typeof EditArea & ComponentCustomProps;\nexport const TopEditInput = EditInput as typeof EditInput & ComponentCustomProps;\nexport const TopRadioGroup = RadioGroup as typeof RadioGroup & ComponentCustomProps;\nexport const TopCheckboxGroup = CheckboxGroup as typeof CheckboxGroup & ComponentCustomProps;\nexport const TopSelector2 = Selector2 as typeof Selector2 & ComponentCustomProps;\nexport const TopMenu = Menu as typeof Menu & ComponentCustomProps;\nexport const TopInfo = Info as typeof Info & ComponentCustomProps;\nexport const TopPolicy = Policy as typeof Policy & ComponentCustomProps;"],"names":["props","__props","emit","__emit","localValue","ref","isFocused","isChanged","computed","submit","value","cancel","clickOnTitle","intermediateValue","watch","toRef","model","useModel","elRef","_a","item","_c","_b","_e","_d","uid","onChange","id","newModel","index","useAPI","apiRequest","minLength","useCache","items","isLoading","searchText","nextOffset","callAPIRequest","res","cacheKey","indexWithError","load","loadAppend","loadDebounce","debounce","newSearchText","useDebounce","ITEM_ID_ALL","isSelected","modelValue","checkNameForNullId","itemSelected","useMenu","multiselect","appendAllValue","appendSearchToResult","searchType","api","itemAll","useI18n","resetSearch","genIsShort","localItems","localItems2","itemsForShow","searchString","searchStringInvertKeyboard","invertKeyboardLayout","items2","itemName","nextIndex","searchTypeLocal","Core","menu","component","popupRef","getPopup","placeholder","onOpenerKeydown","needOpen","symbolPressed","disabledFocusToOpen","onFocus","onClickChanger","onOpen","onClose","onScrollContentList","el","isVisible","acceptCookie","baseDomain","TopEditArea","_sfc_main$7","TopEditInput","_sfc_main$6","TopRadioGroup","_sfc_main$5","TopCheckboxGroup","_sfc_main$4","TopSelector2","_sfc_main$2","TopMenu","_sfc_main$b","TopInfo","_sfc_main$1","TopPolicy","_sfc_main"],"mappings":"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"}
|