主要功能: - 修改RequirementModal支持12个订单班选择 - 添加OrderClassIconMap图标映射组件 - Store中添加selectedOrderClass状态管理 - WorkflowPage支持传递orderClass参数 - web_result添加URL参数切换功能 - 创建order-class-handler.js动态处理页面主题 技术改进: - 创建软链接关联订单班数据目录 - 生成wenlu.json和food.json数据结构 - 删除重复的web_result目录 - 添加测试页面test-order-class.html 影响范围: - 展会策划系统现支持12个订单班 - 结果展示页面自动适配不同订单班主题 - 用户可选择不同行业生成对应方案 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
161 lines
3.8 KiB
JavaScript
161 lines
3.8 KiB
JavaScript
(function () {
|
|
|
|
if (typeof Prism === 'undefined' || typeof document === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
if (!Prism.plugins.toolbar) {
|
|
console.warn('Copy to Clipboard plugin loaded before Toolbar plugin.');
|
|
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* When the given elements is clicked by the user, the given text will be copied to clipboard.
|
|
*
|
|
* @param {HTMLElement} element
|
|
* @param {CopyInfo} copyInfo
|
|
*
|
|
* @typedef CopyInfo
|
|
* @property {() => string} getText
|
|
* @property {() => void} success
|
|
* @property {(reason: unknown) => void} error
|
|
*/
|
|
function registerClipboard(element, copyInfo) {
|
|
element.addEventListener('click', function () {
|
|
copyTextToClipboard(copyInfo);
|
|
});
|
|
}
|
|
|
|
// https://stackoverflow.com/a/30810322/7595472
|
|
|
|
/** @param {CopyInfo} copyInfo */
|
|
function fallbackCopyTextToClipboard(copyInfo) {
|
|
var textArea = document.createElement('textarea');
|
|
textArea.value = copyInfo.getText();
|
|
|
|
// Avoid scrolling to bottom
|
|
textArea.style.top = '0';
|
|
textArea.style.left = '0';
|
|
textArea.style.position = 'fixed';
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
var successful = document.execCommand('copy');
|
|
setTimeout(function () {
|
|
if (successful) {
|
|
copyInfo.success();
|
|
} else {
|
|
copyInfo.error();
|
|
}
|
|
}, 1);
|
|
} catch (err) {
|
|
setTimeout(function () {
|
|
copyInfo.error(err);
|
|
}, 1);
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
/** @param {CopyInfo} copyInfo */
|
|
function copyTextToClipboard(copyInfo) {
|
|
if (navigator.clipboard) {
|
|
navigator.clipboard.writeText(copyInfo.getText()).then(copyInfo.success, function () {
|
|
// try the fallback in case `writeText` didn't work
|
|
fallbackCopyTextToClipboard(copyInfo);
|
|
});
|
|
} else {
|
|
fallbackCopyTextToClipboard(copyInfo);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Selects the text content of the given element.
|
|
*
|
|
* @param {Element} element
|
|
*/
|
|
function selectElementText(element) {
|
|
// https://stackoverflow.com/a/20079910/7595472
|
|
window.getSelection().selectAllChildren(element);
|
|
}
|
|
|
|
/**
|
|
* Traverses up the DOM tree to find data attributes that override the default plugin settings.
|
|
*
|
|
* @param {Element} startElement An element to start from.
|
|
* @returns {Settings} The plugin settings.
|
|
* @typedef {Record<"copy" | "copy-error" | "copy-success" | "copy-timeout", string | number>} Settings
|
|
*/
|
|
function getSettings(startElement) {
|
|
/** @type {Settings} */
|
|
var settings = {
|
|
'copy': 'Copy',
|
|
'copy-error': 'Press Ctrl+C to copy',
|
|
'copy-success': 'Copied!',
|
|
'copy-timeout': 5000
|
|
};
|
|
|
|
var prefix = 'data-prismjs-';
|
|
for (var key in settings) {
|
|
var attr = prefix + key;
|
|
var element = startElement;
|
|
while (element && !element.hasAttribute(attr)) {
|
|
element = element.parentElement;
|
|
}
|
|
if (element) {
|
|
settings[key] = element.getAttribute(attr);
|
|
}
|
|
}
|
|
return settings;
|
|
}
|
|
|
|
Prism.plugins.toolbar.registerButton('copy-to-clipboard', function (env) {
|
|
var element = env.element;
|
|
|
|
var settings = getSettings(element);
|
|
|
|
var linkCopy = document.createElement('button');
|
|
linkCopy.className = 'copy-to-clipboard-button';
|
|
linkCopy.setAttribute('type', 'button');
|
|
var linkSpan = document.createElement('span');
|
|
linkCopy.appendChild(linkSpan);
|
|
|
|
setState('copy');
|
|
|
|
registerClipboard(linkCopy, {
|
|
getText: function () {
|
|
return element.textContent;
|
|
},
|
|
success: function () {
|
|
setState('copy-success');
|
|
|
|
resetText();
|
|
},
|
|
error: function () {
|
|
setState('copy-error');
|
|
|
|
setTimeout(function () {
|
|
selectElementText(element);
|
|
}, 1);
|
|
|
|
resetText();
|
|
}
|
|
});
|
|
|
|
return linkCopy;
|
|
|
|
function resetText() {
|
|
setTimeout(function () { setState('copy'); }, settings['copy-timeout']);
|
|
}
|
|
|
|
/** @param {"copy" | "copy-error" | "copy-success"} state */
|
|
function setState(state) {
|
|
linkSpan.textContent = settings[state];
|
|
linkCopy.setAttribute('data-copy-state', state);
|
|
}
|
|
});
|
|
}());
|