designer-assignment.component.scss 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. .designer-assignment-container {
  2. padding: 24px;
  3. background: white;
  4. border-radius: 8px;
  5. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  6. // 移动端优化
  7. @media (max-width: 768px) {
  8. padding: 16px;
  9. border-radius: 0;
  10. box-shadow: none;
  11. }
  12. }
  13. .section-header {
  14. display: flex;
  15. align-items: center;
  16. justify-content: space-between;
  17. margin-bottom: 24px;
  18. padding-bottom: 16px;
  19. border-bottom: 1px solid #f0f0f0;
  20. h3 {
  21. margin: 0;
  22. font-size: 18px;
  23. font-weight: 600;
  24. color: #262626;
  25. }
  26. .assignment-summary {
  27. display: flex;
  28. gap: 16px;
  29. font-size: 14px;
  30. .team-info {
  31. color: #1890ff;
  32. font-weight: 500;
  33. }
  34. .cross-team-info {
  35. color: #722ed1;
  36. font-weight: 500;
  37. }
  38. }
  39. }
  40. // 精美的设计师分配选择框样式
  41. .designer-selection-dropdown {
  42. margin-bottom: 24px;
  43. .dropdown-header {
  44. border: 2px solid #d9d9d9;
  45. border-radius: 8px;
  46. padding: 16px 20px;
  47. cursor: pointer;
  48. transition: all 0.3s ease;
  49. background: linear-gradient(135deg, #fafafa 0%, #ffffff 100%);
  50. display: flex;
  51. align-items: center;
  52. justify-content: space-between;
  53. min-height: 60px;
  54. position: relative;
  55. overflow: hidden;
  56. &::before {
  57. content: '';
  58. position: absolute;
  59. top: 0;
  60. left: 0;
  61. right: 0;
  62. height: 3px;
  63. background: linear-gradient(90deg, #1890ff 0%, #722ed1 100%);
  64. opacity: 0;
  65. transition: opacity 0.3s ease;
  66. }
  67. &:hover {
  68. border-color: #1890ff;
  69. box-shadow: 0 4px 12px rgba(24, 144, 255, 0.15);
  70. transform: translateY(-1px);
  71. &::before {
  72. opacity: 1;
  73. }
  74. }
  75. &:active {
  76. transform: translateY(0);
  77. }
  78. .dropdown-content {
  79. flex: 1;
  80. .selected-team-info {
  81. .team-name {
  82. font-size: 16px;
  83. font-weight: 600;
  84. color: #262626;
  85. margin-bottom: 4px;
  86. }
  87. .team-summary {
  88. font-size: 14px;
  89. color: #8c8c8c;
  90. line-height: 1.4;
  91. }
  92. }
  93. .placeholder-text {
  94. display: flex;
  95. align-items: center;
  96. gap: 12px;
  97. color: #8c8c8c;
  98. font-size: 15px;
  99. .placeholder-icon {
  100. font-size: 20px;
  101. opacity: 0.8;
  102. }
  103. }
  104. }
  105. .dropdown-arrow {
  106. color: #8c8c8c;
  107. transition: all 0.3s ease;
  108. margin-left: 16px;
  109. svg {
  110. transition: transform 0.3s ease;
  111. }
  112. }
  113. &:hover .dropdown-arrow {
  114. color: #1890ff;
  115. svg {
  116. transform: translateY(-1px);
  117. }
  118. }
  119. }
  120. }
  121. // 日历弹窗样式
  122. .calendar-modal-overlay {
  123. position: fixed;
  124. top: 0;
  125. left: 0;
  126. right: 0;
  127. bottom: 0;
  128. background: rgba(0, 0, 0, 0.5);
  129. display: flex;
  130. align-items: center;
  131. justify-content: center;
  132. z-index: 1100;
  133. }
  134. .calendar-modal-container {
  135. background: white;
  136. border-radius: 12px;
  137. width: 80vw;
  138. max-width: 800px;
  139. max-height: 80vh;
  140. display: flex;
  141. flex-direction: column;
  142. box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
  143. }
  144. .calendar-modal-header {
  145. display: flex;
  146. align-items: center;
  147. justify-content: space-between;
  148. padding: 20px 24px;
  149. border-bottom: 1px solid #f0f0f0;
  150. h3 {
  151. margin: 0;
  152. font-size: 18px;
  153. font-weight: 600;
  154. color: #262626;
  155. }
  156. .close-btn {
  157. background: none;
  158. border: none;
  159. padding: 6px;
  160. cursor: pointer;
  161. border-radius: 4px;
  162. color: #8c8c8c;
  163. transition: all 0.2s ease;
  164. &:hover {
  165. background: #f5f5f5;
  166. color: #262626;
  167. }
  168. }
  169. }
  170. .calendar-modal-body {
  171. flex: 1;
  172. overflow-y: auto;
  173. padding: 24px;
  174. .designer-calendar-placeholder {
  175. text-align: center;
  176. padding: 40px 20px;
  177. p {
  178. font-size: 16px;
  179. color: #8c8c8c;
  180. margin-bottom: 24px;
  181. }
  182. .designer-info-summary {
  183. background: #f9f9f9;
  184. border-radius: 8px;
  185. padding: 20px;
  186. text-align: left;
  187. max-width: 400px;
  188. margin: 0 auto;
  189. h4 {
  190. margin: 0 0 12px 0;
  191. font-size: 16px;
  192. font-weight: 600;
  193. color: #262626;
  194. }
  195. p {
  196. margin: 8px 0;
  197. font-size: 14px;
  198. color: #595959;
  199. }
  200. }
  201. }
  202. }
  203. // 自动分配建议样式
  204. .auto-suggestion {
  205. background: linear-gradient(135deg, #fff7e6 0%, #fff2e8 100%);
  206. border: 1px solid #ffd591;
  207. border-radius: 8px;
  208. padding: 16px 20px;
  209. margin-bottom: 24px;
  210. .suggestion-header {
  211. display: flex;
  212. align-items: center;
  213. gap: 8px;
  214. margin-bottom: 8px;
  215. font-weight: 600;
  216. color: #d46b08;
  217. .suggestion-icon {
  218. font-size: 16px;
  219. }
  220. }
  221. p {
  222. margin: 0;
  223. font-size: 14px;
  224. color: #8c4a00;
  225. line-height: 1.5;
  226. }
  227. }
  228. // 报价项目分配样式
  229. .quotation-assignment-section {
  230. margin-bottom: 32px;
  231. h4 {
  232. margin: 0 0 16px 0;
  233. font-size: 16px;
  234. font-weight: 600;
  235. color: #262626;
  236. }
  237. }
  238. .assignment-grid {
  239. display: grid;
  240. gap: 16px;
  241. }
  242. .assignment-card {
  243. border: 1px solid #f0f0f0;
  244. border-radius: 8px;
  245. padding: 20px;
  246. background: white;
  247. .assignment-header {
  248. display: flex;
  249. align-items: center;
  250. justify-content: space-between;
  251. margin-bottom: 16px;
  252. padding-bottom: 12px;
  253. border-bottom: 1px solid #f5f5f5;
  254. h5 {
  255. margin: 0;
  256. font-size: 15px;
  257. font-weight: 600;
  258. color: #262626;
  259. }
  260. .assigned-count {
  261. font-size: 13px;
  262. color: #1890ff;
  263. font-weight: 500;
  264. }
  265. }
  266. }
  267. .designer-selection {
  268. .available-designers {
  269. h6 {
  270. margin: 0 0 12px 0;
  271. font-size: 14px;
  272. font-weight: 600;
  273. color: #595959;
  274. }
  275. }
  276. }
  277. .designer-list {
  278. display: grid;
  279. gap: 12px;
  280. }
  281. .designer-item {
  282. display: flex;
  283. align-items: center;
  284. gap: 12px;
  285. padding: 12px;
  286. border: 1px solid #f0f0f0;
  287. border-radius: 6px;
  288. cursor: pointer;
  289. transition: all 0.2s ease;
  290. &:hover {
  291. border-color: #d9d9d9;
  292. background: #fafafa;
  293. }
  294. &.assigned {
  295. border-color: #1890ff;
  296. background: #f6ffed;
  297. }
  298. .designer-avatar {
  299. position: relative;
  300. flex-shrink: 0;
  301. img, .avatar-placeholder {
  302. width: 40px;
  303. height: 40px;
  304. border-radius: 50%;
  305. }
  306. .avatar-placeholder {
  307. background: #f0f0f0;
  308. display: flex;
  309. align-items: center;
  310. justify-content: center;
  311. font-weight: 600;
  312. color: #8c8c8c;
  313. font-size: 16px;
  314. }
  315. }
  316. .designer-info {
  317. flex: 1;
  318. min-width: 0;
  319. .designer-name {
  320. font-size: 14px;
  321. font-weight: 600;
  322. color: #262626;
  323. margin-bottom: 4px;
  324. display: flex;
  325. align-items: center;
  326. gap: 6px;
  327. .leader-badge {
  328. background: #1890ff;
  329. color: white;
  330. font-size: 10px;
  331. padding: 2px 4px;
  332. border-radius: 3px;
  333. font-weight: 500;
  334. }
  335. }
  336. .designer-status {
  337. display: flex;
  338. align-items: center;
  339. gap: 8px;
  340. margin-bottom: 6px;
  341. .status-dot {
  342. width: 8px;
  343. height: 8px;
  344. border-radius: 50%;
  345. }
  346. .status-text {
  347. font-size: 12px;
  348. color: #8c8c8c;
  349. }
  350. .idle-days {
  351. font-size: 11px;
  352. color: #faad14;
  353. font-weight: 500;
  354. }
  355. }
  356. .workload-bar {
  357. position: relative;
  358. height: 4px;
  359. background: #f0f0f0;
  360. border-radius: 2px;
  361. overflow: hidden;
  362. .workload-fill {
  363. height: 100%;
  364. background: linear-gradient(90deg, #52c41a 0%, #faad14 50%, #ff4d4f 100%);
  365. transition: width 0.3s ease;
  366. }
  367. .workload-text {
  368. position: absolute;
  369. right: 0;
  370. top: -18px;
  371. font-size: 11px;
  372. color: #8c8c8c;
  373. }
  374. }
  375. }
  376. .assignment-actions {
  377. flex-shrink: 0;
  378. .assign-btn, .remove-btn {
  379. padding: 4px 8px;
  380. border: none;
  381. border-radius: 4px;
  382. font-size: 12px;
  383. cursor: pointer;
  384. transition: all 0.2s ease;
  385. }
  386. .assign-btn {
  387. background: #1890ff;
  388. color: white;
  389. &:hover {
  390. background: #40a9ff;
  391. }
  392. }
  393. .remove-btn {
  394. background: #ff4d4f;
  395. color: white;
  396. &:hover {
  397. background: #ff7875;
  398. }
  399. }
  400. }
  401. }
  402. // 跨组合作样式
  403. .cross-team-section {
  404. margin-bottom: 32px;
  405. padding-top: 24px;
  406. border-top: 1px solid #f0f0f0;
  407. .section-title {
  408. display: flex;
  409. align-items: center;
  410. justify-content: space-between;
  411. margin-bottom: 16px;
  412. h4 {
  413. margin: 0;
  414. font-size: 16px;
  415. font-weight: 600;
  416. color: #262626;
  417. }
  418. .toggle-btn {
  419. background: #1890ff;
  420. color: white;
  421. border: none;
  422. padding: 6px 12px;
  423. border-radius: 4px;
  424. font-size: 13px;
  425. cursor: pointer;
  426. transition: background 0.2s ease;
  427. &:hover {
  428. background: #40a9ff;
  429. }
  430. }
  431. }
  432. }
  433. .selected-collaborators {
  434. margin-bottom: 20px;
  435. h5 {
  436. margin: 0 0 12px 0;
  437. font-size: 14px;
  438. font-weight: 600;
  439. color: #595959;
  440. }
  441. }
  442. .collaborator-list {
  443. display: flex;
  444. flex-wrap: wrap;
  445. gap: 8px;
  446. }
  447. .collaborator-item {
  448. display: flex;
  449. align-items: center;
  450. gap: 8px;
  451. background: #f0f8ff;
  452. border: 1px solid #91d5ff;
  453. border-radius: 16px;
  454. padding: 6px 12px;
  455. .designer-info {
  456. .designer-name {
  457. font-size: 13px;
  458. font-weight: 500;
  459. color: #1890ff;
  460. }
  461. .team-name {
  462. font-size: 11px;
  463. color: #8c8c8c;
  464. }
  465. }
  466. .remove-collaborator-btn {
  467. background: none;
  468. border: none;
  469. color: #8c8c8c;
  470. cursor: pointer;
  471. font-size: 14px;
  472. padding: 2px;
  473. border-radius: 50%;
  474. width: 16px;
  475. height: 16px;
  476. display: flex;
  477. align-items: center;
  478. justify-content: center;
  479. &:hover {
  480. background: #ff4d4f;
  481. color: white;
  482. }
  483. }
  484. }
  485. .cross-team-selection {
  486. h5 {
  487. margin: 0 0 16px 0;
  488. font-size: 14px;
  489. font-weight: 600;
  490. color: #595959;
  491. }
  492. }
  493. .cross-team-grid {
  494. display: grid;
  495. gap: 20px;
  496. }
  497. .cross-team-group {
  498. h6 {
  499. margin: 0 0 12px 0;
  500. font-size: 13px;
  501. font-weight: 600;
  502. color: #722ed1;
  503. }
  504. .designer-item {
  505. .selection-actions {
  506. .add-btn, .remove-btn {
  507. padding: 4px 8px;
  508. border: none;
  509. border-radius: 4px;
  510. font-size: 12px;
  511. cursor: pointer;
  512. transition: all 0.2s ease;
  513. }
  514. .add-btn {
  515. background: #722ed1;
  516. color: white;
  517. &:hover {
  518. background: #9254de;
  519. }
  520. }
  521. .remove-btn {
  522. background: #ff4d4f;
  523. color: white;
  524. &:hover {
  525. background: #ff7875;
  526. }
  527. }
  528. }
  529. }
  530. }
  531. // 备注样式
  532. .notes-section {
  533. margin-bottom: 24px;
  534. label {
  535. display: block;
  536. margin-bottom: 8px;
  537. font-size: 14px;
  538. font-weight: 600;
  539. color: #262626;
  540. }
  541. .notes-textarea {
  542. width: 100%;
  543. padding: 12px;
  544. border: 1px solid #d9d9d9;
  545. border-radius: 6px;
  546. font-size: 14px;
  547. resize: vertical;
  548. transition: border-color 0.2s ease;
  549. &:focus {
  550. outline: none;
  551. border-color: #1890ff;
  552. box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
  553. }
  554. &::placeholder {
  555. color: #bfbfbf;
  556. }
  557. }
  558. }
  559. // 分配总结样式
  560. .assignment-summary-section {
  561. background: #fafafa;
  562. border-radius: 8px;
  563. padding: 20px;
  564. h4 {
  565. margin: 0 0 16px 0;
  566. font-size: 16px;
  567. font-weight: 600;
  568. color: #262626;
  569. }
  570. }
  571. .summary-content {
  572. .summary-item {
  573. margin-bottom: 12px;
  574. .label {
  575. font-weight: 600;
  576. color: #595959;
  577. margin-right: 8px;
  578. }
  579. .value {
  580. color: #262626;
  581. }
  582. }
  583. .assignment-list {
  584. margin-top: 8px;
  585. }
  586. .assignment-summary-item {
  587. margin-bottom: 8px;
  588. padding: 8px 12px;
  589. background: white;
  590. border-radius: 4px;
  591. border-left: 3px solid #1890ff;
  592. .project-name {
  593. font-weight: 500;
  594. color: #262626;
  595. margin-right: 12px;
  596. }
  597. .assigned-designers {
  598. display: flex;
  599. flex-wrap: wrap;
  600. gap: 4px;
  601. }
  602. .designer-tag {
  603. background: #e6f7ff;
  604. color: #1890ff;
  605. font-size: 12px;
  606. padding: 2px 6px;
  607. border-radius: 3px;
  608. }
  609. }
  610. .collaborator-tags {
  611. display: flex;
  612. flex-wrap: wrap;
  613. gap: 4px;
  614. margin-top: 8px;
  615. .collaborator-tag {
  616. background: #f9f0ff;
  617. color: #722ed1;
  618. font-size: 12px;
  619. padding: 2px 6px;
  620. border-radius: 3px;
  621. }
  622. }
  623. }
  624. // 响应式设计
  625. @media (max-width: 768px) {
  626. .designer-assignment-container {
  627. padding: 16px;
  628. }
  629. .section-header {
  630. flex-direction: column;
  631. align-items: flex-start;
  632. gap: 12px;
  633. }
  634. .designer-selection-dropdown .dropdown-header {
  635. padding: 12px 16px;
  636. min-height: 50px;
  637. }
  638. .assignment-grid {
  639. grid-template-columns: 1fr;
  640. }
  641. .cross-team-grid {
  642. grid-template-columns: 1fr;
  643. }
  644. }