FilePath.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <template>
  2. <span class="inline-flex justify-start items-baseline">
  3. <span :class="pathClass" class="ui-path" v-on="$listeners">
  4. <!-- Keep tags tight to prevent whitespace between segments -->
  5. <span v-for="(segment, index) in segments" :key="`segment-${index}`"
  6. >{{ segment }}/<wbr /></span
  7. ><span
  8. v-for="(fileSegment, index) in fileSegments"
  9. :key="`file-${index}`"
  10. :class="index === 0 ? 'font-semibold' : ''"
  11. >{{ index > 0 ? '.' : '' }}{{ fileSegment }}</span
  12. ><span v-if="lineNumber">:{{ lineNumber }}</span>
  13. </span>
  14. <slot></slot>
  15. <a
  16. v-if="editable && editorUrl"
  17. :href="editorUrl"
  18. class="ml-2 inline-block text-sm text-purple-400 hover:text-purple-500"
  19. ><Icon name="pencil" />
  20. </a>
  21. </span>
  22. </template>
  23. <script>
  24. import editorUrl from './editorUrl';
  25. export default {
  26. props: {
  27. file: { required: true },
  28. editable: { default: false },
  29. relative: { default: true },
  30. lineNumber: { required: false },
  31. pathClass: { default: '' },
  32. },
  33. data() {
  34. return {
  35. segments: [],
  36. filename: '',
  37. fileSegments: [],
  38. };
  39. },
  40. inject: ['config', 'report'],
  41. watch: {
  42. file: {
  43. immediate: true,
  44. handler() {
  45. this.segments = this.path.replace(/^\/Users/, '~').split('/');
  46. this.filename = this.segments.pop() || '';
  47. this.fileSegments = this.filename.split('.');
  48. },
  49. },
  50. },
  51. computed: {
  52. path() {
  53. return this.relative
  54. ? this.file.replace(this.report.application_path + '/', '')
  55. : this.file;
  56. },
  57. editorUrl() {
  58. return editorUrl(this.config, this.file, this.lineNumber);
  59. },
  60. },
  61. };
  62. </script>