sprof 0.1.0
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/README.md +29 -0
- package/package.json +101 -0
- package/src/Hooks/Hooks.ts +75 -0
- package/src/assets/img/avatar.webp +0 -0
- package/src/assets/styles/borders.scss +11 -0
- package/src/assets/styles/brandbook.css +227 -0
- package/src/assets/styles/colors.scss +42 -0
- package/src/assets/styles/fonts.scss +15 -0
- package/src/assets/styles/index.css +15 -0
- package/src/assets/styles/index.scss +45 -0
- package/src/assets/styles/platform/android.css +53 -0
- package/src/assets/styles/platform/ios.css +53 -0
- package/src/assets/styles/platform/webdesktop.css +72 -0
- package/src/assets/styles/platform/webdesktop_old.css +65 -0
- package/src/assets/styles/platform/webmobile.css +53 -0
- package/src/assets/styles/platform/webtablet.css +53 -0
- package/src/assets/styles/reset.scss +28 -0
- package/src/assets/styles/shadow.scss +6 -0
- package/src/assets/styles/theme/aquaBlueLight.css +162 -0
- package/src/assets/styles/theme/blueLight.css +187 -0
- package/src/assets/styles/theme/blueLight_test.css +162 -0
- package/src/assets/styles/theme/dark.css +286 -0
- package/src/assets/styles/theme/light.css +151 -0
- package/src/assets/svg/ArrowLeft.svg +5 -0
- package/src/assets/svg/ArrowRight.svg +5 -0
- package/src/assets/svg/Close.svg +7 -0
- package/src/assets/svg/DoubleArrowLeft.svg +5 -0
- package/src/assets/svg/DoubleArrowRight.svg +5 -0
- package/src/assets/svg/Ellipsis.svg +7 -0
- package/src/assets/svg/Filter.svg +10 -0
- package/src/assets/svg/Menu.svg +5 -0
- package/src/assets/svg/Move.svg +5 -0
- package/src/assets/svg/Password.svg +5 -0
- package/src/assets/svg/RightMenu.svg +5 -0
- package/src/assets/svg/Settings.svg +6 -0
- package/src/assets/svg/User.svg +6 -0
- package/src/buildLibrary.ts +59 -0
- package/src/classes/Auth.ts +63 -0
- package/src/classes/AuthButton.ts +64 -0
- package/src/classes/AuthForm.ts +114 -0
- package/src/classes/AuthModal.ts +32 -0
- package/src/classes/AuthStatusesObjects.ts +37 -0
- package/src/classes/AuthTokens.ts +43 -0
- package/src/classes/AuthUser.ts +53 -0
- package/src/classes/CallbackRequest.ts +12 -0
- package/src/classes/Chat.ts +18 -0
- package/src/classes/ChatMessage.ts +48 -0
- package/src/classes/Contact.ts +96 -0
- package/src/classes/Cropper.ts +22 -0
- package/src/classes/DateHelper.ts +29 -0
- package/src/classes/Email.ts +18 -0
- package/src/classes/EmailField.ts +42 -0
- package/src/classes/EmailRules.ts +4 -0
- package/src/classes/FTSPPreset.ts +16 -0
- package/src/classes/FileInfo.ts +86 -0
- package/src/classes/HttpResponse.ts +22 -0
- package/src/classes/Human.ts +106 -0
- package/src/classes/LabelValue.ts +11 -0
- package/src/classes/LocalStore.ts +22 -0
- package/src/classes/M2M.ts +25 -0
- package/src/classes/Menu.ts +102 -0
- package/src/classes/PageSectionImage.ts +19 -0
- package/src/classes/PasswordField.ts +39 -0
- package/src/classes/PasswordRepeatField.ts +37 -0
- package/src/classes/Phone.ts +17 -0
- package/src/classes/PostAddress.ts +11 -0
- package/src/classes/PostAddressRules.ts +1 -0
- package/src/classes/Role.ts +13 -0
- package/src/classes/Schema.ts +13 -0
- package/src/classes/SchemaField.ts +10 -0
- package/src/classes/SearchElement.ts +18 -0
- package/src/classes/SearchElementMeta.ts +10 -0
- package/src/classes/SearchGroup.ts +25 -0
- package/src/classes/SearchGroupMetaColumn.ts +11 -0
- package/src/classes/SearchModel.ts +61 -0
- package/src/classes/SortModel.ts +57 -0
- package/src/classes/SubMenu.ts +56 -0
- package/src/classes/TelephoneNumberRules.ts +9 -0
- package/src/classes/User.ts +17 -0
- package/src/classes/UserAccount.ts +17 -0
- package/src/classes/UserService.ts +20 -0
- package/src/classes/ValidationRules.ts +15 -0
- package/src/classes/ValueType.ts +69 -0
- package/src/classes/Website.ts +11 -0
- package/src/classes/WebsiteRules.ts +4 -0
- package/src/classes/admin/AdminButtonParams.ts +27 -0
- package/src/classes/admin/AdminHeaderParams.ts +34 -0
- package/src/classes/calendar/Calendar.ts +168 -0
- package/src/classes/calendar/Day.ts +15 -0
- package/src/classes/calendar/Month.ts +144 -0
- package/src/classes/calendar/Week.ts +44 -0
- package/src/classes/calendar/Year.ts +130 -0
- package/src/classes/filters/Cursor.ts +43 -0
- package/src/classes/filters/FTSP.ts +99 -0
- package/src/classes/filters/FilterModel.ts +263 -0
- package/src/classes/filters/FilterQuery.ts +187 -0
- package/src/classes/filters/OperatorsOptions.ts +8 -0
- package/src/classes/filters/OperatorsTextOptions.ts +3 -0
- package/src/classes/filters/Pagination.ts +78 -0
- package/src/classes/filters/SelectFilter.ts +15 -0
- package/src/classes/filters/TreeModel.ts +14 -0
- package/src/classes/page/CustomSection.ts +24 -0
- package/src/classes/page/Page.ts +160 -0
- package/src/classes/page/PageDocument.ts +27 -0
- package/src/classes/page/PageImage.ts +15 -0
- package/src/classes/page/PageSection.ts +82 -0
- package/src/classes/page/PageSectionDocument.ts +56 -0
- package/src/classes/page/PageSideMenu.ts +74 -0
- package/src/components/AdaptiveContainer.vue +154 -0
- package/src/components/AdaptiveContainerHorizontal.vue +173 -0
- package/src/components/AdminGallery.vue +238 -0
- package/src/components/AuthModal.vue +16 -0
- package/src/components/CarouselImages.vue +434 -0
- package/src/components/ContactForm.vue +219 -0
- package/src/components/ContextWindow.vue +48 -0
- package/src/components/DateInputRange.vue +66 -0
- package/src/components/DateInputRange_v2.vue +25 -0
- package/src/components/DropList.vue +55 -0
- package/src/components/Edit.svg +10 -0
- package/src/components/EmailForm.vue +180 -0
- package/src/components/FTSPPanel.vue +379 -0
- package/src/components/FilterCheckbox.vue +73 -0
- package/src/components/FilterSelect.vue +104 -0
- package/src/components/FiltersButtonsSelect.vue +126 -0
- package/src/components/GeneralItem.vue +172 -0
- package/src/components/GridContainer.vue +66 -0
- package/src/components/Icons/Filter/IconDownload.vue +55 -0
- package/src/components/Icons/Filter/IconFilter.vue +55 -0
- package/src/components/Icons/IconArrowLeft.vue +36 -0
- package/src/components/Icons/IconCheckDefault.vue +41 -0
- package/src/components/Icons/IconClose.vue +37 -0
- package/src/components/Icons/IconEdit.vue +40 -0
- package/src/components/Icons/IconEmail.vue +36 -0
- package/src/components/Icons/IconMove.vue +53 -0
- package/src/components/Icons/IconPhone.vue +36 -0
- package/src/components/Icons/IconSearch.vue +47 -0
- package/src/components/Icons/IconSelectArrow.vue +41 -0
- package/src/components/Icons/Pagination/ArrowLeft.vue +52 -0
- package/src/components/Icons/Pagination/ArrowRight.vue +52 -0
- package/src/components/Icons/Pagination/DoubleArrowLeft.vue +52 -0
- package/src/components/Icons/Pagination/DoubleArrowRight.vue +52 -0
- package/src/components/Icons/Pagination/EllipsisSvg.vue +58 -0
- package/src/components/ImageCropper.vue +203 -0
- package/src/components/InfoItem.vue +294 -0
- package/src/components/InfoItemSelectButtons.vue +43 -0
- package/src/components/LeftRightContainer.vue +93 -0
- package/src/components/MessageBody.vue +45 -0
- package/src/components/PAutocomplete.vue +93 -0
- package/src/components/PDialog.vue +77 -0
- package/src/components/PLoader.vue +68 -0
- package/src/components/PNotification.vue +79 -0
- package/src/components/PPagination.vue +174 -0
- package/src/components/PhoneForm.vue +180 -0
- package/src/components/RSContainer.vue +262 -0
- package/src/components/RemoteSearch.vue +156 -0
- package/src/components/ResearcheContainer.vue +71 -0
- package/src/components/RightSliderContainer.vue +181 -0
- package/src/components/RightTabsContainer.vue +210 -0
- package/src/components/SelectValueType.vue +39 -0
- package/src/components/SingleNameToggleForm.vue +399 -0
- package/src/components/SortList.vue +101 -0
- package/src/components/SortSelect.vue +93 -0
- package/src/components/SvgIcon.vue +25 -0
- package/src/components/Switch3Pos.vue +173 -0
- package/src/components/ThemeWrapper.vue +19 -0
- package/src/components/ToggleInfoItem.vue +296 -0
- package/src/components/TopSliderContainer.vue +166 -0
- package/src/components/UploaderImage.vue +268 -0
- package/src/components/atoms/PButton/PButton.stories.ts +44 -0
- package/src/components/atoms/PButton/PButton.test.ts +66 -0
- package/src/components/atoms/PButton/PButton.vue +54 -0
- package/src/components/atoms/PButton/skins/p-button_base.css +131 -0
- package/src/components/atoms/PButton/skins/p-button_filter.scss +83 -0
- package/src/components/atoms/PButton/skins/p-button_icon.scss +78 -0
- package/src/components/atoms/PButton/skins/p-button_pag.css +44 -0
- package/src/components/atoms/PButton/skins/p-button_text.css +88 -0
- package/src/components/atoms/PButton/skins/p-button_text_ano.css +88 -0
- package/src/components/atoms/PCheckbox/PCheckBox.test.ts +107 -0
- package/src/components/atoms/PCheckbox/PCheckBox.vue +92 -0
- package/src/components/atoms/PDatePicker/PDatePicker.test.ts +63 -0
- package/src/components/atoms/PDatePicker/PDatePicker.vue +141 -0
- package/src/components/atoms/PFlex/PFlex.test.ts +41 -0
- package/src/components/atoms/PFlex/PFlex.vue +46 -0
- package/src/components/atoms/PInput/PInput.stories.ts +40 -0
- package/src/components/atoms/PInput/PInput.test.ts +92 -0
- package/src/components/atoms/PInput/PInput.vue +133 -0
- package/src/components/atoms/PInputDate/PInputDate.test.ts +55 -0
- package/src/components/atoms/PInputDate/PInputDate.vue +79 -0
- package/src/components/atoms/PInputNumber/PInputNumber.vue +175 -0
- package/src/components/atoms/PLeftSlider/PLeftSlider.test.ts +121 -0
- package/src/components/atoms/PLeftSlider/PLeftSlider.vue +139 -0
- package/src/components/atoms/PList/PList.test.ts +32 -0
- package/src/components/atoms/PList/PList.vue +27 -0
- package/src/components/atoms/PListItem/PListItem.test.ts +61 -0
- package/src/components/atoms/PListItem/PListItem.vue +51 -0
- package/src/components/atoms/PRadio/PRadio.test.ts +110 -0
- package/src/components/atoms/PRadio/PRadio.vue +97 -0
- package/src/components/atoms/PRightSlider/PRightSlider.test.ts +123 -0
- package/src/components/atoms/PRightSlider/PRightSlider.vue +149 -0
- package/src/components/atoms/PSelect/PSelect.test.ts +74 -0
- package/src/components/atoms/PSelect/PSelect.vue +192 -0
- package/src/components/atoms/PSelect/select-arrow-down.svg +4 -0
- package/src/components/atoms/PSticky/PSticky.test.ts +70 -0
- package/src/components/atoms/PSticky/PSticky.vue +37 -0
- package/src/components/atoms/PString/PString.test.ts +58 -0
- package/src/components/atoms/PString/PString.vue +58 -0
- package/src/components/atoms/PTextarea/PTextarea.stories.ts +40 -0
- package/src/components/atoms/PTextarea/PTextarea.test.ts +22 -0
- package/src/components/atoms/PTextarea/PTextarea.vue +123 -0
- package/src/components/atoms/PTopSlider/PTopSlider.test.ts +95 -0
- package/src/components/atoms/PTopSlider/PTopSlider.vue +164 -0
- package/src/components/molecules/Collapse/CollapseContainer.vue +36 -0
- package/src/components/molecules/Collapse/CollapseItem.vue +295 -0
- package/src/components/molecules/Collapse/VerticalCollapseContainer.vue +102 -0
- package/src/components/molecules/PAdd/PAdd.vue +65 -0
- package/src/components/molecules/PAdd/PContainer.vue +65 -0
- package/src/components/molecules/PAdd/PContainerStickyHead.vue +51 -0
- package/src/components/molecules/PDel/PDel.vue +74 -0
- package/src/components/organisms/AuthForm.vue +219 -0
- package/src/components/organisms/PModal.vue +113 -0
- package/src/components/organisms/PTabs/ITab.ts +5 -0
- package/src/components/organisms/PTabs/PTabs.vue +190 -0
- package/src/components/organisms/UploaderFile/UploaderFile.test.ts +23 -0
- package/src/components/organisms/UploaderFile/UploaderFile.vue +202 -0
- package/src/components/pages/AuthPage.vue +22 -0
- package/src/components/pages/PageNotFound.vue +7 -0
- package/src/index.ts +206 -0
- package/src/interfaces/AdminLayout.ts +4 -0
- package/src/interfaces/Animations.ts +5 -0
- package/src/interfaces/AuthStatuses.ts +8 -0
- package/src/interfaces/CalendarScale.ts +6 -0
- package/src/interfaces/Callback.ts +2 -0
- package/src/interfaces/Class.ts +3 -0
- package/src/interfaces/DataTypes.ts +8 -0
- package/src/interfaces/Filter.ts +3 -0
- package/src/interfaces/IAdminMenu.ts +9 -0
- package/src/interfaces/IAuthInfo.ts +0 -0
- package/src/interfaces/ICursor.ts +14 -0
- package/src/interfaces/IEmailPassword.ts +4 -0
- package/src/interfaces/IFIlesList.ts +4 -0
- package/src/interfaces/IFile.ts +7 -0
- package/src/interfaces/IFileAnchor.ts +4 -0
- package/src/interfaces/IFileInfo.ts +22 -0
- package/src/interfaces/IFileInfosGetter.ts +5 -0
- package/src/interfaces/IFiler.ts +7 -0
- package/src/interfaces/IFilter.ts +4 -0
- package/src/interfaces/IFilterQuery.ts +24 -0
- package/src/interfaces/IForm.ts +5 -0
- package/src/interfaces/IHTTPTypes.ts +19 -0
- package/src/interfaces/IMessage.ts +5 -0
- package/src/interfaces/IOption.ts +4 -0
- package/src/interfaces/IOrdered.ts +4 -0
- package/src/interfaces/IPagination.ts +15 -0
- package/src/interfaces/ISearchElement.ts +6 -0
- package/src/interfaces/ISearchObject.ts +6 -0
- package/src/interfaces/ISearchQuery.ts +4 -0
- package/src/interfaces/ISelectFilter.ts +6 -0
- package/src/interfaces/ISortModel.ts +18 -0
- package/src/interfaces/IStorePaginator.ts +4 -0
- package/src/interfaces/ISupposedTimePeriod.ts +4 -0
- package/src/interfaces/ITimePeriod.ts +4 -0
- package/src/interfaces/ITokens.ts +4 -0
- package/src/interfaces/IWithId.ts +3 -0
- package/src/interfaces/IWithImage.ts +9 -0
- package/src/interfaces/IWithName.ts +4 -0
- package/src/interfaces/IWithSupposedTimePeriod.ts +4 -0
- package/src/interfaces/ItemsWithCount.ts +4 -0
- package/src/interfaces/LocalStoreKeys.ts +7 -0
- package/src/interfaces/Operators.ts +11 -0
- package/src/interfaces/Orders.ts +4 -0
- package/src/interfaces/RoleName.ts +4 -0
- package/src/interfaces/SocialTypes.ts +6 -0
- package/src/interfaces/Sort.ts +9 -0
- package/src/interfaces/ValueRelation.ts +7 -0
- package/src/interfaces/canvas/ICanvas.ts +3 -0
- package/src/interfaces/canvas/ICanvasResult.ts +7 -0
- package/src/interfaces/canvas/ICoordinates.ts +6 -0
- package/src/interfaces/types.ts +3 -0
- package/src/services/AdminHead.ts +32 -0
- package/src/services/AdminSideMenu.ts +52 -0
- package/src/services/AdminUI.ts +9 -0
- package/src/services/Arrays.ts +65 -0
- package/src/services/Axios.ts +64 -0
- package/src/services/BaseRoutes.ts +21 -0
- package/src/services/BaseStore.ts +220 -0
- package/src/services/Button.ts +42 -0
- package/src/services/Cache.ts +44 -0
- package/src/services/CacheS.ts +44 -0
- package/src/services/CarouselSwipe.ts +14 -0
- package/src/services/ClassHelper.ts +101 -0
- package/src/services/Color.ts +8 -0
- package/src/services/CreateSortModels.ts +26 -0
- package/src/services/Cursor.ts +51 -0
- package/src/services/DateFormat.ts +102 -0
- package/src/services/DateMask.ts +69 -0
- package/src/services/Dates.ts +41 -0
- package/src/services/DatesFormatter.ts +45 -0
- package/src/services/Dialog.ts +70 -0
- package/src/services/Dragger.ts +22 -0
- package/src/services/Extension.ts +6 -0
- package/src/services/Favourite.ts +62 -0
- package/src/services/HttpClient.ts +199 -0
- package/src/services/HttpClientS.ts +188 -0
- package/src/services/HttpError.ts +58 -0
- package/src/services/Loading.ts +14 -0
- package/src/services/MakeCarousel.ts +10 -0
- package/src/services/Menu.ts +102 -0
- package/src/services/Message.ts +66 -0
- package/src/services/Notification.ts +37 -0
- package/src/services/PHelp.ts +20 -0
- package/src/services/Paginator.ts +22 -0
- package/src/services/Period.ts +29 -0
- package/src/services/PhoneService.ts +46 -0
- package/src/services/Router.ts +85 -0
- package/src/services/RouterGuard.ts +15 -0
- package/src/services/Scheduler.ts +66 -0
- package/src/services/Scroll.ts +19 -0
- package/src/services/SortList.ts +44 -0
- package/src/services/Sorter.ts +6 -0
- package/src/services/Strings.test.ts +30 -0
- package/src/services/Strings.ts +138 -0
- package/src/services/Time.ts +124 -0
- package/src/services/Timer.ts +13 -0
- package/src/services/Token.ts +71 -0
- package/src/services/Visible.ts +16 -0
- package/src/services/WaitElement.ts +19 -0
- package/src/services/WebSocketClient.ts +62 -0
- package/src/services/brandColors.ts +5 -0
- package/src/services/buildNameNumbers.ts +8 -0
- package/src/services/countRating.ts +12 -0
- package/src/services/index.ts +105 -0
- package/src/services/indexNames.ts +55 -0
- package/src/services/moves.ts +17 -0
- package/src/services/useConfirmLeavePage.ts +52 -0
- package/src/services/validate.ts +22 -0
- package/src/store/AuthStore.ts +58 -0
- package/src/store/ContactsStore.ts +11 -0
- package/src/store/CropperStore.ts +20 -0
- package/src/store/EmailsStore.ts +11 -0
- package/src/store/FTSPPresetsStore.ts +11 -0
- package/src/store/FileInfosStore.ts +11 -0
- package/src/store/HumansStore.ts +11 -0
- package/src/store/MenusStore.ts +11 -0
- package/src/store/PhonesStore.ts +11 -0
- package/src/store/SchemasStore.ts +11 -0
- package/src/store/SearchStore.ts +65 -0
- package/src/store/ServicesStores.ts +29 -0
- package/src/store/ServicesStoresNames.ts +17 -0
- package/src/store/UserAccountsStore.ts +11 -0
- package/src/store/ValueTypesStore.ts +11 -0
- package/src/tsconfig.build-lib.json +30 -0
- package/src/types/AuthInfo.ts +6 -0
- package/src/types/HttpHeaders.ts +12 -0
- package/src/types/HttpMethods.ts +6 -0
- package/src/types/Sizes.ts +7 -0
- package/src/types/Statuses.ts +9 -0
- package/src/types/ValueTypes.ts +16 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { mount } from '@vue/test-utils';
|
|
2
|
+
|
|
3
|
+
import PRadio from './PRadio.vue';
|
|
4
|
+
|
|
5
|
+
describe('PRadio', () => {
|
|
6
|
+
//1. Тест задания и рендеринга лейбла
|
|
7
|
+
test('renders label and input', () => {
|
|
8
|
+
const wrapper = mount(PRadio, {
|
|
9
|
+
props: {
|
|
10
|
+
label: 'Test Radio',
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// Проверяем наличие текста label
|
|
15
|
+
expect(wrapper.text()).toContain('Test Radio');
|
|
16
|
+
|
|
17
|
+
// Проверяем наличие радио инпута
|
|
18
|
+
const input = wrapper.find('input[type="radio"]');
|
|
19
|
+
expect(input.exists()).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe('PRadio Styles', () => {
|
|
24
|
+
//2. Тесты работы задаваемых параметрами стилей
|
|
25
|
+
test('applies custom padding, margin, size, and borderRadius', () => {
|
|
26
|
+
const wrapper = mount(PRadio, {
|
|
27
|
+
props: {
|
|
28
|
+
padding: '10px',
|
|
29
|
+
margin: '5px',
|
|
30
|
+
size: '24px',
|
|
31
|
+
borderRadius: '50%',
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const box = wrapper.find('.box');
|
|
36
|
+
const radioLine = wrapper.find('.radio-line');
|
|
37
|
+
|
|
38
|
+
// Проверяем стили
|
|
39
|
+
expect(radioLine.attributes('style')).toContain('padding: 10px');
|
|
40
|
+
expect(radioLine.attributes('style')).toContain('margin: 5px');
|
|
41
|
+
expect(box.attributes('style')).toContain('width: 24px');
|
|
42
|
+
expect(box.attributes('style')).toContain('height: 24px');
|
|
43
|
+
expect(box.attributes('style')).toContain('border-radius: 50%');
|
|
44
|
+
});
|
|
45
|
+
//3. Тесты работы параметра размера шрифта
|
|
46
|
+
test('applies custom fontSize to label', () => {
|
|
47
|
+
const wrapper = mount(PRadio, {
|
|
48
|
+
props: {
|
|
49
|
+
fontSize: '18px',
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const label = wrapper.find('.radio-field__label');
|
|
54
|
+
|
|
55
|
+
// Проверяем размер шрифта label
|
|
56
|
+
expect(label.attributes('style')).toContain('font-size: 18px');
|
|
57
|
+
});
|
|
58
|
+
//4. Тест работы выбора
|
|
59
|
+
test('checks radio button when value matches model', async () => {
|
|
60
|
+
const wrapper = mount(PRadio, {
|
|
61
|
+
props: {
|
|
62
|
+
value: 'option1',
|
|
63
|
+
modelValue: 'option1',
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const input = wrapper.find('input[type="radio"]').element as HTMLInputElement;
|
|
68
|
+
|
|
69
|
+
// Проверяем, что инпут отмечен, если value совпадает с modelValue
|
|
70
|
+
expect(input.checked).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('does not check radio button when value does not match model', async () => {
|
|
74
|
+
const wrapper = mount(PRadio, {
|
|
75
|
+
props: {
|
|
76
|
+
value: 'option1',
|
|
77
|
+
modelValue: 'option2',
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const input = wrapper.find('input[type="radio"]').element as HTMLInputElement;
|
|
82
|
+
|
|
83
|
+
// Проверяем, что инпут не отмечен, если value не совпадает с modelValue
|
|
84
|
+
expect(input.checked).toBe(false);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// describe('PRadio Events', () => {
|
|
89
|
+
// test('emits change event when clicked', async () => {
|
|
90
|
+
// const wrapper = mount(PRadio, {
|
|
91
|
+
// props: {
|
|
92
|
+
// value: 'option1',
|
|
93
|
+
// modelValue: '',
|
|
94
|
+
// },
|
|
95
|
+
// });
|
|
96
|
+
|
|
97
|
+
// const input = wrapper.find('input[type="radio"]');
|
|
98
|
+
|
|
99
|
+
// await input.trigger('click');
|
|
100
|
+
|
|
101
|
+
// // Проверяем, что событие change эмитится
|
|
102
|
+
// const emitted = wrapper.emitted('change');
|
|
103
|
+
// expect(emitted).toBeTruthy();
|
|
104
|
+
|
|
105
|
+
// // Проверяем, что событие содержит корректное значение
|
|
106
|
+
// if (emitted && emitted[0]) {
|
|
107
|
+
// expect(emitted[0]).toEqual(['option1']);
|
|
108
|
+
// }
|
|
109
|
+
// });
|
|
110
|
+
// });
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="radio-line" :style="{ padding: padding, margin: margin, maxWidth: width }">
|
|
3
|
+
<label class="radio-field__label" :for="id" :style="{ fontSize: fontSize }">
|
|
4
|
+
<input :id="id" v-model="model" :name="name" :checked="checked" class="radio-field__input" type="radio" :value="value" />
|
|
5
|
+
<div class="box" :style="{ width: size, height: size, borderRadius: borderRadius }" @click="change">
|
|
6
|
+
<div v-if="model === value" class="radio-dot" :style="{ width: `calc(${size} - 50%)`, height: `calc(${size} - 50%)` }"></div>
|
|
7
|
+
</div>
|
|
8
|
+
<span @click="change">
|
|
9
|
+
{{ label }}
|
|
10
|
+
</span>
|
|
11
|
+
</label>
|
|
12
|
+
</div>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script lang="ts" setup>
|
|
16
|
+
const model = defineModel<string>();
|
|
17
|
+
const emits = defineEmits(['change']);
|
|
18
|
+
const props = defineProps({
|
|
19
|
+
label: { type: String, default: '' },
|
|
20
|
+
name: { type: String, default: 'group' },
|
|
21
|
+
fontSize: { type: String, default: '14px' },
|
|
22
|
+
size: { type: String, default: '20px' },
|
|
23
|
+
borderRadius: { type: String, default: '' },
|
|
24
|
+
padding: { type: String, default: '' },
|
|
25
|
+
margin: { type: String, default: '' },
|
|
26
|
+
width: { type: String, default: 'auto' },
|
|
27
|
+
value: { type: [String, Boolean], default: undefined },
|
|
28
|
+
});
|
|
29
|
+
const id = Strings.CreateGuid();
|
|
30
|
+
const checked = computed(() => {
|
|
31
|
+
return model.value === props.value;
|
|
32
|
+
});
|
|
33
|
+
const change = () => {
|
|
34
|
+
emits('change', props.value);
|
|
35
|
+
};
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<style scoped>
|
|
39
|
+
.radio-line {
|
|
40
|
+
display: flex;
|
|
41
|
+
justify-content: left;
|
|
42
|
+
align-items: center;
|
|
43
|
+
display: flex;
|
|
44
|
+
justify-content: left;
|
|
45
|
+
margin: 0 auto;
|
|
46
|
+
box-sizing: border-box;
|
|
47
|
+
padding: 10px 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.box {
|
|
51
|
+
position: relative;
|
|
52
|
+
border: 1px solid;
|
|
53
|
+
border-color: var(--checkbox-border-color);
|
|
54
|
+
border-radius: 100px;
|
|
55
|
+
box-sizing: border-box;
|
|
56
|
+
margin-right: 10px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.radio-dot {
|
|
60
|
+
box-sizing: border-box;
|
|
61
|
+
position: absolute;
|
|
62
|
+
z-index: 2;
|
|
63
|
+
left: 50%;
|
|
64
|
+
top: 50%;
|
|
65
|
+
transform: translate(-50%, -50%);
|
|
66
|
+
margin: 0;
|
|
67
|
+
padding: 0;
|
|
68
|
+
background: var(--checkbox-border-color);
|
|
69
|
+
border-radius: 100px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.radio-field__label {
|
|
73
|
+
box-sizing: border-box;
|
|
74
|
+
display: flex;
|
|
75
|
+
justify-content: left;
|
|
76
|
+
align-items: center;
|
|
77
|
+
font-family: var(--base-font);
|
|
78
|
+
color: var(--checkbox-label-color);
|
|
79
|
+
-webkit-user-select: none; /* Safari */
|
|
80
|
+
-ms-user-select: none; /* IE 10 and IE 11 */
|
|
81
|
+
user-select: none; /* Standard syntax */
|
|
82
|
+
cursor: pointer;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.radio-field__label:hover {
|
|
86
|
+
color: var(--checkbox-border-color-hovered);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.radio-field__label:hover > .box {
|
|
90
|
+
border-color: var(--checkbox-border-color-hovered);
|
|
91
|
+
color: var(--checkbox-border-color-hovered);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.radio-field__input {
|
|
95
|
+
display: none;
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { mount } from '@vue/test-utils';
|
|
2
|
+
|
|
3
|
+
import PString from '../PString/PString.vue';
|
|
4
|
+
import PRightSlider from './PRightSlider.vue';
|
|
5
|
+
|
|
6
|
+
describe('PRightSlider', () => {
|
|
7
|
+
//1. Тест рендеринга слотов
|
|
8
|
+
test('renders slot content and title', () => {
|
|
9
|
+
const wrapper = mount(PRightSlider, {
|
|
10
|
+
slots: {
|
|
11
|
+
default: '<div class="slot-slider-content">Slot Slider Content</div>',
|
|
12
|
+
content: '<div class="slot-content">Slot Content</div>',
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// Проверяем, что слот содержимого слайдера и слот содержимого контента отображаются
|
|
17
|
+
expect(wrapper.find('.slot-slider-content').exists()).toBe(true);
|
|
18
|
+
expect(wrapper.find('.slot-content').exists()).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// 2. Тест переключения состояния по клику при скрытом начальном состоянии слайдера;
|
|
22
|
+
test('toggles closed slider state on click', async () => {
|
|
23
|
+
const wrapper = mount(PRightSlider, {
|
|
24
|
+
props: { open: false },
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const clickLine = wrapper.find('.click-line');
|
|
28
|
+
await clickLine.trigger('click');
|
|
29
|
+
|
|
30
|
+
// Проверяем, что событие переключения срабатывает
|
|
31
|
+
expect(wrapper.emitted('open')).toBeTruthy();
|
|
32
|
+
expect(wrapper.emitted('open')![0]).toEqual([true]);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// 3. Тест переключения состояния по клику при открытом начальном состоянии слайдера;
|
|
36
|
+
test('toggles opened slider state on click', async () => {
|
|
37
|
+
const wrapper = mount(PRightSlider, {
|
|
38
|
+
props: { open: true },
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const clickLine = wrapper.find('.click-line');
|
|
42
|
+
await clickLine.trigger('click');
|
|
43
|
+
|
|
44
|
+
// Проверяем, что событие переключения срабатывает
|
|
45
|
+
expect(wrapper.emitted('open')).toBeTruthy();
|
|
46
|
+
expect(wrapper.emitted('open')![0]).toEqual([false]);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
//4. Тест применения пользовательских стилей: background
|
|
50
|
+
test('applies custom styles: background', () => {
|
|
51
|
+
const wrapper = mount(PRightSlider, {
|
|
52
|
+
props: {
|
|
53
|
+
background: 'red',
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const content = wrapper.find('.RS-content');
|
|
58
|
+
|
|
59
|
+
// Проверяем, что стили применены
|
|
60
|
+
expect(content.attributes('style')).toContain('background: red');
|
|
61
|
+
});
|
|
62
|
+
//5. Тест применения пользовательских стилей: тень включена
|
|
63
|
+
test('applies correct styles when shadow is enabled', () => {
|
|
64
|
+
const wrapper = mount(PRightSlider, {
|
|
65
|
+
props: {
|
|
66
|
+
shadow: true,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const body = wrapper.find('.RS-body');
|
|
71
|
+
expect(body.attributes('style')).toContain('5px 0 5px -3px rgba(0,0,0,0.3)');
|
|
72
|
+
});
|
|
73
|
+
//6. Тест применения пользовательских стилей: тень выключена
|
|
74
|
+
test('applies correct styles when shadow is disabled', () => {
|
|
75
|
+
const wrapper = mount(PRightSlider, {
|
|
76
|
+
props: {
|
|
77
|
+
shadow: false,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const body = wrapper.find('.RS-body');
|
|
82
|
+
expect(body.attributes('style')).toContain('box-shadow: none');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
//7. Тест смещения слайдера за границу экрана при открытии и возвращении обратно
|
|
86
|
+
test('appearing within the screen is visibility', async () => {
|
|
87
|
+
const wrapper = mount(PRightSlider, {});
|
|
88
|
+
|
|
89
|
+
// Сначала слайдер должен быть смещен вправо за границу экрана
|
|
90
|
+
expect(wrapper.find('.RS-body').attributes('style')).toContain('margin-right: calc(30px - 300px)');
|
|
91
|
+
|
|
92
|
+
const clickLine = wrapper.find('.click-line');
|
|
93
|
+
await clickLine.trigger('click');
|
|
94
|
+
|
|
95
|
+
// Проверяем, что слайдер вернулся обратно в видимую зону экрана
|
|
96
|
+
expect(wrapper.find('.RS-body').attributes('style')).toContain('margin-right: 0');
|
|
97
|
+
});
|
|
98
|
+
//8. Тест работы параметра, задающего имя title на click-line при закрытом слайдере
|
|
99
|
+
test('displays titleOpen when slider is closed', () => {
|
|
100
|
+
const wrapper = mount(PRightSlider, {
|
|
101
|
+
props: {
|
|
102
|
+
titleClose: 'Open Menu',
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const title = wrapper.findComponent(PString);
|
|
107
|
+
// Проверяем, title click-line когда слайдер в закрытом состоянии
|
|
108
|
+
expect(title.props('string')).toBe('Open Menu');
|
|
109
|
+
});
|
|
110
|
+
//9. Тест работы параметра, задающего имя title на click-line при открытом слайдере
|
|
111
|
+
test('displays titleClose when slider is opened', () => {
|
|
112
|
+
const wrapper = mount(PRightSlider, {
|
|
113
|
+
props: {
|
|
114
|
+
open: true,
|
|
115
|
+
titleOpen: 'Close Menu',
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const title = wrapper.findComponent(PString);
|
|
120
|
+
// Проверяем, title click-line когда слайдер в открытом состоянии
|
|
121
|
+
expect(title.props('string')).toBe('Close Menu');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="wrapper">
|
|
3
|
+
<div class="content">
|
|
4
|
+
<slot name="content" />
|
|
5
|
+
</div>
|
|
6
|
+
<div
|
|
7
|
+
class="RS-body"
|
|
8
|
+
:style="{
|
|
9
|
+
marginRight: isOpen ? `0` : `calc(${widthClosed} - ${widthOpened})`,
|
|
10
|
+
minWidth: widthOpened,
|
|
11
|
+
maxWidth: widthOpened,
|
|
12
|
+
boxShadow: shadow ? '-5px 0 5px -3px rgba(0,0,0,0.3)' : 'none',
|
|
13
|
+
position: shift ? 'relative' : 'absolute',
|
|
14
|
+
}"
|
|
15
|
+
>
|
|
16
|
+
<div
|
|
17
|
+
class="click-line"
|
|
18
|
+
:style="{
|
|
19
|
+
width: widthClosed,
|
|
20
|
+
}"
|
|
21
|
+
@click="openSlider(!isOpen)"
|
|
22
|
+
>
|
|
23
|
+
<PString v-if="isOpen" :string="titleOpen" font-size="16px" padding="0" color="inherit" />
|
|
24
|
+
<PString v-if="!isOpen" :string="titleClose" font-size="16px" padding="0" color="inherit" />
|
|
25
|
+
</div>
|
|
26
|
+
<div
|
|
27
|
+
class="RS-content"
|
|
28
|
+
:style="{
|
|
29
|
+
width: `calc(${widthOpened} - ${widthClosed} - 2px)`,
|
|
30
|
+
background: background,
|
|
31
|
+
}"
|
|
32
|
+
>
|
|
33
|
+
<slot />
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</template>
|
|
38
|
+
|
|
39
|
+
<script lang="ts" setup>
|
|
40
|
+
const props = defineProps({
|
|
41
|
+
open: { type: Boolean, default: false },
|
|
42
|
+
shadow: { type: Boolean, default: true },
|
|
43
|
+
border: { type: Boolean, default: true },
|
|
44
|
+
shift: { type: Boolean, default: true },
|
|
45
|
+
widthClosed: {
|
|
46
|
+
type: String,
|
|
47
|
+
required: false,
|
|
48
|
+
default: '30px',
|
|
49
|
+
},
|
|
50
|
+
widthOpened: {
|
|
51
|
+
type: String,
|
|
52
|
+
required: false,
|
|
53
|
+
default: '300px',
|
|
54
|
+
},
|
|
55
|
+
titleOpen: {
|
|
56
|
+
type: String,
|
|
57
|
+
required: false,
|
|
58
|
+
default: 'Скрыть',
|
|
59
|
+
},
|
|
60
|
+
titleClose: {
|
|
61
|
+
type: String,
|
|
62
|
+
required: false,
|
|
63
|
+
default: 'Показать',
|
|
64
|
+
},
|
|
65
|
+
background: {
|
|
66
|
+
type: String,
|
|
67
|
+
required: false,
|
|
68
|
+
default: 'inherit',
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const emit = defineEmits(['open']);
|
|
73
|
+
const isOpen = ref(props.open);
|
|
74
|
+
watch(
|
|
75
|
+
() => props.open,
|
|
76
|
+
() => {
|
|
77
|
+
isOpen.value = !isOpen.value;
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const openSlider = (open: boolean) => {
|
|
82
|
+
isOpen.value = !isOpen.value;
|
|
83
|
+
emit('open', open);
|
|
84
|
+
};
|
|
85
|
+
</script>
|
|
86
|
+
|
|
87
|
+
<style lang="scss" scoped>
|
|
88
|
+
.wrapper {
|
|
89
|
+
height: 100%;
|
|
90
|
+
display: flex;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.content {
|
|
94
|
+
box-sizing: border-box;
|
|
95
|
+
width: 100%;
|
|
96
|
+
height: 100%;
|
|
97
|
+
overflow-y: auto;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.RS-body {
|
|
101
|
+
box-sizing: border-box;
|
|
102
|
+
// right: 0;
|
|
103
|
+
min-height: inherit;
|
|
104
|
+
display: flex;
|
|
105
|
+
height: 100%;
|
|
106
|
+
// float: left;
|
|
107
|
+
padding: 0;
|
|
108
|
+
z-index: 999;
|
|
109
|
+
-webkit-user-select: none;
|
|
110
|
+
/* Safari */
|
|
111
|
+
-ms-user-select: none;
|
|
112
|
+
/* IE 10 and IE 11 */
|
|
113
|
+
user-select: none;
|
|
114
|
+
/* Standard syntax */
|
|
115
|
+
font-family: var(--base-font);
|
|
116
|
+
font-size: var(--font-size-default);
|
|
117
|
+
transition: var(--transition-default, 0);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.click-line {
|
|
121
|
+
// box-sizing: border-box;
|
|
122
|
+
display: flex;
|
|
123
|
+
align-items: center;
|
|
124
|
+
justify-content: center;
|
|
125
|
+
height: 100%;
|
|
126
|
+
writing-mode: vertical-lr;
|
|
127
|
+
border-right: 1px solid;
|
|
128
|
+
border-left: 1px solid;
|
|
129
|
+
cursor: pointer;
|
|
130
|
+
border-color: var(--right-slider-click-line-border-color);
|
|
131
|
+
background: var(--right-slider-click-line-background);
|
|
132
|
+
color: var(--right-slider-click-line-font-color);
|
|
133
|
+
font-family: var(--base-font);
|
|
134
|
+
font-size: var(--font-size-default);
|
|
135
|
+
padding: 0 2px 0 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.click-line:hover {
|
|
139
|
+
background: var(--right-slider-click-line-background-hovered);
|
|
140
|
+
color: var(--right-slider-click-line-font-color-hovered);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.RS-content {
|
|
144
|
+
box-sizing: border-box;
|
|
145
|
+
height: 100%;
|
|
146
|
+
overflow-y: auto;
|
|
147
|
+
overflow-x: hidden;
|
|
148
|
+
}
|
|
149
|
+
</style>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { mount } from '@vue/test-utils';
|
|
2
|
+
|
|
3
|
+
import PSelect from './PSelect.vue';
|
|
4
|
+
|
|
5
|
+
describe('PSelect', () => {
|
|
6
|
+
// 1. Тест рендеринга label и placeholder
|
|
7
|
+
test('renders label and placeholder', () => {
|
|
8
|
+
const wrapper = mount(PSelect, {
|
|
9
|
+
props: {
|
|
10
|
+
label: 'Select Label',
|
|
11
|
+
placeholder: 'Choose an option',
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// Проверяем, что label отображается
|
|
16
|
+
expect(wrapper.text()).toContain('Select Label');
|
|
17
|
+
// Проверяем, что placeholder присутствует
|
|
18
|
+
expect(wrapper.find('option').text()).toBe('Choose an option');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
//2. Тест кнопки очистки (clearable)
|
|
22
|
+
test('clears selection when clear button is clicked', async () => {
|
|
23
|
+
const wrapper = mount(PSelect, {
|
|
24
|
+
props: {
|
|
25
|
+
clearable: true,
|
|
26
|
+
value: 'option1',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const clearButton = wrapper.find('.clear');
|
|
31
|
+
await clearButton.trigger('click');
|
|
32
|
+
|
|
33
|
+
// Проверяем, что срабатывают события очистки и изменения
|
|
34
|
+
expect(wrapper.emitted('clear')).toBeTruthy();
|
|
35
|
+
expect(wrapper.emitted('change')).toBeTruthy();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
//3. Тест применения пользовательских стилей
|
|
39
|
+
test('applies custom styles', () => {
|
|
40
|
+
const wrapper = mount(PSelect, {
|
|
41
|
+
props: {
|
|
42
|
+
width: '200px',
|
|
43
|
+
margin: '10px',
|
|
44
|
+
padding: '5px',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const selectField = wrapper.find('.text-field');
|
|
49
|
+
|
|
50
|
+
// Проверяем, что стили применены
|
|
51
|
+
expect(selectField.attributes('style')).toContain('width: 200px');
|
|
52
|
+
expect(selectField.attributes('style')).toContain('margin: 10px');
|
|
53
|
+
expect(selectField.attributes('style')).toContain('padding: 5px');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Тест события изменения значения
|
|
57
|
+
// test('emits change event on selection', async () => {
|
|
58
|
+
// const wrapper = mount(PSelect, {
|
|
59
|
+
// props: {
|
|
60
|
+
// value: 'option1',
|
|
61
|
+
// },
|
|
62
|
+
// slots: {
|
|
63
|
+
// default: '<option value="option1">Option 1</option>',
|
|
64
|
+
// },
|
|
65
|
+
// });
|
|
66
|
+
|
|
67
|
+
// const select = wrapper.find('select');
|
|
68
|
+
// await select.trigger('change');
|
|
69
|
+
|
|
70
|
+
// // Проверяем, что событие change срабатывает
|
|
71
|
+
// expect(wrapper.emitted('change')).toBeTruthy();
|
|
72
|
+
// expect(wrapper.emitted('change')![0]).toEqual(['option1']);
|
|
73
|
+
// });
|
|
74
|
+
});
|