diff --git a/components.d.ts b/components.d.ts index 4450b2e22e73d2fece581fa18037cc6bc6ad828d..72f3d77040fa5ecfd7424d379953ec4d42c68f3f 100644 --- a/components.d.ts +++ b/components.d.ts @@ -17,6 +17,8 @@ declare module 'vue' { CookieNotice: typeof import('./src/components/CookieNotice.vue')['default'] DocAnchor: typeof import('./src/components/DocAnchor.vue')['default'] ElCard: typeof import('element-plus/es')['ElCard'] + ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] + ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] ElCollapse: typeof import('element-plus/es')['ElCollapse'] ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] ElDialog: typeof import('element-plus/es')['ElDialog'] @@ -29,6 +31,7 @@ declare module 'vue' { ElInput: typeof import('element-plus/es')['ElInput'] ElOption: typeof import('element-plus/es')['ElOption'] ElPagination: typeof import('element-plus/es')['ElPagination'] + ElPopover: typeof import('element-plus/es')['ElPopover'] ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] @@ -37,6 +40,9 @@ declare module 'vue' { ElTabPane: typeof import('element-plus/es')['ElTabPane'] ElTabs: typeof import('element-plus/es')['ElTabs'] ElTree: typeof import('element-plus/es')['ElTree'] + FeedbackSlider: typeof import('./src/components/feedback/FeedbackSlider.vue')['default'] + FloatingButton: typeof import('./src/components/FloatingButton.vue')['default'] + FloatingButtonHome: typeof import('./src/components/feedback/FloatingButtonHome.vue')['default'] IconClose: typeof import('./src/components/IconClose.vue')['default'] ONav: typeof import('./src/components/ONav.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] diff --git a/opendesign/button/src/button.tsx b/opendesign/button/src/button.tsx index 116b113634e9c4d8da7aa149b1f0b4d0ebc15705..b019f48682e7abb094f9873f54a4497bdec76484 100644 --- a/opendesign/button/src/button.tsx +++ b/opendesign/button/src/button.tsx @@ -22,6 +22,7 @@ export default defineComponent({ })); const onClick = (e: MouseEvent) => { + if (disabled.value) return; emit('click', e); }; diff --git a/opendesign/style/_color.scss b/opendesign/style/_color.scss index 924c296729df675cb164de372b20bbacaf098f4a..cb915476db44c07fa834b6996aff7849797012ef 100644 --- a/opendesign/style/_color.scss +++ b/opendesign/style/_color.scss @@ -178,4 +178,13 @@ --o-color-fill5: var( --o-color-white ); // SL5 弹出阴影容器背景,应用于模态弹窗投影 + + --o-radius-xs: 4px; + --o-shadow-2: 0 4px 24px rgba(0, 0, 0, 0.1); + --o-duration-m1: 250ms; + --o-easing-standard-in: cubic-bezier(0, 0, 0, 1); + --o-font_size-h1: 32px; + --o-font_size-tip1: 14px; + --o-font_size-tip2: 12px; + --o-color-control4-light: rgb(var(--o-gray-3)); } diff --git a/package.json b/package.json index 5d0b77aeb8555ad787160218025ca4db3d170f9f..9656f78c44c38391bc5c6cf7b2b561e2a08e855f 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,8 @@ "dependencies": { "@kangc/v-md-editor": "^2.3.18", "@opensig/open-analytics": "^0.0.9", + "@opensig/opendesign": "0.0.68", + "@vueuse/core": "9.12.0", "axios": "1.8.2", "element-plus": "^2.3.4", "js-base64": "^3.7.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb4b3650c555071a982edd3f218e8fcf9bcab8e0..2933810f1d03c065b43be8d1f1991f05ccfa168c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,12 @@ importers: '@opensig/open-analytics': specifier: ^0.0.9 version: 0.0.9 + '@opensig/opendesign': + specifier: 0.0.68 + version: 0.0.68(vue@3.3.4) + '@vueuse/core': + specifier: 9.12.0 + version: 9.12.0(vue@3.3.4) axios: specifier: 1.8.2 version: 1.8.2 @@ -115,7 +121,7 @@ importers: version: 4.9.5 unplugin-auto-import: specifier: ^0.11.5 - version: 0.11.5(@vueuse/core@9.13.0(vue@3.3.4))(rollup@2.79.1) + version: 0.11.5(@vueuse/core@9.12.0(vue@3.3.4))(rollup@2.79.1) unplugin-element-plus: specifier: ^0.4.1 version: 0.4.1(esbuild@0.21.5)(rollup@2.79.1)(vite@3.2.6(@types/node@18.16.19)(sass@1.62.1)) @@ -632,6 +638,11 @@ packages: '@opensig/open-analytics@0.0.9': resolution: {integrity: sha512-D+4VWxgBc1ABsQjWEjWfBfoBQ4PQbc1lNZeEYpQXkTJLLFcj6nSa+LwcYZFXtZdGz9dzOhhbwRwXv66WFw2qJw==} + '@opensig/opendesign@0.0.68': + resolution: {integrity: sha512-eWiZTVWEGSsM/BuWWNJKFiYl6NnGVONjKlIYT7ja6BMd0aLfIBKV4ElhfYrnT21lzygnFbLW5ompRPdT24t2tQ==} + peerDependencies: + vue: ^3.1.0 + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1032,14 +1043,14 @@ packages: '@vuepress/shared-utils@1.9.10': resolution: {integrity: sha512-M9A3DocPih+V8dKK2Zg9FJQ/f3JZrYsdaM/vQ9F48l8bPlzxw5NvqXIYMK4kKcGEyerQNTWCudoCpLL5uiU0hg==} - '@vueuse/core@9.13.0': - resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + '@vueuse/core@9.12.0': + resolution: {integrity: sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==} - '@vueuse/metadata@9.13.0': - resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + '@vueuse/metadata@9.12.0': + resolution: {integrity: sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==} - '@vueuse/shared@9.13.0': - resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + '@vueuse/shared@9.12.0': + resolution: {integrity: sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1488,6 +1499,10 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dayjs@1.11.7: resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} @@ -4042,6 +4057,11 @@ snapshots: uuid: 10.0.0 web-vitals: 4.2.4 + '@opensig/opendesign@0.0.68(vue@3.3.4)': + dependencies: + date-fns: 2.30.0 + vue: 3.3.4 + '@pkgjs/parseargs@0.11.0': optional: true @@ -4506,19 +4526,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@vueuse/core@9.13.0(vue@3.3.4)': + '@vueuse/core@9.12.0(vue@3.3.4)': dependencies: '@types/web-bluetooth': 0.0.16 - '@vueuse/metadata': 9.13.0 - '@vueuse/shared': 9.13.0(vue@3.3.4) + '@vueuse/metadata': 9.12.0 + '@vueuse/shared': 9.12.0(vue@3.3.4) vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/metadata@9.13.0': {} + '@vueuse/metadata@9.12.0': {} - '@vueuse/shared@9.13.0(vue@3.3.4)': + '@vueuse/shared@9.12.0(vue@3.3.4)': dependencies: vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: @@ -4984,6 +5004,10 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.24.6 + dayjs@1.11.7: {} debug@2.6.9: @@ -5061,7 +5085,7 @@ snapshots: '@popperjs/core': '@sxzz/popperjs-es@2.11.7' '@types/lodash': 4.14.194 '@types/lodash-es': 4.17.7 - '@vueuse/core': 9.13.0(vue@3.3.4) + '@vueuse/core': 9.12.0(vue@3.3.4) async-validator: 4.2.5 dayjs: 1.11.7 escape-html: 1.0.3 @@ -6781,7 +6805,7 @@ snapshots: universalify@0.2.0: {} - unplugin-auto-import@0.11.5(@vueuse/core@9.13.0(vue@3.3.4))(rollup@2.79.1): + unplugin-auto-import@0.11.5(@vueuse/core@9.12.0(vue@3.3.4))(rollup@2.79.1): dependencies: '@antfu/utils': 0.7.2 '@rollup/pluginutils': 5.0.2(rollup@2.79.1) @@ -6790,7 +6814,7 @@ snapshots: unimport: 1.3.0(rollup@2.79.1) unplugin: 1.3.1 optionalDependencies: - '@vueuse/core': 9.13.0(vue@3.3.4) + '@vueuse/core': 9.12.0(vue@3.3.4) transitivePeerDependencies: - rollup diff --git a/src/App.vue b/src/App.vue index 9711bfe8d34392d018d7c032e22faebd7e8d40cc..03560dd58111b7608cbeed56f0df40d344d7a8e9 100644 --- a/src/App.vue +++ b/src/App.vue @@ -11,6 +11,7 @@ import AppFooter from '@/components/AppFooter.vue'; import { refreshInfo } from '@/shared/login'; import CookieNotice from './components/CookieNotice.vue'; +import FloatingButton from '@/components/FloatingButton.vue'; refreshInfo(); const { locale } = useI18n(); @@ -34,6 +35,7 @@ watch(
+ + diff --git a/src/components/feedback/FeedbackSlider.vue b/src/components/feedback/FeedbackSlider.vue new file mode 100644 index 0000000000000000000000000000000000000000..9dd57a1db200a7a11b941ffcf80181daf59dfb6b --- /dev/null +++ b/src/components/feedback/FeedbackSlider.vue @@ -0,0 +1,451 @@ + + + diff --git a/src/components/feedback/FloatingButtonHome.vue b/src/components/feedback/FloatingButtonHome.vue new file mode 100644 index 0000000000000000000000000000000000000000..f0d2c360859cf0ba6b96d5ddad3daed0fd4e9dbf --- /dev/null +++ b/src/components/feedback/FloatingButtonHome.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/src/config/index.ts b/src/config/index.ts index df6856d1e8682ece6fc9631f97f7b398738360c5..bf6db21aeb06f73dc3414b6836c78aa348f07e49 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -117,3 +117,5 @@ export const linksData2 = { export const defaultIssueRepo = 'openeuler/community-issue'; export const giteeUrl = 'https://gitee.com'; + +export const SERVICE_FORUM_URL = 'https://forum.openeuler.org' diff --git a/src/i18n/feedback/feedback-en.ts b/src/i18n/feedback/feedback-en.ts new file mode 100644 index 0000000000000000000000000000000000000000..27a9c63cec02c4fdedda9feba6effe384cd1ba9b --- /dev/null +++ b/src/i18n/feedback/feedback-en.ts @@ -0,0 +1,46 @@ +export default { + title1: 'Are you satisfied with', + title2: ' openEuler Community ', + title3: '', + grade1: '0: Unsatisfied', + grade2: '10: Very satisfied', + placeholder1: 'Please tell us why you are not satisfied with openEuler Docs.', + placeholder2: 'What improvements would you like to see with openEuler Docs?', + placeholder3: 'Please tell us what you like about openEuler Docs.', + more1: 'Thanks for your feedback.', + submit: 'Submit', + cancel: 'Cancel', + recommendTip1: 'Please tell us why you are not satisfied with openEuler Docs.', + recommendTip2: 'What improvements would you like to see with openEuler Docs?', + recommendTip3: 'Please tell us why you recommend openEuler Docs.', + submitBusy: 'Too many submissions. Try again later.', + feedbackFailed: 'Feedback failed.', + issueBack: 'Report an Issue', + issueBackDecs: 'Quickly get support from the technical team.', + + bugCatching: 'Bug', + bugCatchingTitle: 'Bug Catching', + bugContentTitle: 'Buggy Content', + bugContentPlaceholder: 'Copy and paste the buggy document content here.', + bugDescription: 'Bug Description', + submitAs: 'Submit As', + bugType: 'Bug Type', + bugDescriptionPlaceholder: 'Describe the bug so that we can quickly locate the problem.', + bugPostPrivacyPolicy: 'By submitting your content, you fully understand and agree to the openEuler', + privacyPolicy: 'Privacy Policy', + input: 'Enter here.', + + wantSubmitMark: 'Rate Now', + confirmTitle: 'Confirm', + rating: 'Rating', + feedbackSuccess: 'Submission successful. Thank you for your feedback!', + feedbackSubmitFailed: 'Submission failed. Please refresh the page and try again.', + moreInfo: 'We appreciate your feedback. For assistance, ', + moreInfo2: 'post your query', + moreInfo3: ' in the forum.', + + forum: 'Forum', + forumHelp: 'Get Help in the Forum', + forumTip: 'Collaborate to resolve issues.', + quickIssueTip: 'Quickly submit or track community issues.', +}; diff --git a/src/i18n/feedback/feedback-zh.ts b/src/i18n/feedback/feedback-zh.ts new file mode 100644 index 0000000000000000000000000000000000000000..1d7177cea6ceab21b66650f0e765eba26177ae9f --- /dev/null +++ b/src/i18n/feedback/feedback-zh.ts @@ -0,0 +1,46 @@ +export default { + title1: '您对', + title2: ' 社区板块 ', + title3: '的整体满意度如何?', + grade1: '0-不满意', + grade2: '10-非常满意', + placeholder1: '请输入您不太满意的原因', + placeholder2: '改进哪些方面会让您更满意?', + placeholder3: '请输入您满意的原因', + more1: '感谢您的反馈', + submit: '提交', + cancel: '取消', + recommendTip1: '请输入您不太推荐的原因', + recommendTip2: '改进哪些方面会让您更愿意推荐?', + recommendTip3: '请输入您推荐的原因', + submitBusy: '您的提交过于频繁,请稍后再试', + feedbackFailed: '反馈失败', + issueBack: '问题反馈', + issueBackDecs: '获得技术团队的快速支持', + + bugCatching: '文档捉虫', + bugCatchingTitle: '文档捉虫', + bugContentTitle: '“有虫”文档片段', + bugContentPlaceholder: '点击输入将“有虫”文档复制、粘贴到此处', + bugDescription: '问题描述', + submitAs: '提交类型', + bugType: '问题类型', + bugDescriptionPlaceholder: '点击输入详细问题描述,以帮助我们快速定位问题', + bugPostPrivacyPolicy: '您理解并同意,您填写并提交的内容,即视为您已充分阅读并同意openEuler的', + privacyPolicy: '《隐私政策》', + input: '请输入', + + wantSubmitMark: '我要评分', + confirmTitle: '确定', + rating: '评分', + feedbackSuccess: '提交成功,感谢您的反馈!', + feedbackSubmitFailed: '提交失败,请刷新页面后重新提交!', + moreInfo: '感谢您的反馈,如需帮助,可论坛', + moreInfo2: '发帖求助', + moreInfo3: '', + + forum: '论坛', + forumHelp: '论坛求助', + forumTip: '发帖互助解决各类问题', + quickIssueTip: '快捷提交/查询社区Issues', +}; diff --git a/src/i18n/feedback/index.ts b/src/i18n/feedback/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..74a8767a27d3d815cf4a1569c2cadee832777e08 --- /dev/null +++ b/src/i18n/feedback/index.ts @@ -0,0 +1,7 @@ +import en from './feedback-en'; +import zh from './feedback-zh'; + +export default { + en, + zh, +}; diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 3d99b4af9837997e869d4e031e26bf0247d6ba44..a5e7b312b8334148092f9576c5398a3772f629f1 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -5,6 +5,7 @@ import sig from './sig'; import common from './common'; import quickIssue from './quick-issue'; import cookie from './cookie'; +import feedback from './feedback'; const messages = { zh: { @@ -12,12 +13,14 @@ const messages = { sig: sig.zh, quickIssue: quickIssue.zh, cookie: cookie.zh, + feedback: feedback.zh, }, en: { common: common.en, sig: sig.en, quickIssue: quickIssue.en, cookie: cookie.en, + feedback: feedback.en, }, }; diff --git a/src/main.ts b/src/main.ts index 927292315e3493b635b2e4e6f225e914cd50b7dd..1f0d5b3b753fd235fcf4dc3292a1c4a2bf419b7a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,6 +4,7 @@ import { router } from './routers'; import i18n from './i18n'; import '@/shared/styles/index.scss'; +import '@opensig/opendesign/es/index.css'; import VueMarkdownEditor from '@kangc/v-md-editor'; import '@kangc/v-md-editor/lib/style/base-editor.css'; diff --git a/src/shared/styles/mixin.scss b/src/shared/styles/mixin.scss new file mode 100644 index 0000000000000000000000000000000000000000..9944249d257fd0fca292ee1b4174c909c2c19ad1 --- /dev/null +++ b/src/shared/styles/mixin.scss @@ -0,0 +1,123 @@ +// 一级标题 +@mixin h1 { + font-size: 32px; + line-height: 44px; +} + +// 二级标题 +@mixin h2 { + font-size: 28px; + line-height: 40px; +} + +// 三级标题 +@mixin h3 { + font-size: 24px; + line-height: 32px; +} +// 四级标题 +@mixin h4 { + font-size: 20px; + line-height: 28px; + font-weight: 500; +} + +// 正文 +@mixin text1 { + font-size: 16px; + line-height: 24px; +} + +// 小标题 +@mixin text2 { + font-size: 14px; + line-height: 20px; +} +// 小小标题 +@mixin text2 { + font-size: 12px; + line-height: 18px; +} +@mixin tip1 { + font-size: 14px; + line-height: 22px; +} + +// 提示文本2 +@mixin tip2 { + font-size: 12px; + line-height: 18px; +} +// 断点定义 +$breakpoints: ( + // phone + 'phone': (0, 600px), + '>phone': 601px, + // pad + 'pad': (601px, 1200px), + '<=pad': (0, 1200px), + '>pad': 1201px, + // pad-v + 'pad_v': (601px, 840px), + '<=pad_v': (0, 840px), + '>pad_v': 841px, + // pad-h + 'pad_h': (841px, 1200px), + // laptop + 'laptop': (1201px, 1440px), + '<=laptop': (0, 1440px), + '>laptop': 1441px, + 'pad-laptop': (601px, 1440px), + 'pad_v-laptop': (841px, 1440px) +); + +@mixin respond-to($breakname) { + $bp: map-get($breakpoints, $breakname); + @if type-of($bp) == 'list' { + $min: nth($bp, 1); + $max: nth($bp, 2); + @if $min == 0 { + @media (max-width: $max) { + @content; + } + } @else { + @media (min-width: $min) and (max-width: $max) { + @content; + } + } + } @else { + @media (min-width: $bp) { + @content; + } + } +} + +@mixin hoverable($hover: hover) { + @media (hover: $hover) { + @content; + } +} + +@mixin hover() { + @media (hover: hover) { + &:hover { + @content; + } + } +} + +@mixin me-hover() { + @content; + @media (hover: hover) { + &:hover { + @content; + } + } +} + +@mixin x-hover() { + transition: all var(--o-duration-m1) var(--o-easing-standard-in); + @include hover { + transform: rotate(180deg); + } +} diff --git a/src/shared/utils.ts b/src/shared/utils.ts index 6bd6ca9b1d32acfb20cac51afc990c952da34828..85db34340772f99e2c2a3f9d77f5bc480565371b 100644 --- a/src/shared/utils.ts +++ b/src/shared/utils.ts @@ -8,11 +8,13 @@ export function isValidKey( return Object.prototype.hasOwnProperty.call(object, key); } -export function scrollToTop() { - document.body.scrollTop = 0; - document.documentElement.scrollTop = 0; -} - +export const scrollToTop = (top: number = 0, smooth: boolean = true) => { + const dom = document.querySelector('#app > .o-scroller > .o-scroller-container'); + dom?.scrollTo({ + top, + behavior: smooth ? 'smooth' : 'auto', + }); +}; /** * 获取指定时区偏移量的年份 * @param {number} offset - 时区偏移量(单位:小时)。例如,UTC+8 时区,传入 8。 diff --git a/vite.config.ts b/vite.config.ts index bd18e76370dcd8141f81aefc62b469843b582c53..4aba5d69c3cbd7e70dbcee0fedd65c1ae997e878 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -42,7 +42,10 @@ export default defineConfig({ css: { preprocessorOptions: { scss: { - additionalData: `@use "@/shared/styles/element-plus/index.scss" as *;`, + additionalData: ` + @use "@/shared/styles/element-plus/index.scss" as *; + @use "@/shared/styles/mixin.scss" as *; + `, }, }, }, @@ -72,7 +75,7 @@ export default defineConfig({ 'X-Forwarded-For': '$http_x_real_ip', }, rewrite(path) { - return path.replace(/^\/api-issues/, ''); + return path.replace(/^\/api-dsapi/, ''); }, }, '/api-omapi/': { @@ -82,7 +85,7 @@ export default defineConfig({ 'X-Forwarded-For': '$http_x_real_ip', }, rewrite(path) { - return path.replace(/^\/api-issues/, ''); + return path.replace(/^\/api-omapi/, ''); }, }, '/api-issues/': {