ИНН и описание

This commit is contained in:
Халимов Рустам
2026-02-16 00:06:29 +03:00
parent 125bf410ed
commit b09949ed1e
77 changed files with 365 additions and 365 deletions
+5 -5
View File
@@ -6,15 +6,15 @@
"static/css/app/layout.css", "static/css/app/layout.css",
"static/chunks/app/layout.js" "static/chunks/app/layout.js"
], ],
"/dashboard/profile/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/dashboard/profile/page.js"
],
"/page": [ "/page": [
"static/chunks/webpack.js", "static/chunks/webpack.js",
"static/chunks/main-app.js", "static/chunks/main-app.js",
"static/chunks/app/page.js" "static/chunks/app/page.js"
],
"/dashboard/profile/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/dashboard/profile/page.js"
] ]
} }
} }
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -61,6 +61,16 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }), /***/ }),
/***/ "(ssr)/./node_modules/lucide-react/dist/esm/icons/chevron-down.js":
/*!******************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/chevron-down.js ***!
\******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ChevronDown)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(ssr)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst ChevronDown = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"ChevronDown\", [\n [\n \"path\",\n {\n d: \"m6 9 6 6 6-6\",\n key: \"qrunsl\"\n }\n ]\n]);\n //# sourceMappingURL=chevron-down.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tZG93bi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWFNLG9CQUFjLGdFQUFnQixDQUFDLGFBQWU7SUFDbEQ7UUFBQyxNQUFRO1FBQUE7WUFBRSxHQUFHLENBQWdCO1lBQUEsS0FBSztRQUFBLENBQVU7S0FBQTtDQUM5QyIsInNvdXJjZXMiOlsiRTpcXHNyY1xcaWNvbnNcXGNoZXZyb24tZG93bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uJztcblxuLyoqXG4gKiBAY29tcG9uZW50IEBuYW1lIENoZXZyb25Eb3duXG4gKiBAZGVzY3JpcHRpb24gTHVjaWRlIFNWRyBpY29uIGNvbXBvbmVudCwgcmVuZGVycyBTVkcgRWxlbWVudCB3aXRoIGNoaWxkcmVuLlxuICpcbiAqIEBwcmV2aWV3ICFbaW1nXShkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUFnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JZ29nSUhkcFpIUm9QU0l5TkNJS0lDQm9aV2xuYUhROUlqSTBJZ29nSUhacFpYZENiM2c5SWpBZ01DQXlOQ0F5TkNJS0lDQm1hV3hzUFNKdWIyNWxJZ29nSUhOMGNtOXJaVDBpSXpBd01DSWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3SUdKdmNtUmxjaTF5WVdScGRYTTZJREp3ZUNJS0lDQnpkSEp2YTJVdGQybGtkR2c5SWpJaUNpQWdjM1J5YjJ0bExXeHBibVZqWVhBOUluSnZkVzVrSWdvZ0lITjBjbTlyWlMxc2FXNWxhbTlwYmowaWNtOTFibVFpQ2o0S0lDQThjR0YwYUNCa1BTSnROaUE1SURZZ05pQTJMVFlpSUM4K0Nqd3ZjM1puUGdvPSkgLSBodHRwczovL2x1Y2lkZS5kZXYvaWNvbnMvY2hldnJvbi1kb3duXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgQ2hldnJvbkRvd24gPSBjcmVhdGVMdWNpZGVJY29uKCdDaGV2cm9uRG93bicsIFtcbiAgWydwYXRoJywgeyBkOiAnbTYgOSA2IDYgNi02Jywga2V5OiAncXJ1bnNsJyB9XSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBDaGV2cm9uRG93bjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/lucide-react/dist/esm/icons/chevron-down.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/lucide-react/dist/esm/icons/chevron-right.js": /***/ "(ssr)/./node_modules/lucide-react/dist/esm/icons/chevron-right.js":
/*!*******************************************************************!*\ /*!*******************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/chevron-right.js ***! !*** ./node_modules/lucide-react/dist/esm/icons/chevron-right.js ***!
@@ -71,6 +81,16 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }), /***/ }),
/***/ "(ssr)/./node_modules/lucide-react/dist/esm/icons/chevron-up.js":
/*!****************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/chevron-up.js ***!
\****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ChevronUp)\n/* harmony export */ });\n/* harmony import */ var _createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLucideIcon.js */ \"(ssr)/./node_modules/lucide-react/dist/esm/createLucideIcon.js\");\n/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */ \nconst ChevronUp = (0,_createLucideIcon_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(\"ChevronUp\", [\n [\n \"path\",\n {\n d: \"m18 15-6-6-6 6\",\n key: \"153udz\"\n }\n ]\n]);\n //# sourceMappingURL=chevron-up.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvbHVjaWRlLXJlYWN0L2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tdXAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFhQSxDQUFNLGNBQVksb0VBQWlCLFdBQWE7SUFBQztRQUFDO1FBQVE7WUFBRSxHQUFHLGdCQUFrQjtZQUFBLEtBQUssQ0FBUztRQUFBLENBQUM7S0FBQztDQUFDIiwic291cmNlcyI6WyJFOlxcc3JjXFxpY29uc1xcY2hldnJvbi11cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTHVjaWRlSWNvbiBmcm9tICcuLi9jcmVhdGVMdWNpZGVJY29uJztcblxuLyoqXG4gKiBAY29tcG9uZW50IEBuYW1lIENoZXZyb25VcFxuICogQGRlc2NyaXB0aW9uIEx1Y2lkZSBTVkcgaWNvbiBjb21wb25lbnQsIHJlbmRlcnMgU1ZHIEVsZW1lbnQgd2l0aCBjaGlsZHJlbi5cbiAqXG4gKiBAcHJldmlldyAhW2ltZ10oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlBZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWdvZ0lIZHBaSFJvUFNJeU5DSUtJQ0JvWldsbmFIUTlJakkwSWdvZ0lIWnBaWGRDYjNnOUlqQWdNQ0F5TkNBeU5DSUtJQ0JtYVd4c1BTSnViMjVsSWdvZ0lITjBjbTlyWlQwaUl6QXdNQ0lnYzNSNWJHVTlJbUpoWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN0lHSnZjbVJsY2kxeVlXUnBkWE02SURKd2VDSUtJQ0J6ZEhKdmEyVXRkMmxrZEdnOUlqSWlDaUFnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lnb2dJSE4wY205clpTMXNhVzVsYW05cGJqMGljbTkxYm1RaUNqNEtJQ0E4Y0dGMGFDQmtQU0p0TVRnZ01UVXROaTAyTFRZZ05pSWdMejRLUEM5emRtYytDZz09KSAtIGh0dHBzOi8vbHVjaWRlLmRldi9pY29ucy9jaGV2cm9uLXVwXG4gKiBAc2VlIGh0dHBzOi8vbHVjaWRlLmRldi9ndWlkZS9wYWNrYWdlcy9sdWNpZGUtcmVhY3QgLSBEb2N1bWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIC0gTHVjaWRlIGljb25zIHByb3BzIGFuZCBhbnkgdmFsaWQgU1ZHIGF0dHJpYnV0ZVxuICogQHJldHVybnMge0pTWC5FbGVtZW50fSBKU1ggRWxlbWVudFxuICpcbiAqL1xuY29uc3QgQ2hldnJvblVwID0gY3JlYXRlTHVjaWRlSWNvbignQ2hldnJvblVwJywgW1sncGF0aCcsIHsgZDogJ20xOCAxNS02LTYtNiA2Jywga2V5OiAnMTUzdWR6JyB9XV0pO1xuXG5leHBvcnQgZGVmYXVsdCBDaGV2cm9uVXA7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/lucide-react/dist/esm/icons/chevron-up.js\n");
/***/ }),
/***/ "(ssr)/./node_modules/lucide-react/dist/esm/icons/circle.js": /***/ "(ssr)/./node_modules/lucide-react/dist/esm/icons/circle.js":
/*!************************************************************!*\ /*!************************************************************!*\
!*** ./node_modules/lucide-react/dist/esm/icons/circle.js ***! !*** ./node_modules/lucide-react/dist/esm/icons/circle.js ***!
+1 -1
View File
@@ -125,7 +125,7 @@
/******/ /******/
/******/ /* webpack/runtime/getFullHash */ /******/ /* webpack/runtime/getFullHash */
/******/ (() => { /******/ (() => {
/******/ __webpack_require__.h = () => ("52e41ee6cf15402e") /******/ __webpack_require__.h = () => ("ce9dd6090da4619d")
/******/ })(); /******/ })();
/******/ /******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ /* webpack/runtime/hasOwnProperty shorthand */
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -190,7 +190,7 @@
/******/ /******/
/******/ /* webpack/runtime/getFullHash */ /******/ /* webpack/runtime/getFullHash */
/******/ (() => { /******/ (() => {
/******/ __webpack_require__.h = () => ("394f42817468d9e8") /******/ __webpack_require__.h = () => ("e50847f54ba36121")
/******/ })(); /******/ })();
/******/ /******/
/******/ /* webpack/runtime/global */ /******/ /* webpack/runtime/global */
+47 -6
View File
@@ -719,6 +719,9 @@ video {
.mb-10 { .mb-10 {
margin-bottom: 2.5rem; margin-bottom: 2.5rem;
} }
.mb-2 {
margin-bottom: 0.5rem;
}
.mb-3 { .mb-3 {
margin-bottom: 0.75rem; margin-bottom: 0.75rem;
} }
@@ -737,15 +740,18 @@ video {
.mr-2 { .mr-2 {
margin-right: 0.5rem; margin-right: 0.5rem;
} }
.mr-4 {
margin-right: 1rem;
}
.mt-1 {
margin-top: 0.25rem;
}
.mt-12 { .mt-12 {
margin-top: 3rem; margin-top: 3rem;
} }
.mt-2 { .mt-2 {
margin-top: 0.5rem; margin-top: 0.5rem;
} }
.mb-2 {
margin-bottom: 0.5rem;
}
.block { .block {
display: block; display: block;
} }
@@ -815,6 +821,9 @@ video {
.h-\[calc\(100vh-4rem\)\] { .h-\[calc\(100vh-4rem\)\] {
height: calc(100vh - 4rem); height: calc(100vh - 4rem);
} }
.h-auto {
height: auto;
}
.h-full { .h-full {
height: 100%; height: 100%;
} }
@@ -824,6 +833,9 @@ video {
.max-h-\[300px\] { .max-h-\[300px\] {
max-height: 300px; max-height: 300px;
} }
.min-h-\[80px\] {
min-height: 80px;
}
.min-h-\[calc\(100-4rem\)\] { .min-h-\[calc\(100-4rem\)\] {
min-height: calc(100 - 4rem); min-height: calc(100 - 4rem);
} }
@@ -869,6 +881,9 @@ video {
.w-screen { .w-screen {
width: 100vw; width: 100vw;
} }
.min-w-0 {
min-width: 0px;
}
.min-w-\[8rem\] { .min-w-\[8rem\] {
min-width: 8rem; min-width: 8rem;
} }
@@ -962,9 +977,15 @@ video {
.flex-wrap { .flex-wrap {
flex-wrap: wrap; flex-wrap: wrap;
} }
.items-start {
align-items: flex-start;
}
.items-center { .items-center {
align-items: center; align-items: center;
} }
.justify-start {
justify-content: flex-start;
}
.justify-end { .justify-end {
justify-content: flex-end; justify-content: flex-end;
} }
@@ -1050,6 +1071,12 @@ video {
.whitespace-nowrap { .whitespace-nowrap {
white-space: nowrap; white-space: nowrap;
} }
.whitespace-pre-wrap {
white-space: pre-wrap;
}
.break-words {
overflow-wrap: break-word;
}
.rounded-full { .rounded-full {
border-radius: 9999px; border-radius: 9999px;
} }
@@ -1149,6 +1176,9 @@ video {
-o-object-fit: cover; -o-object-fit: cover;
object-fit: cover; object-fit: cover;
} }
.p-0 {
padding: 0px;
}
.p-0\.5 { .p-0\.5 {
padding: 0.125rem; padding: 0.125rem;
} }
@@ -1223,6 +1253,9 @@ video {
.pt-16 { .pt-16 {
padding-top: 4rem; padding-top: 4rem;
} }
.text-left {
text-align: left;
}
.text-center { .text-center {
text-align: center; text-align: center;
} }
@@ -1276,6 +1309,9 @@ video {
.leading-none { .leading-none {
line-height: 1; line-height: 1;
} }
.leading-relaxed {
line-height: 1.625;
}
.tracking-tight { .tracking-tight {
letter-spacing: -0.025em; letter-spacing: -0.025em;
} }
@@ -1320,6 +1356,9 @@ video {
.text-muted-foreground { .text-muted-foreground {
color: hsl(var(--muted-foreground)); color: hsl(var(--muted-foreground));
} }
.text-muted-foreground\/30 {
color: hsl(var(--muted-foreground) / 0.3);
}
.text-popover-foreground { .text-popover-foreground {
color: hsl(var(--popover-foreground)); color: hsl(var(--popover-foreground));
} }
@@ -1340,9 +1379,6 @@ video {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity, 1)); color: rgb(255 255 255 / var(--tw-text-opacity, 1));
} }
.text-muted-foreground\/30 {
color: hsl(var(--muted-foreground) / 0.3);
}
.underline { .underline {
text-decoration-line: underline; text-decoration-line: underline;
} }
@@ -1528,6 +1564,11 @@ video {
color: rgb(37 99 235 / var(--tw-text-opacity, 1)); color: rgb(37 99 235 / var(--tw-text-opacity, 1));
} }
.hover\:text-blue-700:hover {
--tw-text-opacity: 1;
color: rgb(29 78 216 / var(--tw-text-opacity, 1));
}
.hover\:text-white:hover { .hover\:text-white:hover {
--tw-text-opacity: 1; --tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity, 1)); color: rgb(255 255 255 / var(--tw-text-opacity, 1));
@@ -1 +0,0 @@
{"c":["app/layout","app/dashboard/profile/page","webpack"],"r":[],"m":[]}
@@ -1 +0,0 @@
{"c":["app/layout","app/dashboard/profile/page","webpack"],"r":[],"m":[]}
@@ -1 +0,0 @@
{"c":["app/layout","app/dashboard/profile/page","webpack"],"r":[],"m":[]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,22 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("app/layout",{
/***/ "(app-pages-browser)/./src/app/globals.css":
/*!*****************************!*\
!*** ./src/app/globals.css ***!
\*****************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"3a7792a74289\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJFOlxcR0lUXFxtdnBcXG5hc2hlbC1mcm9udGVuZFxcc3JjXFxhcHBcXGdsb2JhbHMuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiM2E3NzkyYTc0Mjg5XCJcbmlmIChtb2R1bGUuaG90KSB7IG1vZHVsZS5ob3QuYWNjZXB0KCkgfVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n"));
/***/ })
});
@@ -1,22 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("app/layout",{
/***/ "(app-pages-browser)/./src/app/globals.css":
/*!*****************************!*\
!*** ./src/app/globals.css ***!
\*****************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"a9c8105db374\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJFOlxcR0lUXFxtdnBcXG5hc2hlbC1mcm9udGVuZFxcc3JjXFxhcHBcXGdsb2JhbHMuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiYTljODEwNWRiMzc0XCJcbmlmIChtb2R1bGUuaG90KSB7IG1vZHVsZS5ob3QuYWNjZXB0KCkgfVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n"));
/***/ })
});
@@ -15,7 +15,7 @@ self["webpackHotUpdate_N_E"]("app/layout",{
\*****************************/ \*****************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => { /***/ ((module, __webpack_exports__, __webpack_require__) => {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"936bdf7dfbdd\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJFOlxcR0lUXFxtdnBcXG5hc2hlbC1mcm9udGVuZFxcc3JjXFxhcHBcXGdsb2JhbHMuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiOTM2YmRmN2RmYmRkXCJcbmlmIChtb2R1bGUuaG90KSB7IG1vZHVsZS5ob3QuYWNjZXB0KCkgfVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n")); eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"f6ddba6ab363\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJFOlxcR0lUXFxtdnBcXG5hc2hlbC1mcm9udGVuZFxcc3JjXFxhcHBcXGdsb2JhbHMuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiZjZkZGJhNmFiMzYzXCJcbmlmIChtb2R1bGUuaG90KSB7IG1vZHVsZS5ob3QuYWNjZXB0KCkgfVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n"));
/***/ }) /***/ })
@@ -1,22 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("app/layout",{
/***/ "(app-pages-browser)/./src/app/globals.css":
/*!*****************************!*\
!*** ./src/app/globals.css ***!
\*****************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"c24ac521b5f4\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJFOlxcR0lUXFxtdnBcXG5hc2hlbC1mcm9udGVuZFxcc3JjXFxhcHBcXGdsb2JhbHMuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiYzI0YWM1MjFiNWY0XCJcbmlmIChtb2R1bGUuaG90KSB7IG1vZHVsZS5ob3QuYWNjZXB0KCkgfVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n"));
/***/ })
});
@@ -1,22 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("app/layout",{
/***/ "(app-pages-browser)/./src/app/globals.css":
/*!*****************************!*\
!*** ./src/app/globals.css ***!
\*****************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"5adde7f7695d\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJFOlxcR0lUXFxtdnBcXG5hc2hlbC1mcm9udGVuZFxcc3JjXFxhcHBcXGdsb2JhbHMuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiNWFkZGU3Zjc2OTVkXCJcbmlmIChtb2R1bGUuaG90KSB7IG1vZHVsZS5ob3QuYWNjZXB0KCkgfVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n"));
/***/ })
});
@@ -1,22 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("app/layout",{
/***/ "(app-pages-browser)/./src/app/globals.css":
/*!*****************************!*\
!*** ./src/app/globals.css ***!
\*****************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"f5b552f55ab6\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyJFOlxcR0lUXFxtdnBcXG5hc2hlbC1mcm9udGVuZFxcc3JjXFxhcHBcXGdsb2JhbHMuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiZjViNTUyZjU1YWI2XCJcbmlmIChtb2R1bGUuaG90KSB7IG1vZHVsZS5ob3QuYWNjZXB0KCkgfVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n"));
/***/ })
});
@@ -1 +0,0 @@
{"c":["app/layout","app/dashboard/profile/page","webpack"],"r":[],"m":[]}
@@ -1 +0,0 @@
{"c":["app/layout","app/dashboard/profile/page","webpack"],"r":[],"m":[]}
@@ -11,7 +11,7 @@ self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules /******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */ /******/ /* webpack/runtime/getFullHash */
/******/ (() => { /******/ (() => {
/******/ __webpack_require__.h = () => ("394f42817468d9e8") /******/ __webpack_require__.h = () => ("e50847f54ba36121")
/******/ })(); /******/ })();
/******/ /******/
/******/ } /******/ }
@@ -1,18 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
/******/ __webpack_require__.h = () => ("91e21bea90017462")
/******/ })();
/******/
/******/ }
);
@@ -1,18 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
/******/ __webpack_require__.h = () => ("8b81d9ae5a13d40a")
/******/ })();
/******/
/******/ }
);
@@ -11,7 +11,7 @@ self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules /******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */ /******/ /* webpack/runtime/getFullHash */
/******/ (() => { /******/ (() => {
/******/ __webpack_require__.h = () => ("ef16cd1c2d1f5cee") /******/ __webpack_require__.h = () => ("8e5f3ea2fc677bf6")
/******/ })(); /******/ })();
/******/ /******/
/******/ } /******/ }
@@ -1,18 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
/******/ __webpack_require__.h = () => ("566d0b5e61734f09")
/******/ })();
/******/
/******/ }
);
@@ -1,18 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
/******/ __webpack_require__.h = () => ("b70d42a07ced61e8")
/******/ })();
/******/
/******/ }
);
@@ -1,18 +0,0 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("webpack",{},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
/******/ __webpack_require__.h = () => ("91b736beb04466c3")
/******/ })();
/******/
/******/ }
);
-10
View File
File diff suppressed because one or more lines are too long
+65 -6
View File
@@ -14,11 +14,13 @@ import * as z from "zod"
import { toast } from "sonner" import { toast } from "sonner"
import { Input } from "@/components/ui/input" import { Input } from "@/components/ui/input"
import { Textarea } from "@/components/ui/textarea"
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"
import { formatPhoneNumber } from "@/shared/lib/utils" import { formatPhoneNumber } from "@/shared/lib/utils"
import { AvatarUploader } from "@/components/ui/avatar-uploader" import { AvatarUploader } from "@/components/ui/avatar-uploader"
import { TagInput } from "@/components/ui/tag-input" import { TagInput } from "@/components/ui/tag-input"
import { Rating, useRandomRating } from "@/components/ui/rating" import { Rating, useRandomRating } from "@/components/ui/rating"
import { DescriptionViewer } from "@/components/ui/description-viewer"
const profileSchema = z.object({ const profileSchema = z.object({
firstName: z.string() firstName: z.string()
@@ -34,6 +36,9 @@ const profileSchema = z.object({
}), }),
companyName: z.string().optional(), companyName: z.string().optional(),
inn: z.string().optional(), inn: z.string().optional(),
description: z.string()
.max(2048, "Описание не может превышать 2048 символов")
.optional(),
}) })
const phoneSchema = z.object({ const phoneSchema = z.object({
@@ -71,6 +76,7 @@ export default function ProfilePage() {
patronymic: user?.patronymic || "", patronymic: user?.patronymic || "",
companyName: user?.companyName || "", companyName: user?.companyName || "",
inn: user?.inn || "", inn: user?.inn || "",
description: user?.description || "",
} }
}) })
@@ -182,6 +188,8 @@ export default function ProfilePage() {
lastName: user.lastName, lastName: user.lastName,
patronymic: user.patronymic || "", patronymic: user.patronymic || "",
companyName: user.companyName || "", companyName: user.companyName || "",
inn: user.inn || "",
description: user.description || "",
}); });
} }
setIsEditingProfile(!isEditingProfile); setIsEditingProfile(!isEditingProfile);
@@ -215,7 +223,10 @@ export default function ProfilePage() {
<FormItem> <FormItem>
<FormLabel>Название компании</FormLabel> <FormLabel>Название компании</FormLabel>
<FormControl> <FormControl>
<Input {...field} /> <Input
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -228,7 +239,12 @@ export default function ProfilePage() {
<FormItem> <FormItem>
<FormLabel>ИНН</FormLabel> <FormLabel>ИНН</FormLabel>
<FormControl> <FormControl>
<Input placeholder="1234567890" maxLength={10} {...field} /> <Input
placeholder="1234567890"
maxLength={10}
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -245,7 +261,10 @@ export default function ProfilePage() {
<FormItem> <FormItem>
<FormLabel>Имя</FormLabel> <FormLabel>Имя</FormLabel>
<FormControl> <FormControl>
<Input {...field} /> <Input
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -258,7 +277,10 @@ export default function ProfilePage() {
<FormItem> <FormItem>
<FormLabel>Фамилия</FormLabel> <FormLabel>Фамилия</FormLabel>
<FormControl> <FormControl>
<Input {...field} /> <Input
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -271,7 +293,11 @@ export default function ProfilePage() {
<FormItem> <FormItem>
<FormLabel>Отчество</FormLabel> <FormLabel>Отчество</FormLabel>
<FormControl> <FormControl>
<Input {...field} placeholder="При наличии" /> <Input
placeholder="При наличии"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -279,6 +305,29 @@ export default function ProfilePage() {
/> />
</div> </div>
)} )}
<FormField
control={profileForm.control}
name="description"
render={({ field }) => (
<FormItem>
<FormLabel>Описание</FormLabel>
<FormControl>
<Textarea
placeholder={isCompany ? "Расскажите о вашей компании...&#10;&#10;Вы можете использовать переносы строк для структурирования текста." : "Расскажите о себе и вашем опыте...&#10;&#10;Вы можете использовать переносы строк для структурирования текста."}
maxLength={2048}
rows={6}
className="whitespace-pre-wrap"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl>
<p className="text-xs text-muted-foreground mt-1">
Поддерживаются переносы строк. Максимум 2048 символов.
</p>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit" className="bg-blue-600 hover:bg-blue-700" disabled={isLoading}> <Button type="submit" className="bg-blue-600 hover:bg-blue-700" disabled={isLoading}>
{isLoading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />} {isLoading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
Сохранить изменения Сохранить изменения
@@ -298,6 +347,9 @@ export default function ProfilePage() {
<span className="text-muted-foreground">ИНН</span> <span className="text-muted-foreground">ИНН</span>
<span className="font-medium">{user.inn || "—"}</span> <span className="font-medium">{user.inn || "—"}</span>
</div> </div>
{user.description && (
<DescriptionViewer description={user.description} maxLines={10} />
)}
</> </>
) : ( ) : (
// Для частных лиц - ФИО // Для частных лиц - ФИО
@@ -314,6 +366,9 @@ export default function ProfilePage() {
<span className="text-muted-foreground">Отчество</span> <span className="text-muted-foreground">Отчество</span>
<span className="font-medium">{user.patronymic || "—"}</span> <span className="font-medium">{user.patronymic || "—"}</span>
</div> </div>
{user.description && (
<DescriptionViewer description={user.description} maxLines={10} />
)}
</> </>
)} )}
</div> </div>
@@ -366,7 +421,11 @@ export default function ProfilePage() {
<FormItem> <FormItem>
<FormLabel>Новый номер телефона</FormLabel> <FormLabel>Новый номер телефона</FormLabel>
<FormControl> <FormControl>
<Input {...field} placeholder="+7" /> <Input
placeholder="+7"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
+49
View File
@@ -0,0 +1,49 @@
import { useState } from "react";
import { ChevronDown, ChevronUp } from "lucide-react";
import { Button } from "./button";
interface DescriptionViewerProps {
description: string;
maxLines?: number;
}
export function DescriptionViewer({ description, maxLines = 10 }: DescriptionViewerProps) {
const [isExpanded, setIsExpanded] = useState(false);
if (!description) return null;
const lines = description.split('\n');
const shouldShowSpoiler = lines.length > maxLines;
const displayLines = isExpanded ? lines : lines.slice(0, maxLines);
return (
<div className="flex py-3 justify-start items-start">
<span className="text-muted-foreground mr-4 whitespace-nowrap">Описание</span>
<div className="flex-1 min-w-0">
<div className="text-left whitespace-pre-wrap break-words text-sm leading-relaxed">
{displayLines.join('\n')}
</div>
{shouldShowSpoiler && (
<Button
variant="link"
size="sm"
onClick={() => setIsExpanded(!isExpanded)}
className="mt-2 h-auto p-0 text-blue-600 hover:text-blue-700"
>
{isExpanded ? (
<>
Свернуть
<ChevronUp className="ml-1 h-4 w-4" />
</>
) : (
<>
Показать полностью
<ChevronDown className="ml-1 h-4 w-4" />
</>
)}
</Button>
)}
</div>
</div>
);
}
+24
View File
@@ -0,0 +1,24 @@
import * as React from "react"
import { cn } from "@/shared/lib/utils"
export interface TextareaProps
extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}
const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
({ className, ...props }, ref) => {
return (
<textarea
className={cn(
"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
className
)}
ref={ref}
{...props}
/>
)
}
)
Textarea.displayName = "Textarea"
export { Textarea }
+2 -1
View File
@@ -11,6 +11,7 @@ interface User {
patronymic?: string; patronymic?: string;
companyName?: string; companyName?: string;
inn?: string; inn?: string;
description?: string;
fullName: string; fullName: string;
avatarUrl?: string; avatarUrl?: string;
competencies: string[]; competencies: string[];
@@ -26,7 +27,7 @@ interface SessionState {
register: (data: any) => Promise<void>; register: (data: any) => Promise<void>;
logout: () => void; logout: () => void;
getProfile: () => Promise<void>; getProfile: () => Promise<void>;
updateProfile: (data: { firstName: string, lastName: string, patronymic?: string, companyName?: string }) => Promise<void>; updateProfile: (data: { firstName: string, lastName: string, patronymic?: string, companyName?: string, inn?: string, description?: string }) => Promise<void>;
changePhone: (newPhone: string) => Promise<void>; changePhone: (newPhone: string) => Promise<void>;
becomePerformer: () => Promise<void>; becomePerformer: () => Promise<void>;
updateCompetencies: (competencies: string[]) => Promise<void>; updateCompetencies: (competencies: string[]) => Promise<void>;
+72 -7
View File
@@ -9,6 +9,7 @@ import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button" import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input" import { Input } from "@/components/ui/input"
import { Textarea } from "@/components/ui/textarea"
import { Checkbox } from "@/components/ui/checkbox" import { Checkbox } from "@/components/ui/checkbox"
import { import {
Form, Form,
@@ -32,6 +33,9 @@ const registerSchema = z.object({
isCompany: z.boolean(), isCompany: z.boolean(),
companyName: z.string().optional(), companyName: z.string().optional(),
inn: z.string().optional(), inn: z.string().optional(),
description: z.string()
.max(2048, "Описание не может превышать 2048 символов")
.optional(),
password: z.string().min(6, "Пароль должен быть не менее 6 символов"), password: z.string().min(6, "Пароль должен быть не менее 6 символов"),
confirmPassword: z.string().min(6), confirmPassword: z.string().min(6),
}).refine((data) => data.password === data.confirmPassword, { }).refine((data) => data.password === data.confirmPassword, {
@@ -60,6 +64,7 @@ export function RegisterForm() {
isCompany: false, isCompany: false,
companyName: "", companyName: "",
inn: "", inn: "",
description: "",
password: "", password: "",
confirmPassword: "", confirmPassword: "",
}, },
@@ -88,6 +93,11 @@ export function RegisterForm() {
} }
} }
// Добавляем описание
if (values.description) {
submitData.description = values.description;
}
await register(submitData) await register(submitData)
router.push("/auth/login") router.push("/auth/login")
} catch (error) { } catch (error) {
@@ -115,7 +125,11 @@ export function RegisterForm() {
<FormItem> <FormItem>
<FormLabel>Имя</FormLabel> <FormLabel>Имя</FormLabel>
<FormControl> <FormControl>
<Input placeholder="Иван" {...field} /> <Input
placeholder="Иван"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -128,7 +142,11 @@ export function RegisterForm() {
<FormItem> <FormItem>
<FormLabel>Фамилия</FormLabel> <FormLabel>Фамилия</FormLabel>
<FormControl> <FormControl>
<Input placeholder="Иванов" {...field} /> <Input
placeholder="Иванов"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -143,7 +161,11 @@ export function RegisterForm() {
<FormItem> <FormItem>
<FormLabel>Телефон</FormLabel> <FormLabel>Телефон</FormLabel>
<FormControl> <FormControl>
<Input placeholder="+7 (999) 000-00-00" {...field} /> <Input
placeholder="+7 (999) 000-00-00"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -177,7 +199,11 @@ export function RegisterForm() {
<FormItem> <FormItem>
<FormLabel>Название компании</FormLabel> <FormLabel>Название компании</FormLabel>
<FormControl> <FormControl>
<Input placeholder="ООО 'Ромашка'" {...field} /> <Input
placeholder="ООО 'Ромашка'"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -190,7 +216,12 @@ export function RegisterForm() {
<FormItem> <FormItem>
<FormLabel>ИНН</FormLabel> <FormLabel>ИНН</FormLabel>
<FormControl> <FormControl>
<Input placeholder="1234567890" maxLength={10} {...field} /> <Input
placeholder="1234567890"
maxLength={10}
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -199,6 +230,30 @@ export function RegisterForm() {
</> </>
)} )}
<FormField
control={form.control}
name="description"
render={({ field }) => (
<FormItem>
<FormLabel>Описание (необязательно)</FormLabel>
<FormControl>
<Textarea
placeholder={isCompany ? "Расскажите о вашей компании...&#10;&#10;Вы можете использовать переносы строк для структурирования текста." : "Расскажите о себе и вашем опыте...&#10;&#10;Вы можете использовать переносы строк для структурирования текста."}
maxLength={2048}
rows={4}
className="whitespace-pre-wrap"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl>
<p className="text-xs text-muted-foreground mt-1">
Поддерживаются переносы строк. Максимум 2048 символов.
</p>
<FormMessage />
</FormItem>
)}
/>
<FormField <FormField
control={form.control} control={form.control}
name="password" name="password"
@@ -206,7 +261,12 @@ export function RegisterForm() {
<FormItem> <FormItem>
<FormLabel>Пароль</FormLabel> <FormLabel>Пароль</FormLabel>
<FormControl> <FormControl>
<Input type="password" placeholder="******" {...field} /> <Input
type="password"
placeholder="******"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
@@ -219,7 +279,12 @@ export function RegisterForm() {
<FormItem> <FormItem>
<FormLabel>Подтвердите пароль</FormLabel> <FormLabel>Подтвердите пароль</FormLabel>
<FormControl> <FormControl>
<Input type="password" placeholder="******" {...field} /> <Input
type="password"
placeholder="******"
value={field.value || ""}
onChange={field.onChange}
/>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>