pcm-agents 1.0.1 → 1.0.2
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/dist/cjs/components-chat-message_33.cjs.entry.js +25 -4
- package/dist/cjs/components-chat-message_33.cjs.entry.js.map +1 -1
- package/dist/cjs/{conversation-utils-BSbqTS91.js → conversation-utils-B4jUfmtU.js} +4 -4
- package/dist/cjs/{conversation-utils-BSbqTS91.js.map → conversation-utils-B4jUfmtU.js.map} +1 -1
- package/dist/cjs/{index-CU_o8ASa.js → index-Dghp_NL6.js} +3 -3
- package/dist/cjs/{index-CU_o8ASa.js.map → index-Dghp_NL6.js.map} +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/oem-htws-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-jd-modal.cjs.entry.js +2 -2
- package/dist/cjs/oem-jlpp-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-jlzz-modal.cjs.entry.js +23 -2
- package/dist/cjs/oem-jlzz-modal.cjs.entry.js.map +1 -1
- package/dist/cjs/oem-jlzz-modal.entry.cjs.js.map +1 -1
- package/dist/cjs/oem-mnct-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-mnms-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-qgqjl-modal.cjs.entry.js +3 -3
- package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js +2 -2
- package/dist/cjs/pcm-jlsx-modal.cjs.entry.js +2 -2
- package/dist/cjs/{sentry-reporter-DmBt7dYt.js → sentry-reporter-CgJowDyu.js} +3 -3
- package/dist/cjs/{sentry-reporter-DmBt7dYt.js.map → sentry-reporter-CgJowDyu.js.map} +1 -1
- package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.css +8 -2
- package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.js +35 -0
- package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.js.map +1 -1
- package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.css +8 -2
- package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js +35 -0
- package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js.map +1 -1
- package/dist/components/components-chat-message.js +1 -1
- package/dist/components/components-digital-human.js +1 -1
- package/dist/components/components-export-records-modal.js +1 -1
- package/dist/components/components-mobile-input-btn.js +1 -1
- package/dist/components/components-mobile-upload-btn.js +1 -1
- package/dist/components/components-position-selector.js +1 -1
- package/dist/components/components-thousand-resume-wrapper.js +1 -1
- package/dist/components/components-upload.js +1 -1
- package/dist/components/components-voice-input-btn.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/oem-htws-modal.js +5 -5
- package/dist/components/oem-jd-modal.js +5 -5
- package/dist/components/oem-jlpp-modal.js +7 -7
- package/dist/components/oem-jlsx-modal.js +5 -5
- package/dist/components/oem-jlzz-modal.js +27 -6
- package/dist/components/oem-jlzz-modal.js.map +1 -1
- package/dist/components/oem-mnct-modal.js +7 -7
- package/dist/components/oem-mnms-modal.js +8 -8
- package/dist/components/oem-qgqjl-modal.js +9 -9
- package/dist/components/oem-zygh-modal.js +5 -5
- package/dist/components/{p-DtLvVebv.js → p-BDEiyYVl.js} +3 -3
- package/dist/components/{p-DtLvVebv.js.map → p-BDEiyYVl.js.map} +1 -1
- package/dist/components/{p-3Q_UlCBS.js → p-Bg0KKnpU.js} +3 -3
- package/dist/components/{p-3Q_UlCBS.js.map → p-Bg0KKnpU.js.map} +1 -1
- package/dist/components/{p-BmcWjR4N.js → p-BhdGTSLg.js} +5 -5
- package/dist/components/{p-BmcWjR4N.js.map → p-BhdGTSLg.js.map} +1 -1
- package/dist/components/{p-DmWFUjNG.js → p-C-lvK9NX.js} +3 -3
- package/dist/components/{p-DmWFUjNG.js.map → p-C-lvK9NX.js.map} +1 -1
- package/dist/components/{p-CLbRlbBQ.js → p-C7ubjB1x.js} +3 -3
- package/dist/components/{p-CLbRlbBQ.js.map → p-C7ubjB1x.js.map} +1 -1
- package/dist/components/{p-jItKLiWg.js → p-CB7myOe_.js} +3 -3
- package/dist/components/{p-jItKLiWg.js.map → p-CB7myOe_.js.map} +1 -1
- package/dist/components/{p-DVLwCSEJ.js → p-CEu-bFot.js} +3 -3
- package/dist/components/{p-DVLwCSEJ.js.map → p-CEu-bFot.js.map} +1 -1
- package/dist/components/{p-Ctv3wyw7.js → p-CPq5-i_-.js} +4 -4
- package/dist/components/{p-Ctv3wyw7.js.map → p-CPq5-i_-.js.map} +1 -1
- package/dist/components/{p-BzkaZYPy.js → p-CzFKth7J.js} +3 -3
- package/dist/components/{p-BzkaZYPy.js.map → p-CzFKth7J.js.map} +1 -1
- package/dist/components/{p-CXEN9wni.js → p-D4RnNrxx.js} +3 -3
- package/dist/components/{p-CXEN9wni.js.map → p-D4RnNrxx.js.map} +1 -1
- package/dist/components/{p-DXRKSQ8c.js → p-DJDJfWq9.js} +3 -3
- package/dist/components/{p-DXRKSQ8c.js.map → p-DJDJfWq9.js.map} +1 -1
- package/dist/components/{p-kxAOEOKi.js → p-i4wY2JnB.js} +3 -3
- package/dist/components/{p-kxAOEOKi.js.map → p-i4wY2JnB.js.map} +1 -1
- package/dist/components/{p-D_aQ1w9v.js → p-oVAdweom.js} +3 -3
- package/dist/components/{p-D_aQ1w9v.js.map → p-oVAdweom.js.map} +1 -1
- package/dist/components/pcm-1zhanshi-mnms-modal.js +5 -5
- package/dist/components/pcm-app-chat-modal.js +1 -1
- package/dist/components/pcm-ats-mnms-modal.js +5 -5
- package/dist/components/pcm-card.js +1 -1
- package/dist/components/pcm-hr-chat-modal.js +2 -2
- package/dist/components/pcm-htws-modal.js +8 -8
- package/dist/components/pcm-hyzj-modal.js +5 -5
- package/dist/components/pcm-jd-modal.js +6 -6
- package/dist/components/pcm-jlpp-modal.js +8 -8
- package/dist/components/pcm-jlsx-modal.js +5 -5
- package/dist/components/pcm-jlzz-modal.js +28 -7
- package/dist/components/pcm-jlzz-modal.js.map +1 -1
- package/dist/components/pcm-mnct-modal.js +7 -7
- package/dist/components/pcm-mnms-modal.js +8 -8
- package/dist/components/pcm-mnms-zp-modal.js +8 -8
- package/dist/components/pcm-msbg-modal.js +5 -5
- package/dist/components/pcm-qgqjl-modal.js +9 -9
- package/dist/components/pcm-virtual-chat-modal.js +1 -1
- package/dist/components/pcm-zsk-chat-modal.js +2 -2
- package/dist/components/pcm-zygh-modal.js +7 -7
- package/dist/components/pcm-zygh-v2-modal.js +7 -7
- package/dist/esm/components-chat-message_33.entry.js +25 -4
- package/dist/esm/components-chat-message_33.entry.js.map +1 -1
- package/dist/esm/{conversation-utils-DbEUsn3n.js → conversation-utils-CLO35DHR.js} +4 -4
- package/dist/esm/{conversation-utils-DbEUsn3n.js.map → conversation-utils-CLO35DHR.js.map} +1 -1
- package/dist/esm/{index-Bo13CEzs.js → index-KVnu9w-h.js} +3 -3
- package/dist/esm/{index-Bo13CEzs.js.map → index-KVnu9w-h.js.map} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/oem-htws-modal.entry.js +1 -1
- package/dist/esm/oem-jd-modal.entry.js +2 -2
- package/dist/esm/oem-jlpp-modal.entry.js +1 -1
- package/dist/esm/oem-jlzz-modal.entry.js +23 -2
- package/dist/esm/oem-jlzz-modal.entry.js.map +1 -1
- package/dist/esm/oem-mnct-modal.entry.js +1 -1
- package/dist/esm/oem-mnms-modal.entry.js +1 -1
- package/dist/esm/oem-qgqjl-modal.entry.js +3 -3
- package/dist/esm/pcm-hr-chat-modal.entry.js +2 -2
- package/dist/esm/pcm-jlsx-modal.entry.js +2 -2
- package/dist/esm/{sentry-reporter-K4l0BEc5.js → sentry-reporter-B4aHQq-A.js} +3 -3
- package/dist/esm/{sentry-reporter-K4l0BEc5.js.map → sentry-reporter-B4aHQq-A.js.map} +1 -1
- package/dist/pcm-agents/index.esm.js +1 -1
- package/dist/pcm-agents/oem-jlzz-modal.entry.esm.js.map +1 -1
- package/dist/pcm-agents/{p-576d7f0c.entry.js → p-4d7511e0.entry.js} +2 -2
- package/dist/pcm-agents/{p-c02bf16e.entry.js → p-7e8bdfa6.entry.js} +2 -2
- package/dist/pcm-agents/{p-9683136b.entry.js → p-8144f0d4.entry.js} +2 -2
- package/dist/pcm-agents/{p-c2409f51.entry.js → p-8256890d.entry.js} +2 -2
- package/dist/pcm-agents/p-B4ClCdh9.js +2 -0
- package/dist/pcm-agents/{p-Ce7kriVb.js.map → p-B4ClCdh9.js.map} +1 -1
- package/dist/pcm-agents/{p-DxyGiF-E.js → p-Bktjt_YJ.js} +2 -2
- package/dist/pcm-agents/{p-DxyGiF-E.js.map → p-Bktjt_YJ.js.map} +1 -1
- package/dist/pcm-agents/{p-DSL40nYe.js → p-CMfzTNOk.js} +2 -2
- package/dist/pcm-agents/{p-DSL40nYe.js.map → p-CMfzTNOk.js.map} +1 -1
- package/dist/pcm-agents/{p-d55ba137.entry.js → p-aa606968.entry.js} +2 -2
- package/dist/pcm-agents/p-dd6362f0.entry.js +2 -0
- package/dist/pcm-agents/p-dd6362f0.entry.js.map +1 -0
- package/dist/pcm-agents/{p-dc3da9bc.entry.js → p-e2b9a9f2.entry.js} +2 -2
- package/dist/pcm-agents/{p-ac0a2540.entry.js → p-eb9b355e.entry.js} +2 -2
- package/dist/pcm-agents/{p-68cce17d.entry.js → p-efb4e819.entry.js} +2 -2
- package/dist/pcm-agents/{p-b252dbbe.entry.js → p-f6683f29.entry.js} +3 -3
- package/dist/pcm-agents/{p-b252dbbe.entry.js.map → p-f6683f29.entry.js.map} +1 -1
- package/dist/pcm-agents/pcm-agents.esm.js +1 -1
- package/dist/types/components/oem-jlzz-modal/oem-jlzz-modal.d.ts +11 -0
- package/dist/types/components/pcm-jlzz-modal/pcm-jlzz-modal.d.ts +11 -0
- package/dist/types/components.d.ts +22 -0
- package/package.json +1 -1
- package/dist/pcm-agents/p-54101b75.entry.js +0 -2
- package/dist/pcm-agents/p-54101b75.entry.js.map +0 -1
- package/dist/pcm-agents/p-Ce7kriVb.js +0 -2
- /package/dist/pcm-agents/{p-576d7f0c.entry.js.map → p-4d7511e0.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-c02bf16e.entry.js.map → p-7e8bdfa6.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-9683136b.entry.js.map → p-8144f0d4.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-c2409f51.entry.js.map → p-8256890d.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-d55ba137.entry.js.map → p-aa606968.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-dc3da9bc.entry.js.map → p-e2b9a9f2.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-ac0a2540.entry.js.map → p-eb9b355e.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-68cce17d.entry.js.map → p-efb4e819.entry.js.map} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index = require('./index-C_qhED9Z.js');
|
|
4
|
-
var index$1 = require('./index-
|
|
4
|
+
var index$1 = require('./index-Dghp_NL6.js');
|
|
5
5
|
var messageUtils = require('./message-utils-DbTqMOA1.js');
|
|
6
6
|
var errorEvent = require('./error-event-J_ZWIqWF.js');
|
|
7
|
-
var sentryReporter = require('./sentry-reporter-
|
|
7
|
+
var sentryReporter = require('./sentry-reporter-CgJowDyu.js');
|
|
8
8
|
require('./exports-Dc-pQh4A.js');
|
|
9
9
|
|
|
10
10
|
const globalCss = ".modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0, 0, 0, 0.5);display:flex;z-index:1000;overflow-y:auto}.fullscreen-overlay{padding:0;background-color:rgba(0, 0, 0, 0.7);position:absolute;width:100%;height:auto}.modal-container{background-color:#fff;border-radius:8px;width:100%;display:flex;flex-direction:column;position:relative;margin:5vh auto auto auto;transition:all 0.3s ease-out;overflow:hidden}.modal-container.fullscreen{width:100%;max-width:none;height:100%;border-radius:0;margin:0;display:flex;flex-direction:column;max-height:100%}.pc-layout{width:80%;max-width:600px;min-width:320px}@media screen and (max-width: 768px){.pc-layout{width:95%}.modal-overlay{padding:10px 0px 0px 0px}.modal-container.fullscreen{width:100%;height:100%;max-height:100%;border-radius:16px 16px 0 0;padding:env(safe-area-inset-top) 0 env(safe-area-inset-bottom)}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:4px 16px;height:50px;border-bottom:1px solid #e8e8e8;flex-shrink:0}.header-left{display:flex;align-items:center;gap:8px;font-size:16px;font-weight:600;color:#333}.header-icon{width:24px;height:24px}.close-button{background:transparent;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:4px}.close-button:hover{background-color:rgba(0, 0, 0, 0.04)}.close-button span{font-size:24px;line-height:1;color:#999}.close-button:hover span{color:#666}.upload-area{cursor:pointer;width:100%}.upload-placeholder{transition:all 0.3s ease;display:flex;flex-direction:column;align-items:center;background:rgba(0, 0, 0, 0.02);border:1px dashed #d9d9d9;border-radius:8px;cursor:pointer}.upload-placeholder:hover{border:1px dashed #1890ff}.upload-placeholder img{margin-top:8px;width:50px;height:50px}.upload-placeholder .upload-text{margin:4px 0;color:#332F39;font-size:14px}.upload-placeholder .upload-hint{font-size:14px;color:#949AA5;margin-top:8px;padding:0px 10px;text-align:center;white-space:normal;word-wrap:break-word;word-break:break-all;line-height:1.4}.file-item{position:relative;padding:16px;border:1px solid #e2e8f0;border-radius:8px;transition:border-color 0.3s;cursor:pointer;margin-bottom:16px;display:flex;justify-content:space-between;align-items:center}.file-item:hover{border-color:#0D75FB}.file-item-content{display:flex;align-items:center;gap:8px;flex:1;min-width:0;overflow:hidden}.file-icon{color:#0D75FB;flex-shrink:0}.file-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - 50px)}.remove-file{background:transparent;border:none;color:#94a3b8;cursor:pointer;font-size:18px;display:flex;align-items:center;justify-content:center;padding:4px;margin-left:8px;border-radius:4px;transition:all 0.2s;min-width:30px;min-height:30px}.remove-file:hover{background-color:#f1f5f9;color:#475569}.file-input{display:none}.input-container{padding:20px;display:flex;flex-direction:column;height:calc(100% - 50px);background:linear-gradient(150deg, #2a6ee933, #0000 50%) 0 0 / 400px 200px no-repeat, #fff;overflow-y:auto}.input-container h3{margin-top:0;margin-bottom:20px;font-size:18px;color:#333;text-align:center}.jd-input-section{margin-bottom:20px}.jd-input-section label{display:block;margin-bottom:8px;font-weight:500;color:#333}.job-description-textarea{width:calc(100% - 16px);border:1px solid #ddd;border-radius:4px;resize:vertical;font-family:inherit;font-size:14px;line-height:1.5;transition:border-color 0.3s;padding:8px}.job-description-textarea:focus{outline:none;border-color:#1890ff;box-shadow:0 0 0 2px rgba(24, 144, 255, 0.2)}.resume-upload-section{margin-bottom:20px;width:100%;display:flex;flex-direction:column}.resume-upload-section label{display:block;margin-bottom:8px;font-weight:500;color:#333}.interview-settings-section{margin-bottom:24px;padding:20px;background-color:#f8f9fa;border-radius:8px;border:1px solid #e9ecef}.settings-row{margin-bottom:20px}.settings-row:last-child{margin-bottom:0}.settings-label{display:block;font-weight:500;color:#333;margin-bottom:12px;font-size:14px}.question-number-section{width:100%}.slider-container{display:flex;align-items:center;gap:12px}.question-slider{flex:1;height:6px;background:#ddd;outline:none;border-radius:3px;-webkit-appearance:none;appearance:none}.question-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:20px;height:20px;background:#0D75FB;cursor:pointer;border-radius:50%;box-shadow:0 2px 4px rgba(0, 0, 0, 0.2)}.question-slider::-moz-range-thumb{width:20px;height:20px;background:#0D75FB;cursor:pointer;border-radius:50%;border:none;box-shadow:0 2px 4px rgba(0, 0, 0, 0.2)}.slider-value{font-weight:600;color:#0D75FB;font-size:14px;min-width:30px;text-align:center}.analysis-toggle-section{width:100%}.toggle-container{display:flex;align-items:center;gap:12px}.toggle-switch{position:relative;display:inline-block;width:44px;height:24px}.toggle-switch input{opacity:0;width:0;height:0}.toggle-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;transition:0.3s;border-radius:24px}.toggle-slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:white;transition:0.3s;border-radius:50%;box-shadow:0 2px 4px rgba(0, 0, 0, 0.2)}input:checked+.toggle-slider{background-color:#0D75FB}input:checked+.toggle-slider:before{transform:translateX(20px)}.toggle-text{font-size:14px;color:#666;font-weight:500}.submit-button{margin-top:10px;padding:10px 30px;background:#0D75FB;color:white;border:none;border-radius:4px;font-size:16px;cursor:pointer;transition:all 0.3s ease;width:100%;max-width:400px;align-self:center}.submit-button:hover{background-color:#40a9ff}.submit-button:disabled{background-color:rgba(0,0,0,0.04);color:rgba(0,0,0,0.25);cursor:not-allowed}.ai-disclaimer{margin-top:16px;text-align:center;font-size:12px;color:#999;line-height:1.5}.ai-disclaimer p{margin:4px 0}.beian-info{display:flex;justify-content:center;flex-wrap:wrap;gap:4px}.ai-disclaimer a{color:#666;text-decoration:none;transition:color 0.2s ease}.ai-disclaimer a:hover{color:#1890ff;text-decoration:underline}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:24px}.loading-spinner{width:40px;height:40px;border:4px solid rgba(0, 0, 0, 0.1);border-radius:50%;border-top-color:var(--pcm-primary-color, #1890ff);animation:spin 1s linear infinite;margin-bottom:16px}.loading-text{font-size:16px;color:var(--pcm-text-color, #333)}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.header-history-button{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:4px 8px;border:none;border-radius:4px;background:transparent;color:#bbb;cursor:pointer;font-size:13px;font-family:inherit;line-height:1;transition:all 0.2s ease;flex-shrink:0;white-space:nowrap}.header-history-button svg{width:16px;height:16px;display:block;flex-shrink:0}.header-history-button:hover{background-color:rgba(0, 0, 0, 0.04);color:#666}.header-history-button:focus-visible{outline:2px solid rgba(13, 117, 251, 0.35);outline-offset:2px}.history-drawer-content{height:100%;display:flex;flex-direction:column}.conversation-list{flex:1;overflow-y:auto;padding:8px 0}.loading-conversations,.empty-conversations{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:#999}.loading-conversations .loading-spinner-small{margin-bottom:12px}.conversation-item{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;margin:0 8px 4px 8px;border-radius:8px;cursor:pointer;transition:all 0.2s ease;border:1px solid transparent}.conversation-item:hover{background:#f5f5f5}.conversation-info{flex:1;min-width:0}.conversation-title{font-size:14px;font-weight:500;color:#262626;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.conversation-meta{display:flex;align-items:center;gap:8px;font-size:12px;color:#8c8c8c}.conversation-time{flex-shrink:0}.message-count{flex-shrink:0}.conversation-status{padding:2px 6px;border-radius:4px;font-size:11px;font-weight:500}.conversation-status.completed{background:#f6ffed;color:#52c41a}.conversation-status.running{background:#fff7e6;color:#fa8c16}.header-history-entry{display:inline-flex;align-items:center;justify-content:center;margin-left:8px;padding:4px 8px;border:none;border-radius:4px;background:#e6f7ff;color:#1890ff;cursor:pointer;font-size:12px;font-family:inherit;line-height:1;white-space:nowrap;transition:all 0.2s ease}.header-history-entry:hover{background:#bae7ff;color:#0958d9;transform:translateY(-1px)}.header-history-entry:focus-visible{outline:2px solid rgba(13, 117, 251, 0.35);outline-offset:2px}.history-pagination{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px 16px;border-top:1px solid #f0f0f0}.history-pagination-button{min-width:72px;padding:6px 12px;border:1px solid #d9d9d9;border-radius:6px;background:#fff;color:#595959;cursor:pointer;font-size:12px;transition:all 0.2s ease}.history-pagination-button:hover:not(:disabled){border-color:#1890ff;color:#1890ff;background:#e6f7ff}.history-pagination-button:disabled{border-color:#f0f0f0;color:#bfbfbf;background:#fafafa;cursor:not-allowed}.history-pagination-info{flex:1;text-align:center;color:#8c8c8c;font-size:12px}";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-Dghp_NL6.js');
|
|
4
4
|
var exports$1 = require('./exports-Dc-pQh4A.js');
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -67,6 +67,6 @@ class SentryReporter {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
exports.SentryReporter = SentryReporter;
|
|
70
|
-
//# sourceMappingURL=sentry-reporter-
|
|
70
|
+
//# sourceMappingURL=sentry-reporter-CgJowDyu.js.map
|
|
71
71
|
|
|
72
|
-
//# sourceMappingURL=sentry-reporter-
|
|
72
|
+
//# sourceMappingURL=sentry-reporter-CgJowDyu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry-reporter-
|
|
1
|
+
{"version":3,"file":"sentry-reporter-CgJowDyu.js","sources":["src/utils/sentry-reporter.ts"],"sourcesContent":["import * as Sentry from \"@sentry/browser\";\r\nimport { configStore } from \"../../store/config.store\";\r\n\r\n/**\r\n * Sentry事件上报工具类\r\n * 提供统一的错误上报接口,自动添加用户认证信息\r\n */\r\nexport class SentryReporter {\r\n\r\n /**\r\n * 捕获并上报错误\r\n * @param error 错误对象\r\n * @param context 错误上下文\r\n */\r\n static captureError(error: any, context?: Record<string, any> & { title?: string }): void {\r\n try {\r\n // 添加认证信息\r\n const CUser = configStore.getItem('pcm-sdk-CUser');\r\n if (CUser) {\r\n Sentry.setUser({ id: String(CUser) });\r\n }\r\n \r\n let finalError = error;\r\n \r\n // 如果提供了自定义标题,创建新的错误对象\r\n if (context?.title) {\r\n finalError = new Error(context.title);\r\n if (error?.stack) {\r\n finalError.stack = error.stack;\r\n }\r\n finalError.cause = error;\r\n }\r\n \r\n // 添加上下文\r\n if (context) {\r\n const { title, ...otherContext } = context;\r\n Sentry.setContext('error_context', otherContext);\r\n }\r\n \r\n // 上报错误\r\n Sentry.captureException(finalError);\r\n } catch (e) {\r\n console.error('Sentry 上报错误失败:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 捕获并上报消息\r\n * @param message 消息内容\r\n * @param context 消息上下文\r\n */\r\n static captureMessage(message: string, context?: Record<string, any>): void {\r\n try {\r\n // 添加认证信息\r\n const CUser = configStore.getItem('pcm-sdk-CUser');\r\n if (CUser) {\r\n Sentry.setUser({ id: String(CUser) });\r\n }\r\n \r\n // 添加上下文\r\n if (context) {\r\n Sentry.setContext('message_context', context);\r\n }\r\n \r\n // 上报消息\r\n Sentry.captureMessage(message);\r\n } catch (e) {\r\n console.error('Sentry 上报消息失败:', e);\r\n }\r\n }\r\n\r\n}"],"names":["configStore","Sentry.setUser","Sentry.setContext","Sentry.captureException","Sentry.captureMessage"],"mappings":";;;;;AAGA;;;AAGG;MACU,cAAc,CAAA;AAEzB;;;;AAIG;AACH,IAAA,OAAO,YAAY,CAAC,KAAU,EAAE,OAAkD,EAAA;AAChF,QAAA,IAAI;;YAEF,MAAM,KAAK,GAAGA,iBAAW,CAAC,OAAO,CAAC,eAAe,CAAC;YAClD,IAAI,KAAK,EAAE;AACT,gBAAAC,iBAAc,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;;YAGvC,IAAI,UAAU,GAAG,KAAK;;AAGtB,YAAA,IAAI,OAAO,EAAE,KAAK,EAAE;gBAClB,UAAU,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACrC,gBAAA,IAAI,KAAK,EAAE,KAAK,EAAE;AAChB,oBAAA,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;;AAEhC,gBAAA,UAAU,CAAC,KAAK,GAAG,KAAK;;;YAI1B,IAAI,OAAO,EAAE;gBACX,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO;AAC1C,gBAAAC,oBAAiB,CAAC,eAAe,EAAE,YAAY,CAAC;;;AAIlD,YAAAC,0BAAuB,CAAC,UAAU,CAAC;;QACnC,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;;;AAItC;;;;AAIG;AACH,IAAA,OAAO,cAAc,CAAC,OAAe,EAAE,OAA6B,EAAA;AAClE,QAAA,IAAI;;YAEF,MAAM,KAAK,GAAGH,iBAAW,CAAC,OAAO,CAAC,eAAe,CAAC;YAClD,IAAI,KAAK,EAAE;AACT,gBAAAC,iBAAc,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;;;YAIvC,IAAI,OAAO,EAAE;AACX,gBAAAC,oBAAiB,CAAC,iBAAiB,EAAE,OAAO,CAAC;;;AAI/C,YAAAE,wBAAqB,CAAC,OAAO,CAAC;;QAC9B,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;;;AAIvC;;;;"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
.resume-type-container {
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: row;
|
|
4
|
-
|
|
4
|
+
flex-wrap: nowrap;
|
|
5
|
+
justify-content: space-evenly;
|
|
6
|
+
gap: 0;
|
|
5
7
|
margin-bottom: 16px;
|
|
6
8
|
border-bottom: 2px solid #f0f0f0;
|
|
7
|
-
padding-left:
|
|
9
|
+
padding-left: 0;
|
|
10
|
+
overflow-x: auto;
|
|
11
|
+
overflow-y: hidden;
|
|
8
12
|
}
|
|
9
13
|
|
|
10
14
|
.resume-type-item {
|
|
@@ -17,6 +21,8 @@
|
|
|
17
21
|
border: none;
|
|
18
22
|
outline: none;
|
|
19
23
|
font-weight: 400;
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
flex-shrink: 0;
|
|
20
26
|
transition: color 0.2s;
|
|
21
27
|
}
|
|
22
28
|
|
|
@@ -82,6 +82,14 @@ export class OemJlzzModal {
|
|
|
82
82
|
* 获取简历数据事件(用户点击导出简历json数据后触发)
|
|
83
83
|
*/
|
|
84
84
|
getResumeData;
|
|
85
|
+
/**
|
|
86
|
+
* 简历下载请求事件。
|
|
87
|
+
* 触发时机:简历制作页面 运行在微信小程序 web-view 的 SDK iframe 中,
|
|
88
|
+
* 用户在移动端下载弹窗点击“直接下载”时触发;普通网页环境仍由 简历制作页面 自行下载,不触发此事件。
|
|
89
|
+
* iframe 只提供下载地址和文件名,具体跳转到哪个小程序页面及如何处理下载,
|
|
90
|
+
* 由 SDK 接入方通过 onResumeDownloadRequested 回调自行决定。
|
|
91
|
+
*/
|
|
92
|
+
resumeDownloadRequested;
|
|
85
93
|
/**
|
|
86
94
|
* 附件预览模式
|
|
87
95
|
* 'drawer': 在右侧抽屉中预览
|
|
@@ -187,10 +195,22 @@ export class OemJlzzModal {
|
|
|
187
195
|
const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];
|
|
188
196
|
if (!allowedOrigins.includes(event.origin))
|
|
189
197
|
return;
|
|
198
|
+
// 只接受当前简历 iframe 发出的消息,避免页面内其他窗口误触发 SDK 事件。
|
|
199
|
+
if (event.source !== this._iframeEl?.contentWindow)
|
|
200
|
+
return;
|
|
190
201
|
const { type, value } = event.data || {};
|
|
191
202
|
if (type === 'callParentMethod') {
|
|
192
203
|
this.exampleMethodFromIframe(value);
|
|
193
204
|
}
|
|
205
|
+
if (type === 'resumeDownloadRequested') {
|
|
206
|
+
// SDK 仅透传下载信息,不耦合任何宿主小程序路由。
|
|
207
|
+
if (!value?.url || !value?.fileName)
|
|
208
|
+
return;
|
|
209
|
+
this.resumeDownloadRequested.emit({
|
|
210
|
+
url: value.url,
|
|
211
|
+
fileName: value.fileName,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
194
214
|
// 关键:收到 iframeReady 后再发送 token
|
|
195
215
|
if (type === 'iframeReady' && this._iframeEl?.contentWindow) {
|
|
196
216
|
// 动态获取 targetOrigin,兼容本地和线上
|
|
@@ -704,6 +724,21 @@ export class OemJlzzModal {
|
|
|
704
724
|
"resolved": "any",
|
|
705
725
|
"references": {}
|
|
706
726
|
}
|
|
727
|
+
}, {
|
|
728
|
+
"method": "resumeDownloadRequested",
|
|
729
|
+
"name": "resumeDownloadRequested",
|
|
730
|
+
"bubbles": true,
|
|
731
|
+
"cancelable": true,
|
|
732
|
+
"composed": true,
|
|
733
|
+
"docs": {
|
|
734
|
+
"tags": [],
|
|
735
|
+
"text": "\u7B80\u5386\u4E0B\u8F7D\u8BF7\u6C42\u4E8B\u4EF6\u3002\r\n\u89E6\u53D1\u65F6\u673A\uFF1A\u7B80\u5386\u5236\u4F5C\u9875\u9762 \u8FD0\u884C\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F web-view \u7684 SDK iframe \u4E2D\uFF0C\r\n\u7528\u6237\u5728\u79FB\u52A8\u7AEF\u4E0B\u8F7D\u5F39\u7A97\u70B9\u51FB\u201C\u76F4\u63A5\u4E0B\u8F7D\u201D\u65F6\u89E6\u53D1\uFF1B\u666E\u901A\u7F51\u9875\u73AF\u5883\u4ECD\u7531 \u7B80\u5386\u5236\u4F5C\u9875\u9762 \u81EA\u884C\u4E0B\u8F7D\uFF0C\u4E0D\u89E6\u53D1\u6B64\u4E8B\u4EF6\u3002\r\niframe \u53EA\u63D0\u4F9B\u4E0B\u8F7D\u5730\u5740\u548C\u6587\u4EF6\u540D\uFF0C\u5177\u4F53\u8DF3\u8F6C\u5230\u54EA\u4E2A\u5C0F\u7A0B\u5E8F\u9875\u9762\u53CA\u5982\u4F55\u5904\u7406\u4E0B\u8F7D\uFF0C\r\n\u7531 SDK \u63A5\u5165\u65B9\u901A\u8FC7 onResumeDownloadRequested \u56DE\u8C03\u81EA\u884C\u51B3\u5B9A\u3002"
|
|
736
|
+
},
|
|
737
|
+
"complexType": {
|
|
738
|
+
"original": "{\r\n url: string;\r\n fileName: string;\r\n }",
|
|
739
|
+
"resolved": "{ url: string; fileName: string; }",
|
|
740
|
+
"references": {}
|
|
741
|
+
}
|
|
707
742
|
}];
|
|
708
743
|
}
|
|
709
744
|
static get elementRef() { return "hostElement"; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oem-jlzz-modal.js","sourceRoot":"","sources":["../../../../src/components/oem-jlzz-modal/oem-jlzz-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop, Event, EventEmitter, Watch, State, Element } from '@stencil/core';\r\nimport { FileUploadResponse, verifyApiKey, PCM_DOMAIN } from '../../utils/utils';\r\nimport { ConversationStartEventData, StreamCompleteEventData } from '../../components';\r\nimport { ErrorEventBus, ErrorEventDetail } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store';\r\nimport { configStore } from '../../../store/config.store';\r\nimport { Message } from '../../services/message.service';\r\n\r\n@Component({\r\n tag: 'oem-jlzz-modal',\r\n styleUrls: ['oem-jlzz-modal.css', '../../global/global.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class OemJlzzModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '简历制作';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token!: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 是否成功,成功展示 iframe 官网\r\n */\r\n @Prop({ mutable: true }) isSuccess: boolean = false;\r\n\r\n /**\r\n * 导出按钮的文本\r\n */\r\n @Prop() exportButtonText: string = '导出简历json数据';\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop() zIndex?: number = 1000;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n /**\r\n * 会话ID\r\n */\r\n @State() conversationId?: string;\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '根据对话生成简历';\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 上传成功事件\r\n */\r\n @Event() uploadSuccess: EventEmitter<FileUploadResponse>;\r\n\r\n /**\r\n * 流式输出完成事件\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 错误事件\r\n */\r\n @Event() someErrorEvent: EventEmitter<ErrorEventDetail>;\r\n\r\n /**\r\n * 获取简历数据事件(用户点击导出简历json数据后触发)\r\n */\r\n @Event() getResumeData: EventEmitter<any>;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'drawer';\r\n\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: FileUploadResponse | null = null;\r\n @State() showChatModal: boolean = false;\r\n @State() resumeType: 'upload' | 'chat' = 'chat';\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n @State() isSubmitting: boolean = false;\r\n @State() showIframe: boolean = false;\r\n private tokenInvalidListener: () => void;\r\n private removeErrorListener: () => void;\r\n private pcmUploadRef;\r\n /**\r\n * iframe DOM 引用\r\n */\r\n private _iframeEl?: HTMLIFrameElement;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (!newValue) {\r\n // 重置状态\r\n this.showChatModal = false;\r\n this.showIframe = false;\r\n this.isSuccess = false;\r\n this.conversationId = undefined;\r\n this.resumeType = 'chat';\r\n } else {\r\n await verifyApiKey(this.token);\r\n }\r\n }\r\n @Watch('isSuccess')\r\n handleIsSuccessChange(newValue: boolean) {\r\n if (newValue && this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n }\r\n }\r\n\r\n /**\r\n * 处理流式响应完成事件\r\n */\r\n private handleStreamComplete = (event: CustomEvent<StreamCompleteEventData>) => {\r\n this.conversationId = event.detail.conversation_id;\r\n // 当流式响应完成时,如果不是直接对话模式,则显示 iframe\r\n if (this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n this.isSuccess = true;\r\n }\r\n };\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n }\r\n\r\n // 初始化时设置 token,但不验证(验证在 @Watch('isOpen') 中处理)\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n // 添加全局错误监听\r\n this.removeErrorListener = ErrorEventBus.addErrorListener(errorDetail => {\r\n this.someErrorEvent.emit(errorDetail);\r\n });\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n }\r\n\r\n componentDidLoad() {\r\n // 监听来自 iframe 的消息\r\n window.addEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n disconnectedCallback() {\r\n // 组件销毁时移除事件监听器\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n // 移除错误监听器\r\n if (this.removeErrorListener) {\r\n this.removeErrorListener();\r\n }\r\n window.removeEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n /**\r\n * 处理 iframe 加载完成(不再直接发送 token)\r\n * 由 iframe 主动 postMessage { type: 'iframeReady' } 通知父页面后再发送 token\r\n */\r\n private handleIframeLoad = () => {\r\n console.log(this._iframeEl, 'this._iframeEl');\r\n // 不再直接发送 token,等待 iframeReady 消息\r\n };\r\n\r\n /**\r\n * 处理来自 iframe 的消息\r\n * 支持 iframe 调用父组件方法,也支持握手机制\r\n */\r\n private handleIframeMessage = (event: MessageEvent) => {\r\n // 允许本地和线上环境\r\n const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];\r\n if (!allowedOrigins.includes(event.origin)) return;\r\n const { type, value } = event.data || {};\r\n if (type === 'callParentMethod') {\r\n this.exampleMethodFromIframe(value);\r\n }\r\n // 关键:收到 iframeReady 后再发送 token\r\n if (type === 'iframeReady' && this._iframeEl?.contentWindow) {\r\n // 动态获取 targetOrigin,兼容本地和线上\r\n const targetOrigin = new URL(this._iframeEl.src).origin;\r\n // 1. 先发送 parentReady,带上父页面的 origin\r\n this._iframeEl.contentWindow.postMessage({ type: 'parentReady', origin: window.location.origin }, targetOrigin);\r\n // 2. 再发送 token\r\n this._iframeEl.contentWindow.postMessage({ type: 'setToken', token: this.token }, targetOrigin);\r\n console.log(this.exportButtonText, 'this.exportButtonText');\r\n this._iframeEl.contentWindow.postMessage(\r\n {\r\n type: 'buttonConfig',\r\n config: {\r\n hideExportButton: true,\r\n exportButtonText: this.exportButtonText,\r\n },\r\n },\r\n targetOrigin,\r\n );\r\n console.log('父组件已发送 token 给 iframe,targetOrigin:', targetOrigin);\r\n }\r\n };\r\n\r\n /**\r\n * 导出简历数据\r\n * @param value 简历数据是字符串形式\r\n */\r\n public exampleMethodFromIframe(value: string) {\r\n this.getResumeData.emit(JSON.parse(value));\r\n }\r\n\r\n private handleClose = () => {\r\n this.modalClosed.emit();\r\n };\r\n // 切换类型\r\n private changeType = (type: 'upload' | 'chat') => {\r\n this.resumeType = type;\r\n };\r\n private handleStartInterview = async () => {\r\n if (this.resumeType === 'upload' && !this.uploadedFileInfo) {\r\n Message.info('请上传简历');\r\n return;\r\n }\r\n\r\n // 判断文件是否正在上传\r\n if (this.resumeType === 'upload' && await this.pcmUploadRef?.getIsUploading?.()) {\r\n Message.info('文件上传中,请稍后');\r\n return;\r\n }\r\n\r\n this.isSubmitting = true;\r\n this.showChatModal = true;\r\n this.isSubmitting = false;\r\n };\r\n private closeResumeChat = () => {\r\n this.isSuccess = false;\r\n this.resumeType = 'upload';\r\n };\r\n render() {\r\n if (!this.isOpen) return null;\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'pc-layout': !this.isSuccess,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n // 判断是否隐藏简历上传区域\r\n const hideResumeUpload = Boolean(this.customInputs && this.customInputs.file_url);\r\n\r\n // 判断是否同时提供了file_url和job_info\r\n const hasFileAndJob = Boolean(this.customInputs?.file_url && this.customInputs?.job_info);\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && !this.showChatModal && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 上传界面 - 仅在不显示聊天模态框且没有会话ID且没有同时提供file_url和job_info时显示 */}\r\n {!this.showChatModal && !this.conversationId && !hasFileAndJob && !this.showIframe && (\r\n <div class=\"input-container\">\r\n <div class=\"resume-type-container\">\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'chat',\r\n }}\r\n onClick={() => this.changeType('chat')}\r\n >\r\n 直接开始\r\n </div>\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'upload',\r\n }}\r\n onClick={() => this.changeType('upload')}\r\n >\r\n 上传简历\r\n </div>\r\n </div>\r\n\r\n {/* 简历上传区域 - 仅在没有customInputs.file_url时显示 */}\r\n {!hideResumeUpload && this.resumeType === 'upload' && (\r\n <div class=\"resume-upload-section\">\r\n <label>上传简历</label>\r\n <components-mobile-upload-btn\r\n maxFileSize={15 * 1024 * 1024}\r\n multiple={false}\r\n uploadAreaMode={true}\r\n acceptFileSuffixList={['.txt', '.md', '.pdf', '.docx', '.doc']}\r\n uploadParams={{\r\n tags: ['resume'],\r\n }}\r\n onOk={(e) => {\r\n const result: FileUploadResponse[] = e.detail ?? [];\r\n this.uploadedFileInfo = result[0];\r\n this.uploadSuccess.emit(this.uploadedFileInfo);\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.resumeType === 'chat' && (\r\n <div class=\"jd-input-section\">\r\n <label htmlFor=\"job-description\">从头开始创建</label>\r\n <div class=\"chat-content\">\r\n <div class=\"chat-content-text\">🤖无需复杂操作,只需回答AI的几个简单问题,系统会根据你的回答自动生成内容完整、格式专业的个人简历</div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n class=\"submit-button\"\r\n disabled={\r\n (this.resumeType === 'upload' && !hideResumeUpload && !this.uploadedFileInfo) ||\r\n this.isUploading ||\r\n this.isSubmitting\r\n }\r\n onClick={this.handleStartInterview}\r\n >\r\n {this.isUploading ? '上传中...' : this.isSubmitting ? '处理中...' : this.resumeType === 'upload' ? '开始制作' : '开始对话'}\r\n </button>\r\n\r\n <div class=\"ai-disclaimer\">\r\n <p>所有内容均由AI生成仅供参考</p>\r\n <p class=\"beian-info\">\r\n <span>中央网信办生成式人工智能服务备案号</span>:\r\n <a href=\"https://www.pincaimao.com\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n Hunan-PinCaiMao-202412310003\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 聊天界面 - 在显示聊天模态框时显示 */}\r\n {this.showChatModal && (\r\n <>\r\n <div\r\n style={{\r\n display: this.resumeType === 'chat' ? 'block' : 'none',\r\n }}\r\n >\r\n <pcm-app-chat-modal\r\n isOpen={true}\r\n modalTitle={this.modalTitle}\r\n icon={this.icon}\r\n isShowHeader={this.isShowHeader}\r\n isNeedClose={this.isNeedClose}\r\n fullscreen={this.fullscreen}\r\n showWorkspaceHistory={false}\r\n botId=\"39284520284983296\"\r\n conversationId={this.conversationId}\r\n defaultQuery={this.defaultQuery}\r\n filePreviewMode={this.filePreviewMode}\r\n customInputs={{\r\n ...this.customInputs,\r\n file_url: this.resumeType === 'upload' ? this.customInputs.file_url || this.uploadedFileInfo?.cos_key : '',\r\n mode_type: this.resumeType === 'chat' ? 1 : 0,\r\n }}\r\n interviewMode=\"text\"\r\n closeResume={this.closeResumeChat}\r\n onStreamComplete={this.handleStreamComplete}\r\n ></pcm-app-chat-modal>\r\n </div>\r\n {/* 如果不是对话模式,则展示加载中。完成之后跳转 */}\r\n {this.resumeType !== 'chat' && !this.showIframe && (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p class=\"loading-text\">AI正在优化您的简历...</p>\r\n </div>\r\n )}\r\n {this.showIframe && (\r\n <>\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n {/*\r\n 1. 不再通过 URL 传递 token,避免泄露。\r\n 2. 通过 ref 获取 iframe 元素,onLoad 时 postMessage 发送 token。\r\n */}\r\n <div class=\"iframe-container\">\r\n <iframe\r\n ref={el => (this._iframeEl = el as HTMLIFrameElement)}\r\n src={`${PCM_DOMAIN}/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n // src={`http://localhost:3000/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n frameborder=\"0\"\r\n onLoad={this.handleIframeLoad}\r\n ></iframe>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"oem-jlzz-modal.js","sourceRoot":"","sources":["../../../../src/components/oem-jlzz-modal/oem-jlzz-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop, Event, EventEmitter, Watch, State, Element } from '@stencil/core';\r\nimport { FileUploadResponse, verifyApiKey, PCM_DOMAIN } from '../../utils/utils';\r\nimport { ConversationStartEventData, StreamCompleteEventData } from '../../components';\r\nimport { ErrorEventBus, ErrorEventDetail } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store';\r\nimport { configStore } from '../../../store/config.store';\r\nimport { Message } from '../../services/message.service';\r\n\r\n@Component({\r\n tag: 'oem-jlzz-modal',\r\n styleUrls: ['oem-jlzz-modal.css', '../../global/global.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class OemJlzzModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '简历制作';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token!: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 是否成功,成功展示 iframe 官网\r\n */\r\n @Prop({ mutable: true }) isSuccess: boolean = false;\r\n\r\n /**\r\n * 导出按钮的文本\r\n */\r\n @Prop() exportButtonText: string = '导出简历json数据';\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop() zIndex?: number = 1000;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n /**\r\n * 会话ID\r\n */\r\n @State() conversationId?: string;\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '根据对话生成简历';\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 上传成功事件\r\n */\r\n @Event() uploadSuccess: EventEmitter<FileUploadResponse>;\r\n\r\n /**\r\n * 流式输出完成事件\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 错误事件\r\n */\r\n @Event() someErrorEvent: EventEmitter<ErrorEventDetail>;\r\n\r\n /**\r\n * 获取简历数据事件(用户点击导出简历json数据后触发)\r\n */\r\n @Event() getResumeData: EventEmitter<any>;\r\n\r\n /**\r\n * 简历下载请求事件。\r\n * 触发时机:简历制作页面 运行在微信小程序 web-view 的 SDK iframe 中,\r\n * 用户在移动端下载弹窗点击“直接下载”时触发;普通网页环境仍由 简历制作页面 自行下载,不触发此事件。\r\n * iframe 只提供下载地址和文件名,具体跳转到哪个小程序页面及如何处理下载,\r\n * 由 SDK 接入方通过 onResumeDownloadRequested 回调自行决定。\r\n */\r\n @Event() resumeDownloadRequested: EventEmitter<{\r\n url: string;\r\n fileName: string;\r\n }>;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'drawer';\r\n\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: FileUploadResponse | null = null;\r\n @State() showChatModal: boolean = false;\r\n @State() resumeType: 'upload' | 'chat' = 'chat';\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n @State() isSubmitting: boolean = false;\r\n @State() showIframe: boolean = false;\r\n private tokenInvalidListener: () => void;\r\n private removeErrorListener: () => void;\r\n private pcmUploadRef;\r\n /**\r\n * iframe DOM 引用\r\n */\r\n private _iframeEl?: HTMLIFrameElement;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (!newValue) {\r\n // 重置状态\r\n this.showChatModal = false;\r\n this.showIframe = false;\r\n this.isSuccess = false;\r\n this.conversationId = undefined;\r\n this.resumeType = 'chat';\r\n } else {\r\n await verifyApiKey(this.token);\r\n }\r\n }\r\n @Watch('isSuccess')\r\n handleIsSuccessChange(newValue: boolean) {\r\n if (newValue && this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n }\r\n }\r\n\r\n /**\r\n * 处理流式响应完成事件\r\n */\r\n private handleStreamComplete = (event: CustomEvent<StreamCompleteEventData>) => {\r\n this.conversationId = event.detail.conversation_id;\r\n // 当流式响应完成时,如果不是直接对话模式,则显示 iframe\r\n if (this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n this.isSuccess = true;\r\n }\r\n };\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n }\r\n\r\n // 初始化时设置 token,但不验证(验证在 @Watch('isOpen') 中处理)\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n // 添加全局错误监听\r\n this.removeErrorListener = ErrorEventBus.addErrorListener(errorDetail => {\r\n this.someErrorEvent.emit(errorDetail);\r\n });\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n }\r\n\r\n componentDidLoad() {\r\n // 监听来自 iframe 的消息\r\n window.addEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n disconnectedCallback() {\r\n // 组件销毁时移除事件监听器\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n // 移除错误监听器\r\n if (this.removeErrorListener) {\r\n this.removeErrorListener();\r\n }\r\n window.removeEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n /**\r\n * 处理 iframe 加载完成(不再直接发送 token)\r\n * 由 iframe 主动 postMessage { type: 'iframeReady' } 通知父页面后再发送 token\r\n */\r\n private handleIframeLoad = () => {\r\n console.log(this._iframeEl, 'this._iframeEl');\r\n // 不再直接发送 token,等待 iframeReady 消息\r\n };\r\n\r\n /**\r\n * 处理来自 iframe 的消息\r\n * 支持 iframe 调用父组件方法,也支持握手机制\r\n */\r\n private handleIframeMessage = (event: MessageEvent) => {\r\n // 允许本地和线上环境\r\n const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];\r\n if (!allowedOrigins.includes(event.origin)) return;\r\n // 只接受当前简历 iframe 发出的消息,避免页面内其他窗口误触发 SDK 事件。\r\n if (event.source !== this._iframeEl?.contentWindow) return;\r\n\r\n const { type, value } = event.data || {};\r\n if (type === 'callParentMethod') {\r\n this.exampleMethodFromIframe(value);\r\n }\r\n if (type === 'resumeDownloadRequested') {\r\n // SDK 仅透传下载信息,不耦合任何宿主小程序路由。\r\n if (!value?.url || !value?.fileName) return;\r\n this.resumeDownloadRequested.emit({\r\n url: value.url,\r\n fileName: value.fileName,\r\n });\r\n }\r\n // 关键:收到 iframeReady 后再发送 token\r\n if (type === 'iframeReady' && this._iframeEl?.contentWindow) {\r\n // 动态获取 targetOrigin,兼容本地和线上\r\n const targetOrigin = new URL(this._iframeEl.src).origin;\r\n // 1. 先发送 parentReady,带上父页面的 origin\r\n this._iframeEl.contentWindow.postMessage({ type: 'parentReady', origin: window.location.origin }, targetOrigin);\r\n // 2. 再发送 token\r\n this._iframeEl.contentWindow.postMessage({ type: 'setToken', token: this.token }, targetOrigin);\r\n console.log(this.exportButtonText, 'this.exportButtonText');\r\n this._iframeEl.contentWindow.postMessage(\r\n {\r\n type: 'buttonConfig',\r\n config: {\r\n hideExportButton: true,\r\n exportButtonText: this.exportButtonText,\r\n },\r\n },\r\n targetOrigin,\r\n );\r\n console.log('父组件已发送 token 给 iframe,targetOrigin:', targetOrigin);\r\n }\r\n };\r\n\r\n /**\r\n * 导出简历数据\r\n * @param value 简历数据是字符串形式\r\n */\r\n public exampleMethodFromIframe(value: string) {\r\n this.getResumeData.emit(JSON.parse(value));\r\n }\r\n\r\n private handleClose = () => {\r\n this.modalClosed.emit();\r\n };\r\n // 切换类型\r\n private changeType = (type: 'upload' | 'chat') => {\r\n this.resumeType = type;\r\n };\r\n private handleStartInterview = async () => {\r\n if (this.resumeType === 'upload' && !this.uploadedFileInfo) {\r\n Message.info('请上传简历');\r\n return;\r\n }\r\n\r\n // 判断文件是否正在上传\r\n if (this.resumeType === 'upload' && await this.pcmUploadRef?.getIsUploading?.()) {\r\n Message.info('文件上传中,请稍后');\r\n return;\r\n }\r\n\r\n this.isSubmitting = true;\r\n this.showChatModal = true;\r\n this.isSubmitting = false;\r\n };\r\n private closeResumeChat = () => {\r\n this.isSuccess = false;\r\n this.resumeType = 'upload';\r\n };\r\n render() {\r\n if (!this.isOpen) return null;\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'pc-layout': !this.isSuccess,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n // 判断是否隐藏简历上传区域\r\n const hideResumeUpload = Boolean(this.customInputs && this.customInputs.file_url);\r\n\r\n // 判断是否同时提供了file_url和job_info\r\n const hasFileAndJob = Boolean(this.customInputs?.file_url && this.customInputs?.job_info);\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && !this.showChatModal && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 上传界面 - 仅在不显示聊天模态框且没有会话ID且没有同时提供file_url和job_info时显示 */}\r\n {!this.showChatModal && !this.conversationId && !hasFileAndJob && !this.showIframe && (\r\n <div class=\"input-container\">\r\n <div class=\"resume-type-container\">\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'chat',\r\n }}\r\n onClick={() => this.changeType('chat')}\r\n >\r\n 直接开始\r\n </div>\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'upload',\r\n }}\r\n onClick={() => this.changeType('upload')}\r\n >\r\n 上传简历\r\n </div>\r\n </div>\r\n\r\n {/* 简历上传区域 - 仅在没有customInputs.file_url时显示 */}\r\n {!hideResumeUpload && this.resumeType === 'upload' && (\r\n <div class=\"resume-upload-section\">\r\n <label>上传简历</label>\r\n <components-mobile-upload-btn\r\n maxFileSize={15 * 1024 * 1024}\r\n multiple={false}\r\n uploadAreaMode={true}\r\n acceptFileSuffixList={['.txt', '.md', '.pdf', '.docx', '.doc']}\r\n uploadParams={{\r\n tags: ['resume'],\r\n }}\r\n onOk={(e) => {\r\n const result: FileUploadResponse[] = e.detail ?? [];\r\n this.uploadedFileInfo = result[0];\r\n this.uploadSuccess.emit(this.uploadedFileInfo);\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.resumeType === 'chat' && (\r\n <div class=\"jd-input-section\">\r\n <label htmlFor=\"job-description\">从头开始创建</label>\r\n <div class=\"chat-content\">\r\n <div class=\"chat-content-text\">🤖无需复杂操作,只需回答AI的几个简单问题,系统会根据你的回答自动生成内容完整、格式专业的个人简历</div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n class=\"submit-button\"\r\n disabled={\r\n (this.resumeType === 'upload' && !hideResumeUpload && !this.uploadedFileInfo) ||\r\n this.isUploading ||\r\n this.isSubmitting\r\n }\r\n onClick={this.handleStartInterview}\r\n >\r\n {this.isUploading ? '上传中...' : this.isSubmitting ? '处理中...' : this.resumeType === 'upload' ? '开始制作' : '开始对话'}\r\n </button>\r\n\r\n <div class=\"ai-disclaimer\">\r\n <p>所有内容均由AI生成仅供参考</p>\r\n <p class=\"beian-info\">\r\n <span>中央网信办生成式人工智能服务备案号</span>:\r\n <a href=\"https://www.pincaimao.com\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n Hunan-PinCaiMao-202412310003\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 聊天界面 - 在显示聊天模态框时显示 */}\r\n {this.showChatModal && (\r\n <>\r\n <div\r\n style={{\r\n display: this.resumeType === 'chat' ? 'block' : 'none',\r\n }}\r\n >\r\n <pcm-app-chat-modal\r\n isOpen={true}\r\n modalTitle={this.modalTitle}\r\n icon={this.icon}\r\n isShowHeader={this.isShowHeader}\r\n isNeedClose={this.isNeedClose}\r\n fullscreen={this.fullscreen}\r\n showWorkspaceHistory={false}\r\n botId=\"39284520284983296\"\r\n conversationId={this.conversationId}\r\n defaultQuery={this.defaultQuery}\r\n filePreviewMode={this.filePreviewMode}\r\n customInputs={{\r\n ...this.customInputs,\r\n file_url: this.resumeType === 'upload' ? this.customInputs.file_url || this.uploadedFileInfo?.cos_key : '',\r\n mode_type: this.resumeType === 'chat' ? 1 : 0,\r\n }}\r\n interviewMode=\"text\"\r\n closeResume={this.closeResumeChat}\r\n onStreamComplete={this.handleStreamComplete}\r\n ></pcm-app-chat-modal>\r\n </div>\r\n {/* 如果不是对话模式,则展示加载中。完成之后跳转 */}\r\n {this.resumeType !== 'chat' && !this.showIframe && (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p class=\"loading-text\">AI正在优化您的简历...</p>\r\n </div>\r\n )}\r\n {this.showIframe && (\r\n <>\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n {/*\r\n 1. 不再通过 URL 传递 token,避免泄露。\r\n 2. 通过 ref 获取 iframe 元素,onLoad 时 postMessage 发送 token。\r\n */}\r\n <div class=\"iframe-container\">\r\n <iframe\r\n ref={el => (this._iframeEl = el as HTMLIFrameElement)}\r\n src={`${PCM_DOMAIN}/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n // src={`http://localhost:3000/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n frameborder=\"0\"\r\n onLoad={this.handleIframeLoad}\r\n ></iframe>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
.resume-type-container {
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: row;
|
|
4
|
-
|
|
4
|
+
flex-wrap: nowrap;
|
|
5
|
+
justify-content: space-evenly;
|
|
6
|
+
gap: 0;
|
|
5
7
|
margin-bottom: 16px;
|
|
6
8
|
border-bottom: 2px solid #f0f0f0;
|
|
7
|
-
padding-left:
|
|
9
|
+
padding-left: 0;
|
|
10
|
+
overflow-x: auto;
|
|
11
|
+
overflow-y: hidden;
|
|
8
12
|
}
|
|
9
13
|
|
|
10
14
|
.resume-type-item {
|
|
@@ -17,6 +21,8 @@
|
|
|
17
21
|
border: none;
|
|
18
22
|
outline: none;
|
|
19
23
|
font-weight: 400;
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
flex-shrink: 0;
|
|
20
26
|
transition: color 0.2s;
|
|
21
27
|
}
|
|
22
28
|
|
|
@@ -87,6 +87,14 @@ export class JlzzModal {
|
|
|
87
87
|
* 获取简历数据事件(用户点击导出简历json数据后触发)
|
|
88
88
|
*/
|
|
89
89
|
getResumeData;
|
|
90
|
+
/**
|
|
91
|
+
* 简历下载请求事件。
|
|
92
|
+
* 触发时机:简历制作页面 运行在微信小程序 web-view 的 SDK iframe 中,
|
|
93
|
+
* 用户在移动端下载弹窗点击“直接下载”时触发;普通网页环境仍由 简历制作页面 自行下载,不触发此事件。
|
|
94
|
+
* iframe 只提供下载地址和文件名,具体跳转到哪个小程序页面及如何处理下载,
|
|
95
|
+
* 由 SDK 接入方通过 onResumeDownloadRequested 回调自行决定。
|
|
96
|
+
*/
|
|
97
|
+
resumeDownloadRequested;
|
|
90
98
|
/**
|
|
91
99
|
* 附件预览模式
|
|
92
100
|
* 'drawer': 在右侧抽屉中预览
|
|
@@ -243,10 +251,22 @@ export class JlzzModal {
|
|
|
243
251
|
const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];
|
|
244
252
|
if (!allowedOrigins.includes(event.origin))
|
|
245
253
|
return;
|
|
254
|
+
// 只接受当前简历 iframe 发出的消息,避免页面内其他窗口误触发 SDK 事件。
|
|
255
|
+
if (event.source !== this._iframeEl?.contentWindow)
|
|
256
|
+
return;
|
|
246
257
|
const { type, value } = event.data || {};
|
|
247
258
|
if (type === 'callParentMethod') {
|
|
248
259
|
this.exampleMethodFromIframe(value);
|
|
249
260
|
}
|
|
261
|
+
if (type === 'resumeDownloadRequested') {
|
|
262
|
+
// SDK 仅透传下载信息,不耦合任何宿主小程序路由。
|
|
263
|
+
if (!value?.url || !value?.fileName)
|
|
264
|
+
return;
|
|
265
|
+
this.resumeDownloadRequested.emit({
|
|
266
|
+
url: value.url,
|
|
267
|
+
fileName: value.fileName,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
250
270
|
// 关键:收到 iframeReady 后再发送 token
|
|
251
271
|
if (type === 'iframeReady' && this._iframeEl?.contentWindow) {
|
|
252
272
|
// 动态获取 targetOrigin,兼容本地和线上
|
|
@@ -1012,6 +1032,21 @@ export class JlzzModal {
|
|
|
1012
1032
|
"resolved": "any",
|
|
1013
1033
|
"references": {}
|
|
1014
1034
|
}
|
|
1035
|
+
}, {
|
|
1036
|
+
"method": "resumeDownloadRequested",
|
|
1037
|
+
"name": "resumeDownloadRequested",
|
|
1038
|
+
"bubbles": true,
|
|
1039
|
+
"cancelable": true,
|
|
1040
|
+
"composed": true,
|
|
1041
|
+
"docs": {
|
|
1042
|
+
"tags": [],
|
|
1043
|
+
"text": "\u7B80\u5386\u4E0B\u8F7D\u8BF7\u6C42\u4E8B\u4EF6\u3002\r\n\u89E6\u53D1\u65F6\u673A\uFF1A\u7B80\u5386\u5236\u4F5C\u9875\u9762 \u8FD0\u884C\u5728\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F web-view \u7684 SDK iframe \u4E2D\uFF0C\r\n\u7528\u6237\u5728\u79FB\u52A8\u7AEF\u4E0B\u8F7D\u5F39\u7A97\u70B9\u51FB\u201C\u76F4\u63A5\u4E0B\u8F7D\u201D\u65F6\u89E6\u53D1\uFF1B\u666E\u901A\u7F51\u9875\u73AF\u5883\u4ECD\u7531 \u7B80\u5386\u5236\u4F5C\u9875\u9762 \u81EA\u884C\u4E0B\u8F7D\uFF0C\u4E0D\u89E6\u53D1\u6B64\u4E8B\u4EF6\u3002\r\niframe \u53EA\u63D0\u4F9B\u4E0B\u8F7D\u5730\u5740\u548C\u6587\u4EF6\u540D\uFF0C\u5177\u4F53\u8DF3\u8F6C\u5230\u54EA\u4E2A\u5C0F\u7A0B\u5E8F\u9875\u9762\u53CA\u5982\u4F55\u5904\u7406\u4E0B\u8F7D\uFF0C\r\n\u7531 SDK \u63A5\u5165\u65B9\u901A\u8FC7 onResumeDownloadRequested \u56DE\u8C03\u81EA\u884C\u51B3\u5B9A\u3002"
|
|
1044
|
+
},
|
|
1045
|
+
"complexType": {
|
|
1046
|
+
"original": "{\r\n url: string;\r\n fileName: string;\r\n }",
|
|
1047
|
+
"resolved": "{ url: string; fileName: string; }",
|
|
1048
|
+
"references": {}
|
|
1049
|
+
}
|
|
1015
1050
|
}];
|
|
1016
1051
|
}
|
|
1017
1052
|
static get elementRef() { return "hostElement"; }
|